如何在排序的链表上应用二进制搜索O(log n)?

Ume*_*cha 35 algorithm linked-list binary-search asymptotic-complexity data-structures

最近我在链表上遇到了一个有趣的问题.给出了单独排序的列表,我们必须从该列表中搜索一个元素.

时间复杂度不应超过O(log n).这似乎我们需要在此链表上应用二进制搜索.怎么样?由于链接列表不提供随机访问,如果我们尝试应用二进制搜索算法,它将达到O(n),因为我们需要找到列表的长度并转到中间.

有任何想法吗?

Ste*_*sop 39

用一个简单的单链表来肯定是不可能的.

草图证明:要检查单链表的最后一个节点,我们必须执行n-1跟随"下一个"指针的操作[通过归纳证明只有一个对k+1第th个节点的引用,并且它在k第节点,它需要一个操作来遵循它].对于某些输入,有必要检查最后一个节点(具体地说,如果搜索的元素等于或大于其值).因此,对于某些输入,所需的时间与...成比例n.

您需要更多时间或不同的数据结构.

请注意,您可以使用二进制搜索在O(log n)比较中执行此操作.它只需要花费更多的时间,所以如果比较比列表遍历要昂贵得多,那么这个事实才有意义.


tas*_*oor 29

您需要使用跳过列表.使用普通链表无法做到这一点(我真的想知道普通列表是否可行).

  • 这个答案清楚地回答了"单链表"案例.SkipList是一个合理的选择. (4认同)
  • 这应该是公认的答案.最高投票的答案要么是误导性的,要么是不完整的.它只说"你可能需要别的东西",这不是很神奇.这个答案很明显. (3认同)
  • 跳表是链表二分查找的解决方案。普通链表是不可能的。 (2认同)