Compiler construction 什么是双链接?

Compiler construction 什么是双链接?,compiler-construction,programming-languages,definition,Compiler Construction,Programming Languages,Definition,我正在读一个句子,我被一个句子弄糊涂了: 这使得底层例程能够比其他语言中的列表快得多,在这些语言中,您必须关注双链接、破坏性更新等问题 我试着在谷歌上搜索双链接,但找不到合适的定义。作者所说的“双链接”是什么意思?在回答之前,我们需要先了解一些定义和概念 在所引用的上下文中,有两个列表概念 在函数语言(如ML)中使用的不可变列表 链接列表,(如C++、C++、java等)命令语言中使用的可变列表() 此外,列表的构建、销毁和使用方式也不同 虽然必须构造每个列表,但不可变列表仅通过向列表的开头添加

我正在读一个句子,我被一个句子弄糊涂了:

这使得底层例程能够比其他语言中的列表快得多,在这些语言中,您必须关注双链接、破坏性更新等问题


我试着在谷歌上搜索双链接,但找不到合适的定义。作者所说的“双链接”是什么意思?

在回答之前,我们需要先了解一些定义和概念

在所引用的上下文中,有两个列表概念

  • 在函数语言(如ML)中使用的不可变列表
  • 链接列表,(如C++、C++、java等)命令语言中使用的可变列表() 此外,列表的构建、销毁和使用方式也不同

    虽然必须构造每个列表,但不可变列表仅通过向列表的开头添加新项目来构造,而链表可以通过在列表中的任何位置添加项目来构造,尽管通常新项目会添加到链表的末尾

    不可变列表只能在一个方向上从头到尾向前遍历,而链表可以在向前和向后两个方向上遍历,甚至可以在遍历时改变方向

    不可变列表不是通过源代码中的语句销毁的,而是通过垃圾收集自动销毁的,而链表必须通过析构函数语句销毁

    此外,不可变列表都是相同类型的,而链表可以保存不同类型的项

    由于不可变列表的限制,对任何项的操作都是(1)。例如,将项目添加到列表中是O(1),因为它总是添加到标题中。在列表中使用项目是O(1),因为它是列表的当前标题。这是如何实现的,当在函数式语言中与一起使用列表时,使用头项,并传递列表的尾部,以便传递的列表的尾部具有新的头。i、 e.对于列表
    1,2,3
    ,我们使用列表的标题
    1
    ,然后传递列表
    2,3
    ,其中
    2
    是新的标题。是的,在概念上,它们是两个不同的列表,但如何实现这一点的细节是另一个问题

    作者所说的“双链接”是什么意思

    “双链接”指的是语言列表,允许列表中项目的结构具有指向前一项和后一项的指针

    评论中的OP还询问:

    到底是什么原因使单链路比单链路更快 双链接


    正如我在前一节中所指出的,列表上的所有操作都是O(1)。

    列表是数据结构,其中内存块由指针链接,也称为链接。基本上有两种类型的列表。有些元素只使用一个指针(将元素链接到其后续元素),有些元素使用两个指针(将每个元素链接到其前置元素和后续元素)。这些通常被称为“双链接列表”。您缺少上下文:“例如,因为[功能]列表是不可变的。您必须创建一个新列表。”考虑到这一点,这里使用的“双链接”术语指的是a,对于ML或Haskell等语言中的不可变列表类型来说,这是不需要的(通常是不可能的)。总之,总结:使用不可变列表可以简化正确的使用(因为有些因素根本不存在)。不过,作者似乎在错误的意义上使用了“双链接”。是否由于第二个指针使用的开销,单链路比双链路快?@pyrrhic一点也不。作者说,与DLL相关的一些问题在不变的[SL]L设计中根本不存在。当然,[SL]Ls是只向前的遍历,但这是另一点(它确实会影响代码的编写方式)。@pyrhic关于速度的最后一点确实是双曲线的,本可以写得更好。不同的算法确实会支持一种方法而不是另一种方法,所以谈论“速度”有点愚蠢。然而,我相信作者指出,更简单的数据结构需要更少的维护(因为它不能变异),不变的设计避免了破坏性的更新/复制(因为它不能变异)。因此,当适用于该算法时(例如,前端附加和前向遍历),不可变列表可以避免与可变DLL方法相关的开销。