最近我遇到了一个有趣的链表问题。给出一个按顺序排列的单向链表,我们需要在该链表中搜索一个元素。
时间复杂度不应超过O(log n)
。这似乎需要我们在该链表上应用二分查找算法。如何操作呢?由于链表不提供随机访问,如果我们尝试应用二分查找算法,它将达到O(n),因为我们需要找到链表的长度并前往中间位置。
有什么想法吗?
最近我遇到了一个有趣的链表问题。给出一个按顺序排列的单向链表,我们需要在该链表中搜索一个元素。
时间复杂度不应超过O(log n)
。这似乎需要我们在该链表上应用二分查找算法。如何操作呢?由于链表不提供随机访问,如果我们尝试应用二分查找算法,它将达到O(n),因为我们需要找到链表的长度并前往中间位置。
有什么想法吗?
使用普通的单向链表肯定是不可能实现的。
简要证明:要检查单向链表的最后一个节点,我们必须执行 n-1
次“下一个”指针操作 [归纳证明,因为第 k+1 个节点只有一个引用,并且是在第 k 个节点中,需要一次操作才能跟随它]。对于某些输入,必须检查最后一个节点(具体来说,如果搜索的元素等于或大于其值)。因此,对于某些输入,所需时间与 n
成比例。
你需要更多的时间或者不同的数据结构。
请注意,使用二分查找可以进行 O(log n) 比较,但需要更多的时间,因此仅在比遍历列表更昂贵的情况下,此事实才有意义。
O(1)
的插入/删除时间。所以最好使用普通数组,而不必担心链表。 - BartoszKP是的,在Java语言中可以实现如下...
Collections.<T>binarySearch(List<T> list, T key)
用于任何List
的二分查找。它适用于ArrayList
、LinkedList
和任何其他List
。