Common Lisp程序中的哪些操作被认为是足够原始的,以便计算算法分析中的单个“步骤”?现代lisps的实施有多广泛?
当然,使用小整数的算术只算作一个步骤,但大数字呢?那么考虑reverse
和nreverse
之间的区别呢?具体来说,是nreverse
的{{1}} theta?那么所有的数组和序列操作呢?另外,宏如何计算 - 在分析复杂性时我应该如何考虑宏?
答案 0 :(得分:9)
bignum
s)的加法应为O(log n),其中n是整数中较大的一个。有许多不同的乘法算法;我不是该领域的专家,这可能是特定于实现的。reverse
和nreverse
都可以通过cdr-input-and-cons-output策略实现O(n)(reverse
; nreverse
通过交换指针同时实现cdring)。如果我正确地理解了不熟悉的术语“theta of”,那么是的。但请注意,CL标准不保证时间复杂性。eval
/ compile
,在这种情况下你必须考虑实现编译器的复杂性),因为它在编译时运行,一旦;只有扩展的代码很重要。