使用 O(1) 搜索链表

Posted

技术标签:

【中文标题】使用 O(1) 搜索链表【英文标题】:Searching a linked list with O(1) 【发布时间】:2013-02-04 14:38:33 【问题描述】:

我在接受采访时被问到关于哈希表的问题,我不得不解释结构链接。

有人问我如何在 O(1) 复杂度的链表中搜索元素。

我们真的可以用 O(1) 找到吗?

谢谢

【问题讨论】:

把所有元素放在一个hashset中? asslias,你是对的,但是将元素添加到哈希集中是 O(n) :) @ilanberci 是的,但您只需执行一次即可进行多次查找。 面试官是否知道你是否知道它是否可能,或者如何实际去做? 这就是我认为 O(n) 是正确答案的原因,并在 O(1) 中挣扎 【参考方案1】:

不,您不能在 O(1) 复杂度内搜索链表。

哈希表创建具有相同哈希值的元素的结构链或链表。

如果散列是均匀分布的(良好的散列),那么散列表将具有 O(1) 复杂度来搜索元素。哈希表有桶,每个桶都可以从哈希值访问,然后每个桶包含具有相同哈希值的元素的链表。

http://www.algolist.net/Data_structures/Hash_table/Chaining

【讨论】:

【参考方案2】:

除非您在其他结构中保留对链表中节点的引用,否则您无法在 O(1) 中访问链表中的元素。这是因为链表保留了对链表头部的引用,并且必须遍历每个下一个元素以找到所请求的元素,这需要 O(n)。

【讨论】:

【参考方案3】:

不,绝对不是。链表没有快速找到项目的巧妙方法 - 它是 O(n)。

如果您有足够好的哈希码,则在哈希表中搜索只需 O(1)。如果所有您的密钥具有相同的哈希码,那么无论您使用什么寻址方案,它都是 O(n)。

【讨论】:

@SotiriosDelimanolis:不是这个答案,我不知道——至少除非被接受,否则不会。 @JonSkeet 在某个点之后你会停止从点赞中获得代表吗? @SotiriosDelimanolis:确实 - 见meta.stackexchange.com/questions/63327/…

以上是关于使用 O(1) 搜索链表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构合集

5定义一个JS函数,反转单向链表

数据结构-链表链表的基本操作

数据结构-链表链表的相关算法

何为链表链表示例以及翻转链表

reorder-list——链表快慢指针逆转链表链表合并