例如,在排序紧密下限是N * log(N),其中N是数组的大小
在排序数组中搜索怎么样?我认为这是log(N),但我并不是100%肯定。
一切都是基于比较,没有任何其他外部存储器可以使用输入数组本身
提前致谢
答案 0 :(得分:1)
是:仅使用比较搜索排序数组的下限是 o(log n)。
对于一个非常严格的证明,为什么会出现这种情况,想象一下解决这个问题的任何算法的决策树。树中叶子节点的数量等于 n + 1 (每个位置一个结果和“未找到”结果)。因此,这棵树的最小深度必须是 log 2 n 的数量级。
答案 1 :(得分:1)
我不太确定是什么意思,但我可以给你一个证据,证明O(log n)是问题的较低复杂性界限。
问题复杂性一般而不是算法来讨论问题的复杂性。
比较元素和给定元素中的元素只有三个结果:
array[i]=element: stop
array[i]<element: search the first half
array[i]>element: search the second half
此过程可以由二叉树表示。在最好的情况下,树的深度是O(log n)。因此,我们可以断言没有算法比O(log n)更快,这是问题时间的下限。
问题复杂性的上限由解决问题的任何算法的最低时间复杂度给出。存在二进制搜索算法,其复杂度为O(log n)。
对于搜索数组问题,上限和下限重合,因此问题复杂度为O(log n)。
答案 2 :(得分:-2)
搜索简单排序数组的最佳解决方案是二进制搜索,其时间复杂度为O(log 2(N))。最糟糕的情况发生在搜索的元素不在数组中时,并且完全采用⌊log2(N)+1⌋次迭代。请参阅Binary Search Performance。
我相信在提到复杂性的上限和下限时,你只能谈论“紧张”。下限(大欧米茄)通常更难计算,并且通常不如上限(大O)有用。紧束缚(大Theta)考虑了上限和下限。
从技术上讲,下限是Ω(1),因为您可以在第一次比较中找到搜索到的元素。有关二进制搜索的时间复杂性的进一步讨论,请参阅Is binary search theta log (n) or big O log(n)。