Algorithm 将运行时间减少到O(n)

Algorithm 将运行时间减少到O(n),algorithm,Algorithm,我向HW提出了这个问题,但我不知道该怎么做: 数组A[1…n]包含0到n之间的所有整数,只有一个除外。数组未排序。 在这个问题中,我们无法通过一次操作访问一个完整的整数。 A的元素用二进制表示,我们可以用来访问它们的唯一操作是“获取A[i]的第j位”,这需要恒定的时间 我必须在O(n)时间内找到丢失的整数 完成这项工作所需的时间通常为O(NlgN) (在N数组上运行,并获取N-lgn位函数的所有位) 在不读取所有位的情况下,我怎么做呢?现在让我们假设,对于某些k,n是2^k-1 让我们再看一个例

我向HW提出了这个问题,但我不知道该怎么做:
数组A[1…n]包含0到n之间的所有整数,只有一个除外。数组未排序。
在这个问题中,我们无法通过一次操作访问一个完整的整数。
A的元素用二进制表示,我们可以用来访问它们的唯一操作是“获取A[i]的第j位”,这需要恒定的时间

我必须在O(n)时间内找到丢失的整数

完成这项工作所需的时间通常为O(NlgN) (在N数组上运行,并获取N-lgn位函数的所有位)


在不读取所有位的情况下,我怎么做呢?

现在让我们假设,对于某些k,n是2^k-1

让我们再看一个例子,其中k=3

000
001
010
011
100
101
110
111
您会注意到,当有一个完整的集合时,如上图所示,每个列(每个数字的位置)都有相同数量的1和0。当然,为了方便起见,我们将其显示为排序,但实际上,我并不是说它是排序的

让我们看看下面的列表

000
001
010
011
100
110
111
我们查看所有元素的第一位(O(n))并找出哪个计数小于另一个

我们看到,对于第一位,有一个数字缺失了最高有效位中的1。这意味着我们知道我们的数字在其最重要的位上有一个1

基本上,我们划分为两个集合,一个最高有效位为1,另一个最高有效位为0。较小的一组显示丢失的数字有多少位

我们在较小的分区上做同样的事情

因为它是O(n)+O(n/2)+O(n/4)。。。基本上是O(2n),也就是O(n)

编辑

有关一般情况,请参阅


基本上,它涉及到利用这样一个事实,当n不是2的幂时,你可以考虑这样一个事实,给定n,你确切地知道有多少应该属于bit=1分区和bit=0分区,如果这是一个完整的集合。

现在让我们假设对于某些k,n是2^k-1

让我们再看一个例子,其中k=3

000
001
010
011
100
101
110
111
您会注意到,当有一个完整的集合时,如上图所示,每个列(每个数字的位置)都有相同数量的1和0。当然,为了方便起见,我们将其显示为排序,但实际上,我并不是说它是排序的

让我们看看下面的列表

000
001
010
011
100
110
111
我们查看所有元素的第一位(O(n))并找出哪个计数小于另一个

我们看到,对于第一位,有一个数字缺失了最高有效位中的1。这意味着我们知道我们的数字在其最重要的位上有一个1

基本上,我们划分为两个集合,一个最高有效位为1,另一个最高有效位为0。较小的一组显示丢失的数字有多少位

我们在较小的分区上做同样的事情

因为它是O(n)+O(n/2)+O(n/4)。。。基本上是O(2n),也就是O(n)

编辑

有关一般情况,请参阅


基本上,它涉及到利用这样一个事实,当n不是2的幂时,你可以考虑这样一个事实,即给定n,你确切地知道有多少应该属于bit=1分区和bit=0分区,如果这是一个完整的集合。

还有其他属性吗?例如,数组中的数字是否已排序?否则,每一点至少看一次是不可能的。另外,请发布你现在的解决方案。提示:分而治之。显然,开始时需要检查所有数字中的一些位,但完成后是否有必要再次检查所有数字中的下一位?@Jon这对随机排列的数组有何帮助?@Jon不,提示有助于理解。你提供的是一个纯粹的陈词滥调。还有其他属性吗?例如,数组中的数字是否已排序?否则,每一点至少看一次是不可能的。另外,请发布你现在的解决方案。提示:分而治之。显然,开始时需要检查所有数字中的一些位,但完成后是否有必要再次检查所有数字中的下一位?@Jon这对随机排列的数组有何帮助?@Jon不,提示有助于理解。你提供的是一个纯粹的陈词滥调。我认为这是行不通的。您的算法有效,但仅当您拥有所有3位单词时。只需取n=6(即7个元素),并将缺少的元素设为0。然后,您甚至可以在每个步骤中获得相同数量的0和1。所以你必须看每一点。这就是为什么我认为如果没有一开始的假设(问题中没有给出),一般的分而治之的方法是行不通的。是的。你说得对。但是如果你注意到了,我提到了我最初的假设,元素的数量是2减去1的幂。我将很快调整我的解决方案以解决这个问题。我正在复习笔记,我想这行不通。您的算法有效,但仅当您拥有所有3位单词时。只需取n=6(即7个元素),并将缺少的元素设为0。然后,您甚至可以在每个步骤中获得相同数量的0和1。所以你必须看每一点。这就是为什么我认为如果没有一开始的假设(问题中没有给出),一般的分而治之的方法是行不通的。是的。你说得对。但是如果你注意到了,我提到了我最初的假设,元素的数量是2减去1的幂。我将很快调整我的解决方案以解决这个问题。我正在复习我的笔记。