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)
当然,Racketcdr
函数要比这个C宏做更多的工作,比如检查它是否有一对car
和cdr
,因为配对存取器间接地将它指定为O(1)。若要使cdr
为O(n),您必须将其反转为butlast
,这与球拍文档不符
Rackets的母语Scheme有一个wherecar
和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)