【问题标题】:Efficiently search a linked list高效搜索链表
【发布时间】:2017-03-26 21:28:35
【问题描述】:

我有一个排序的链表,一个函数获取根指针和一个 Id 并在列表中搜索以删除项目,但这需要线性时间。

有没有什么方法可以有效地搜索链表而不使用它的排序事实进行线性搜索?该作业强烈暗示他们是一种更好的方法,但我想不出一种方法来做到这一点,而不会非常低效或仅使用线性搜索。

【问题讨论】:

  • 单链表还是双链表?如果为双倍,则可以表示二叉树并将查找时间减少到 log(n)(尽管这是平衡树的最佳情况)。
  • 搜索排序数组的明显方法是对它进行二分搜索。您可以通过在下一个节点的 id 大于(或小于,取决于您的排序方式)搜索键之后终止搜索来获得性能上的小幅提升。通过实现skip list,您可以获得显着的性能提升,但这是一个非常大的附加组件。
  • 谁的方法更好?无论如何,如果你想要更有效的搜索,你可以放弃链表并使用其他东西。没有办法比线性搜索链表更快。当然,除了链表之外,您还可以构建树或数组或任何您想要的东西并搜索它,但那时您不会搜索列表。实际上,无论如何,您总是放弃链表并使用其他东西。无论工作是什么,它几乎都不是工作的正确工具。但是如果没有你的整个作业逐字逐句,这都是纯粹的猜测,不值得花在上面的电子
  • 使用排序的列表的好处是,一旦你到达项目应该在的位置,你就可以停止遍历它(这将为您节省约 50% 的步骤)。缺点是您必须保持列表排序;-)

标签: c search linked-list


【解决方案1】:

链表中的每个节点只包含一个指向下一个节点(也可以是前一个节点)的指针,因此在没有任何其他结构的情况下,唯一的链表搜索方式是线性搜索。

但是,由于您对列表进行排序,因此您可以在此过程中构建一棵二叉树。然后您可以使用该树来搜索时间复杂度为O(log n) 而不是O(n) 的列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2011-08-03
    • 2013-12-13
    • 2015-08-14
    相关资源
    最近更新 更多