【问题标题】:How to determine the point at which a doubly linked list becomes a better solution than a simple linked list?如何确定双向链表成为比简单链表更好的解决方案的点?
【发布时间】:2013-11-25 18:26:57
【问题描述】:

据我了解,与简单链表相比,双向链表使用更多内存但 CPU 更少,并且通常提供更好的算法复杂度。

我想知道的是,与双向链表相比,简单链表何时能提供更好的整体结果。是否有明确的点/情况,之后使用一个而不是另一个无疑是最好的解决方案? (就像普通 PC 上的 x 元素之后)

我的具体问题:

我正在实现一个一般用途的链表结构,并且正在考虑是否应该包含一个返回链接,因为它会大大降低元素删除的复杂性。

谢谢。


更新:

在一个简单的链表上,什么大小的元素移除变得过于昂贵?

【问题讨论】:

  • 如果我们同时使用 next 和 previous 指针遍历列表,是否需要一半的时间?
  • @SrinivasReddyThatiparthy 你的意思是搜索时间?不,不是“随机”搜索。您仍然必须平均访问 n/2 个列表条目,并且“跟随右侧链接”与“跟随左侧链接”之间没有成本差异。
  • 我不知道您如何在不知道插入列表的频率的情况下回答更新后的问题。这就是产生双向链表的运行时成本的地方。您还需要知道不添加或删除前向链接的频率。为了有效地从单链表中删除列表条目,您需要在遍历期间维护“前一个”指针。这实际上是每个遍历步骤的一个局部变量分配。这什么时候变得“太贵了”?

标签: c data-structures linked-list


【解决方案1】:

链表是一种数据结构,大多数情况下可用于实现堆栈或队列。一般来说,如果您正在实现堆栈插入和删除,则发生在单端。如果使用 Q 通常我们在一端删除并在另一端添加。正如您所看到的,这两个抽象 ds 都不需要双重列表,并且添加和删除操作不依赖于项目数。 正如 Kepani 上面提到的,唯一担心列表中元素数量的情况是当您以堆栈/Q 接口未描述的方式删除时(一种非线性方法)。这将是元素被排序的时候(当然也可以是其他的)并且需要维护顺序。 由于每个节点都需要维护一个“额外”指针,因此使用双列表肯定很难满足内存要求,除非您尝试维护一个引用过去值的存储。 Dlist 在这里会很方便(例如:cli 命令行解释器。) 单个列表很难按时完成,因为到达当前节点的前一个值所需的遍历将取决于列表中元素的数量。

【讨论】:

    【解决方案2】:

    我想知道一个简单的链表何时能提供更好的 与双向链表相比的总体结果。

    当你不必倒退时。

    如果您正在执行单向线性搜索,则没有动力从另一个方向遍历列表,并且您不需要这些指针。

    更新:

    在什么尺寸的元素删除变得过于昂贵的简单 链表?

    这个问题与列表是单链接还是双链接无关。如果必须删除列表中的某些内容,则需要查找它,即时间复杂度O(n)。有一个指向前一个节点的额外指针在这里没有帮助。

    【讨论】:

    • 删除元素怎么样?到了一定尺寸会不会太贵了?
    • @Douglas 不,除非您以非线性顺序删除内容。当您在列表中查找要删除的内容时,您只需要跟踪一个额外的指针。
    • 很抱歉没有完全清楚。我将遍历列表,从一些元素开始线程,然后在线程完成后删除这些元素。因此,我将拥有节点地址的副本,但要删除它,该函数必须遍历列表,直到找到元素O(n) 才能更新指向它的链接。在双向链表中,它不必遍历列表O(1),只需跟随指向前面节点的指针即可。我想知道的是维护每个节点的额外指针和遍历列表以删除元素之间的成本比较。
    【解决方案3】:

    选择数据结构是在权衡成本与收益,通常是工作与维护。

    单链表提供简单的遍历和简单的前端插入。可以以跟踪最后一个节点为代价进行简单的尾部插入。该成本意味着每当您添加/删除一个节点时,您都​​必须进行额外的检查(这是尾部吗?)并可能更新列表结构。

    双向链表增加了更多的维护开销。现在每个节点都必须存储两个指针,并且必须对其进行管理和维护。

    如果您从不需要在列表中向后走,那么单链表是理想的,但不能向后走意味着移除成本更高。

    因此,您需要首先确定您将采用哪种使用模式。如果您正在构建一次性列表,那么单链表可能是理想的选择。如果您要构建一个删除率很高的动态列表,那么双向链表会更适合。

    确定您的数据结构提供的具体操作成本是诸如“Big O Notation”之类的主题。

    【讨论】:

      猜你喜欢
      • 2010-11-08
      • 1970-01-01
      • 2013-03-11
      • 2013-09-17
      • 1970-01-01
      • 2013-10-14
      • 2015-05-06
      • 2016-12-21
      相关资源
      最近更新 更多