算法分析 - 查找排序数组中丢失的整数优于O(n)

时间:2015-04-26 02:27:23

标签: arrays algorithm sorting asymptotic-complexity

我第一次通过算法类的分析,并想知道是否有人可以协助下面的例子。我相信我已经解决了它的O(n)复杂性,但是想知道是否有更好的版本,我没有想到O(logn)?

  

设A = A [1]< = ...< = A [n + 1]是n个不同整数的排序数组,其中每个整数在[1 ... n + 1]范围内]。也就是说,A中缺少{1,...,n + 1}中的一个整数。描述一个efficeint算法来找到缺失的整数。分析算法的最坏情况复杂性(对数组A的访问次数)。

我所拥有的解决方案相对简单,我相信会导致最坏情况下的N复杂性。也许我在想这个例子,但是有更好的解决方案吗?

我的解决方案

for(i = 1; i < n +1; i++) :
    if(A[i-1] > i) :
         return i

这背后的逻辑是因为它被排序,第一个元素必须是1,第二个必须是2,依此类推,直到数组中的元素大于它应该是的元素,指示一个元素被遗漏,返回它应该是的元素,我们有一个缺失的元素。

这是正确的逻辑吗?有没有更好的方法呢?

感谢您提前阅读并感谢您的帮助。

3 个答案:

答案 0 :(得分:9)

这个逻辑肯定是正确的,但它不足以击败O(n),因为你检查每个元素。

您可以通过观察A[i]==i来更快地完成此操作,然后j < i处的所有元素都在适当的位置。这个观察应该足以构建一个在O(log 2 n)中运行的分而治之的方法:

  • 检查中间的元素
  • 如果它在错误的位置,请左转
  • 否则,请右转

更正式地说,您正在寻找A[i]==iA[i+1]==i+2的位置。您从数组末尾的间隔开始。间隔中间的每个探针将剩余间隔缩小两倍。在某些时候,你只剩下两个元素的间隔。左边的元素是最后一个&#34;正确的&#34;元素,而右边的元素是缺少数字后的第一个元素。

答案 1 :(得分:8)

您可以使用A [i]&gt;二进制搜索第一个索引i一世。如果缺失的整数是k,则对于i = k。

答案 2 :(得分:3)

有时诀窍是以不同的方式思考问题。

在精神上,你只是使用一组布尔值;索引n的条目是a[n] > n的真相。

此外,此数组以零个或多个连续false开头,其余条目均为true

现在,你的问题是找到布尔值(排序)数组中true的第一个实例的索引。

相关问题