Arrays 公共Lisp中的数组、列表和哈希表

Arrays 公共Lisp中的数组、列表和哈希表,arrays,list,common-lisp,big-o,sbcl,Arrays,List,Common Lisp,Big O,Sbcl,我想知道CommonLisp中数组、列表和哈希表之间的区别是什么。也就是说,我知道如何在语法上实现和使用它们。我还了解围绕这三种数据类型的计算机科学理论 我想知道的是什么是常见的Lisp特定实现?如何使用它们来优化代码的性能(空间和时间)?在Common Lisp中,这些数据结构有什么特点吗?它们在运行时的成本有多高?区别在于实际实现和实现后的性能(定义为O(大小)) 列表被实现为链表,因此它们可以有复杂的嵌套和数据共享 添加到开头-O(1)() 添加到末尾-O(n)() 随机存取-O(n)()

我想知道CommonLisp中数组、列表和哈希表之间的区别是什么。也就是说,我知道如何在语法上实现和使用它们。我还了解围绕这三种数据类型的计算机科学理论


我想知道的是什么是常见的Lisp特定实现?如何使用它们来优化代码的性能(空间和时间)?在Common Lisp中,这些数据结构有什么特点吗?它们在运行时的成本有多高?

区别在于实际实现和实现后的性能(定义为
O(大小)

列表被实现为链表,因此它们可以有复杂的嵌套和数据共享

  • 添加到开头-
    O(1)
    ()
  • 添加到末尾-
    O(n)
    ()
  • 随机存取-
    O(n)
    ()
  • 因为Lisp使用 为了表示其代码,可以预期链表的速度相对较快 (即,上述
    O(n)
    中的常数应较小)

    数组作为向量(内存的连续部分)实现,并在上面加上(索引算法自动完成)。 数组也可以

  • 添加到开头-
    O(n)
    (需要一个循环来移动数据)
  • 添加到末尾-
    O(1)
    ()-如果使用&c,则平均为
  • 随机存取-
    O(1)
    ()
  • 如果你过去 避免装箱,您应该知道数据可能在访问时装箱。 例如,如果
    v
    具有类型
    (简单数组双浮点(5))
    ,则
    (aref v2)
    可能必须分配内存以框显返回值(编译器) 可能会消除一些此类分配,但您需要注意 危险)

    哈希表是完全不同的-它们不是,所以它们允许从任意数据映射(与序列的整数索引相反),并且访问(读和写)是
    O(1)

    哈希表可以与and进行比较(这对于小型表来说是一个很好的选择)

    哈希表的主要考虑因素是

  • 测试函数的正确选择
  • 哈希函数的质量
  • 垃圾收集的影响
  • 例如,许多实现将散列所有 实例 相同的bucket,使哈希表作为列表执行

    如果使用
    eq
    哈希表,则实现可能会使用对象地址 在内存中作为散列的(源),如果它有一个复制垃圾 收集器,它必须重新散列每个GC上的所有哈希表

    您可能会发现最好使用字符串作为哈希表键 通常散列最好。 因为你,, 本质上,美化的字符串哈希表连接到 ,所以实现是
    通常要确保它们非常好。

    他说,“我知道如何在语法上实现和使用它们。我也了解围绕这三种数据类型的计算机科学理论。“我以为这涵盖了你迄今为止的答案……”RainerJoswig:我扩展了我的答案,以澄清lisp特定的问题。