【问题标题】:Implement dictionary using singly linked circular list使用单链循环列表实现字典
【发布时间】:2014-07-01 11:42:08
【问题描述】:

我正在解决一个问题,我必须使用单链循环列表来实现字典操作插入、删除和搜索。您的程序的运行时间是多少?
1) 插入:可以在 O(1) 中完成
2)删除:可以在O(1)中完成
3) 搜索:我不确定。 O(length_of_linked_list) 是最坏的情况。

搜索可以在更快的时间内完成吗??

【问题讨论】:

  • 我是否应该假设您的链接列表已排序?
  • @AyushJain 如果你假设链接列表按排序顺序而不是插入将不会在 O(1) 中实现。
  • 是的,我正要这么说。然后我猜如果没有排序,搜索不能在 O(log(n)) 时间内完成。应该是 O(n)
  • @AyushJain 哪个更好?插入 O(1) ,搜索 O(n) .... 或插入 (log n) 和搜索 (log n) ?
  • 您听说过Self-organising listsSkip-list 吗?好吧,如果没有,那么这里有给你的链接。你可以咨询他们。 geeksforgeeks.org/self-organizing-list-set-1-introductiongeeksforgeeks.org/skip-list

标签: algorithm dictionary data-structures


【解决方案1】:

插入和搜索,都不能用 O(1) 完成(除非你使用散列)。 主要有3种可能:

  1. 搜索 O(nlogn) 并插入 O(1)
  2. 搜索 O(logn) 并插入 O(logn)
  3. 搜索并插入两个 O(1)

第一个用于例如在您在链表的最终位置插入并在排序完成后使用迭代进行搜索(快速排序平均需要 nlogn)。当您使用比插入使用更少的搜索使用来维护数据库时,这很有帮助。 第二个很有帮助,例如,当您在 k-ary 搜索方法的帮助下对插入和搜索进行排序时,需要 logn 时间。这很有帮助,例如在电话簿中,搜索比插入更多。现在,散列技术更多地用于处理此类问题(O(1))。 因此,使用散列和索引,我们可以实现 O(1) 时间搜索和插入的功能。 删除时间与搜索相同,因为您可以在找到元素后在 0 时间内删除(加上更多的指针移动,没什么大不了的)。

【讨论】:

  • 您已经掌握了所有这些可能性(不包括散列),最好有 O(1) 插入、O(1) 删除和 O(N) 搜索。但是谢谢你的帮助兄弟。我研究了 k-ary 搜索方法。
  • 不客气,我的朋友 :) 我想澄清的一件事是使用链表无法实现 O(1) 中的删除。假设你要删除链表中的一个元素,无论你的链表是否排序,你都必须先搜索它。这肯定需要 O(一些时间!= 1)。无论如何,这取决于您的选择和您要提供的功能,您将采用哪种方法。
  • 我们可以在 O(1) 时间内删除 .. 看看这篇文章 .. stackoverflow.com/questions/793950/…
  • 当你有一个指向你要删除的节点的指针(引用)时就是这种情况。找到那个节点显然不会花费 O(1)。
  • 是的是正确的..这就是为什么在我的问题中我写了 O(1) 来删除。
猜你喜欢
  • 2014-04-07
  • 2020-02-10
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 2017-04-05
  • 2021-06-11
  • 2017-11-15
  • 2017-12-04
相关资源
最近更新 更多