有关Lisp程序算法分析的建议吗?

时间:2010-02-27 20:38:36

标签: algorithm lisp common-lisp

Common Lisp程序中的哪些操作被认为是足够原始的,以便计算算法分析中的单个“步骤”?现代lisps的实施有多广泛?

当然,使用小整数的算术只算作一个步骤,但大数字呢?那么考虑reversenreverse之间的区别呢?具体来说,是nreverse的{​​{1}} theta?那么所有的数组和序列操作呢?另外,宏如何计算 - 在分析复杂性时我应该如何考虑宏?

1 个答案:

答案 0 :(得分:9)

  • 不要试图找到统一的“单步”的底层,只要知道什么是O(1),什么不是。
  • “较大数字”(bignum s)的加法应为O(log n),其中n是整数中较大的一个。有许多不同的乘法算法;我不是该领域的专家,这可能是特定于实现的。
  • reversenreverse都可以通过cdr-input-and-cons-output策略实现O(n)(reverse; nreverse通过交换指针同时实现cdring)。如果我正确地理解了不熟悉的术语“theta of”,那么是的。但请注意,CL标准不保证时间复杂性。
  • 内置序列操作通常通过根据参数的类型选择特定于数组或列表的实现来实现,因此应该是该数据类型的普通高效算法。
  • 宏只是扩展到其他代码。您可以查看它们的扩展,或查看它们要记录的内容,或者对其扩展使用的算法进行有根据的猜测。宏扩展器的复杂性完全不相关(除非你使用eval / compile,在这种情况下你必须考虑实现编译器的复杂性),因为它在编译时运行,一旦;只有扩展的代码很重要。