首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cdr的时间分析

cdr的时间分析
EN

Stack Overflow用户
提问于 2013-09-09 13:45:12
回答 3查看 363关注 0票数 2

我无法找到cdr的时间复杂性分析。它是在恒定时间运行还是在线性时间运行?如果答案取决于lisp的实现,假设我使用的是球拍。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-09 15:24:41

从C的角度来看,lisp对只是一个struct,它有两个字段,carcdr。lisp函数的carcdr数量只是C访问每个字段。

下面是对scheme.h的一个窥探

代码语言:javascript
复制
typedef struct Scheme_Simple_Object
{
  Scheme_Inclhash_Object iso;

  union
    {
      struct { mzchar *string_val; intptr_t tag_val; } char_str_val;
      struct { char *string_val; intptr_t tag_val; } byte_str_val;
      struct { void *ptr1, *ptr2; } two_ptr_val;
      struct { int int1; int int2; } two_int_val;
      struct { void *ptr; int pint; } ptr_int_val;
      struct { void *ptr; intptr_t pint; } ptr_long_val;
      struct { struct Scheme_Object *car, *cdr; } pair_val;
      struct { mzshort len; mzshort *vec; } svector_val;
      struct { void *val; Scheme_Object *type; } cptr_val;
    } u;
} Scheme_Simple_Object;

注意union的这一部分

代码语言:javascript
复制
      struct { struct Scheme_Object *car, *cdr; } pair_val;

你可以找到scheme.h

代码语言:javascript
复制
#define SCHEME_CAR(obj)      (((Scheme_Simple_Object *)(obj))->u.pair_val.car)
#define SCHEME_CDR(obj)      (((Scheme_Simple_Object *)(obj))->u.pair_val.cdr)

当然,cdr函数将比这个C宏做更多的工作,比如检查它是否得到了一个pair?

票数 7
EN

Stack Overflow用户

发布于 2013-09-09 13:57:04

在任何Lisp中,cdr都会占用恒定的时间。它只是查找cons单元中的第二个成员。

票数 8
EN

Stack Overflow用户

发布于 2013-09-09 22:51:55

对的定义carcdr视为对访问器,因此间接地将它们指定为O(1)。要使O(n)用于cdr,您必须将其反转,使其成为butlast,这将不符合racket文档。

Rackets母语言Scheme有一个R6RS规范,其中carcdr访问pair中的字段,并间接地访问O(1)。

普通Lisp中,一个方案的菜肴有类似的描述,唯一的区别是他们在规范中使用的是cons而不是pair。(你的标签是lisp)

但是,这并不重要,因为cons/pairs是所有LISP之母约翰·麦卡锡的口吻定义的一种基本数据类型,而且它的第一个实现有程序集指令来检索名为来自内存位置的地址和递减的东西,car/cdr中的字母a和d就是从这个术语中提取出来的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18699675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档