我为HW提出了这个问题,我无法弄清楚如何做到这一点:
数组A [1 ... n]包含从0到n的所有整数,除了一个。数组未排序。
在这个问题中,我们无法通过一次操作访问A中的整个整数
A的元素以二进制表示,我们可以用来访问它们的唯一操作是“获取A [i]的第j位”,这需要恒定的时间。
我必须在O(n)时间内找到缺失的整数。
正常做的时间是O(NlgN) (在N数组上运行,并获取所有N - lgn位函数的位)。
如果不阅读所有内容,我该怎么办?
答案 0 :(得分:4)
我们假设现在n对于某些k来说是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,另一组最高有效位为0.较小的组显示缺失数字的位数。
我们在较小的分区上做同样的事情。
由于它是O(n)+ O(n / 2)+ O(n / 4)......它基本上是O(2n),即O(n)。
修改强>
对于一般情况,请参阅the following document, bottom of page 1。
基本上,它涉及利用这样一个事实:当n不是2的幂时,你可以考虑到给定n的事实,你确切地知道有多少应该属于bit = 1分区并且bit = 0分区,如果这是一个完整的集合。