最近我在链表上遇到了一个有趣的问题。给出了单独排序的列表,我们必须从该列表中搜索一个元素。
时间复杂度不应超过O(log n)
。这似乎我们需要在此链表上应用二进制搜索。怎么样?由于链接列表不提供随机访问,如果我们尝试应用二进制搜索算法,它将达到O(n),因为我们需要找到列表的长度并转到中间。
有什么想法吗?
答案 0 :(得分:38)
使用简单的单链表肯定不可能。
草图证明:要检查单链表的最后一个节点,我们必须执行n-1
跟随“下一个”指针的操作[通过归纳证明只有一个对{的引用这一事实{1}}节点,它位于k+1
节点,它需要一个操作来跟随它。对于某些输入,有必要检查最后一个节点(具体地说,如果搜索的元素等于或大于其值)。因此,对于某些输入,所需时间与k
成比例。
您需要更多时间或不同的数据结构。
请注意,您可以使用二进制搜索在O(log n)比较中执行此操作。它只需要花费更多时间,所以如果比较比列表遍历要昂贵得多,那么这个事实才有意义。
答案 1 :(得分:29)
您需要使用skip list。使用普通链表是不可能的(我真的想知道普通列表是否可行)。
答案 2 :(得分:2)
在链接列表中,二进制搜索可能无法实现O(log n)的复杂性,但是通过使用本研究工作中所述的双指针方法可以实现最少:http://www.ijcsit.com/docs/Volume%205/vol5issue02/ijcsit20140502215.pdf
答案 3 :(得分:0)
如上所述,这通常不可行。但是,在像C这样的语言中,如果列表节点是连续分配的,则可以将结构视为节点数组。
显然,这只是这个问题的一个技巧问题变体的答案,但问题总是不可能或一个技巧问题。
答案 4 :(得分:-1)
是的,有可能在java语言中如下..
Collections.<T>binarySearch(List<T> list, T key)
用于任何List
的二进制搜索。它适用于ArrayList
和LinkedList
以及任何其他List
。
答案 5 :(得分:-4)
使用MAPS创建LINK LISTS
映射M,M [第一个元素] =第二个元素,M [第二个元素] =第三个元素,
...
...
它是一个链表...
但因为它是一张地图......
内部使用二进制搜索来搜索任何元素。
任何元素搜索都需要O(log n)