Lisp cdr的时间分析

Lisp cdr的时间分析,lisp,racket,time-complexity,Lisp,Racket,Time Complexity,我无法找到cdr的时间复杂度分析。它是以恒定时间运行还是以线性时间运行?如果答案取决于lisp的实现,那么假设我使用的是Racket cdr在任何Lisp中都需要固定的时间。它只是查找cons单元格中的第二个成员。从C的角度考虑,lisp对只是一个struct,有两个字段,car和cdr。lisp函数car和cdr仅用于C访问每个字段 以下是一个关于: 注意联合体的这一部分: struct { struct Scheme_Object *car, *cdr; } pair_val;

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

cdr
在任何Lisp中都需要固定的时间。它只是查找
cons
单元格中的第二个成员。

从C的角度考虑,lisp对只是一个
struct
,有两个字段,
car
cdr
。lisp函数
car
cdr
仅用于C访问每个字段

以下是一个关于:

注意
联合体的这一部分:

      struct { struct Scheme_Object *car, *cdr; } pair_val;
你会发现:

#define SCHEME_CAR(obj)      (((Scheme_Simple_Object *)(obj))->u.pair_val.car)
#define SCHEME_CDR(obj)      (((Scheme_Simple_Object *)(obj))->u.pair_val.cdr)
当然,Racket
cdr
函数要比这个C宏做更多的工作,比如检查它是否有一对
car
cdr
,因为配对存取器间接地将它指定为O(1)。若要使
cdr
为O(n),您必须将其反转为
butlast
,这与球拍文档不符

Rackets的母语Scheme有一个where
car
cdr
对中字段的访问器,也间接地是O(1)

在中,一组方案具有相似的描述,唯一的区别是它们在规范中使用名称
cons
,而不是
pair
。(您标记了lisp)


不过,这并不是一个问题,因为
cons
/
对是由所有Lisp之母定义的一种基本数据类型,它的第一个实现是使用汇编指令检索名为的内容,而
car
/
cdr
中的字母a和d就是来自该术语

Clojure可能略有不同,但它接近于“接近常量”IIRC。这取决于您对Lisp的定义。我认为您可以得到一个合理的Lisp方言,而无需基于cons单元格。我的方言没有
car
cdr
,而是
first
rest
(但是
rest
不是常数时间,因为
列表
是类似于CL向量的一类对象)@6502:对于Lisp的学术/自制变体,它确实不需要常数时间。但在我检查过的实现中,它是一种语言,Lisp程序员倾向于依赖它。教科书在描述Lisp操作的复杂性时也隐式地假定了这一点。
#define SCHEME_CAR(obj)      (((Scheme_Simple_Object *)(obj))->u.pair_val.car)
#define SCHEME_CDR(obj)      (((Scheme_Simple_Object *)(obj))->u.pair_val.cdr)