Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 算法分析-在排序数组中查找缺失整数优于O(n)_Arrays_Algorithm_Sorting_Asymptotic Complexity - Fatal编程技术网

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

Arrays 算法分析-在排序数组中查找缺失整数优于O(n),arrays,algorithm,sorting,asymptotic-complexity,Arrays,Algorithm,Sorting,Asymptotic Complexity,我第一次对算法类进行分析,我想知道是否有人可以帮助我完成下面的例子。我相信我已经解决了O(n)复杂度的问题,但是我想知道是否有一个更好的版本我没有考虑O(logn) 设A=A[1]可以用A[i]>i对第一个索引i进行二进制搜索。如果缺少的整数是k,那么A[i]=i表示i=k。这个逻辑当然是正确的,但它的速度不够快,不能超过O(n),因为您检查每个元素 通过观察如果A[i]==i,则jn的真理 此外,此数组以零个或多个连续的false开始,其余条目均为true 现在的问题是在布尔值的(排序)数组中

我第一次对算法类进行分析,我想知道是否有人可以帮助我完成下面的例子。我相信我已经解决了O(n)复杂度的问题,但是我想知道是否有一个更好的版本我没有考虑O(logn)


设A=A[1]可以用A[i]>i对第一个索引i进行二进制搜索。如果缺少的整数是k,那么A[i]=i表示i=k。

这个逻辑当然是正确的,但它的速度不够快,不能超过O(n),因为您检查每个元素

通过观察如果
A[i]==i
,则
j
处的所有元素都位于其适当的位置,可以更快地完成此操作。该观察结果应足以构建一个以O(log2n)运行的分而治之方法:

  • 检查中间的元件
  • 如果它在错误的位置,向左走
  • 否则,向右走

更正式地说,您正在寻找一个点,其中
a[i]==i
a[i+1]==i+2
。从数组末尾的间隔开始。间隔中间的每个探针将剩余间隔收缩两倍。在某个时刻,只剩下两个元素的间隔。左边的元素是最后一个“正确”的元素,而右边的元素是缺失数字后的第一个元素。

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

实际上,您只是在处理布尔值数组;索引
n
处的条目是
a[n]>n
的真理

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


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

Yes。有更好的解决办法。提示:您真的必须查看数组中的每个元素吗?请您整理一下您对问题的陈述好吗?  (1) 如果A是不同的,这意味着它们不相等;那么为什么不直接说“A[1]i完成此工作?如果原始选择是A[i-1]==i,则对right@Busturdust是的,就是这样。是[i-1]>我真的需要终止子句吗?因为如果缺少的元素是1,那么所有元素都将是[i-1]>i,并且将在到达第一个元素之前终止。我想我缺少了something@Busturdust您需要找到一个点,其中
a[i]==i
a[i+1]==i+2
。从阵列末端的间隔开始,间隔中间的每个探测器将剩余间隔缩小两倍。在某些情况下,只剩下两个元素的间隔。左侧的元素是最后一个“正确”的元素元素,而右侧的元素是缺少编号后的第一个元素。
for(i = 1; i < n +1; i++) :
    if(A[i-1] > i) :
         return i