Algorithm 报告整数数组中所有缺失的数字(以二进制表示)

Algorithm 报告整数数组中所有缺失的数字(以二进制表示),algorithm,Algorithm,我最近收到一位朋友的报告,在一次求职面试中,他被问到了以下问题,这似乎是一个非常流行的问题: 您将获得一个列表L[1…n],其中包含从0到n的所有元素,只有一个除外。此列表的元素以二进制表示,并且没有以任何特定顺序给出,我们可以用来访问它们的唯一操作是在恒定时间内获取L[i]的第j位。 您如何在O(n)中找到丢失的号码 他能够回答这个问题(我相信这个问题有多种解决方案,没有一个太复杂)。例如,以下伪代码解决了上述问题: 假设所有数字都由k位表示,并将j设置为最低有效位(最初为最右边)。 1.从j

我最近收到一位朋友的报告,在一次求职面试中,他被问到了以下问题,这似乎是一个非常流行的问题:

您将获得一个列表
L[1…n]
,其中包含从0到n的所有元素,只有一个除外。此列表的元素以二进制
表示,并且没有以任何特定顺序给出,我们可以用来访问它们的唯一操作是在恒定时间内获取L[i]的第j位。
您如何在
O(n)
中找到丢失的号码

他能够回答这个问题(我相信这个问题有多种解决方案,没有一个太复杂)。例如,以下伪代码解决了上述问题:

假设所有数字都由k位表示,并将j设置为最低有效位(最初为最右边)。
1.从j开始,将L中的所有数字分成两组(S1包含所有以1作为其第j位的数字,S2包含所有以0作为其第j位的数字)。
2.两个集合中较小的集合包含缺失的数字,在此子集上递归,集合j=j-1

在每次迭代中,我们将集合的大小减少一半。所以最初我们有O(n),然后是O(n/2),O(n/4)…=<代码>O(n)

然而,后续问题是:“如果我们现在的列表L中缺少k个数字,并且我们希望报告所有k个数字,同时仍保持O(n)复杂性和初始问题的局限性,该怎么办?”

有什么建议吗?

boolj[1..n+1]={false,false…}
bool J[1..n + 1]={false,false...}
int temp;

for(i = 1; i <= n; i++)
{
    temp=bitwisecopy of L[i];
    J[temp + 1]=true
}

for(i = 1; i <= n+1; i++)
{
    if(J[i]==false)
       print i + 1;
}
内部温度; 对于(i=1;i
boolj[1..n+1]={false,false…}
内部温度;

对于(i=1;i你可以通过对数组进行线性遍历,直到找到一个与期望值不匹配的数字来解决O(n)中的原始问题,就像这样(是的,我知道我使用整数数组来近似位数组,但概念是一样的):

int[]位={1,1,0,1,1,1,0,0,1,1,0};
int-bitIndex=0;
对于(int num=1;numnextNum=(nextNum您可以通过对数组进行线性遍历来解决O(n)中的原始问题,直到找到一个与期望值不匹配的数字,就像这样(是的,我知道我使用整数数组来近似位数组,但概念相同):

int[]位={1,1,0,1,1,1,0,0,1,1,0};
int-bitIndex=0;
对于(int num=1;numnextNum=(nextNum我的想法是用以下方式解决它:

假设2^M是2的最小幂,大于N:

2^M>N,    2^M-1 <= N

我的想法是通过以下方式解决它:

假设2^M是2的最小幂,大于N:

2^M>N,    2^M-1 <= N

“bitwisecopy of”到底做什么?记住,在每次迭代中,我们只允许从L的给定元素中获取一个位(我想这也回答了你的问题?)假设每个元素中有x位,其中x是常量。我们可以在常量时间中将L[I]中的所有位复制到一个临时变量中。(即O(x*1)=O(1)).按位复制只对所有位执行for循环,并对temp执行shift and and以将位插入…或按您希望的方式执行。理解;)但这将需要为n个元素中的每个元素提取L[i]中的每个位,从而生成O(xn)。目标是只提取单个位,这将允许O(n)。仍然是O(n)哈哈……在第一个问题的解决方案中,你并不是只取一个位。你实际上是在做O(logx*n),对于你的解决方案,这仍然是O(n),如果x=n,复杂性是O(n^2)。我发布的算法(不是很好地描述)对每个元素n都是O(1)。第一次运行是O(n),第二次运行是O(n/2),O(n/4),等等……所以总数是O(n)“bitwisecopy of”到底做什么?记住,在每次迭代中,我们只允许从L的给定元素中获取一个位(我想这也回答了你的问题?)假设每个元素中有x位,其中x是常量。我们可以在常量时间中将L[I]中的所有位复制到一个临时变量中。(即O(x*1)=O(1)).按位复制只对所有位执行for循环,并对temp执行shift and and以将位插入…或按您希望的方式执行。理解;)但这将需要为n个元素中的每个元素提取L[i]中的每个位,从而生成O(xn)。目标是只提取单个位,这将允许O(n)。仍然是O(n)哈哈……在第一个问题的解决方案中,你并不是只取一个位。你实际上是在做O(logx*n),对于你的解决方案,这仍然是O(n),如果x=n,复杂性是O(n^2)。我发布的算法(不是很好地描述)对每个元素n都是O(1)。第一次运行是O(n),第二次运行是O(n/2),O(n/4),等等……所以总数是O(n)你怎么知道下一个数字是什么?不能假设数字是按顺序出现的,我认为不允许有重复的。@user623879正确,数字不是按顺序给出的,否则它将是微不足道的。如果没有重复的数字,则假设有某种东西可以代表数据中的某个缺口array@AlexTim-那为什么你原来的st问题的答案是“给你一个列表”
L[1…n]
。。。“?这意味着列表是从1->n升序的。如果列表的顺序是任意的,那么基本上你只是在寻找位,因为无法确定组成给定位子序列的数字是否实际存在于用于生成位列表的输入数据集中。
L[1…n]包含从0到n的所有元素,除了一个
是完整语句,因此您可以隐式地想象在任何ord中给出的数字
M=3 => 2^M-1=7 =>
1 XOR 2 XOR 4 XOR 5 XOR 6 XOR 7 = 3