C++ 缺少编号面试问题重复

C++ 缺少编号面试问题重复,c++,math,computer-science,complexity-theory,C++,Math,Computer Science,Complexity Theory,确定1到N范围内缺失值的常见面试问题已经做了一千次了。变化包括2个缺失值,最多K个缺失值 示例问题:Range[1,10](1 2 4 5 7 8 9 10)={3,6} 以下是各种解决方案的示例: 我的问题是,一个缺失值的简单情况是O(n)复杂度,较大情况的复杂度收敛于大约大于O(nlogn)的某个值: 回答这个问题难道不更容易吗?说sort(mergesort)是范围,然后反复观察缺少的元素 此解决方案应不超过O(nlogn),并且能够解决1到N范围以外的问题,如10到1000或-100到

确定1到N范围内缺失值的常见面试问题已经做了一千次了。变化包括2个缺失值,最多K个缺失值

示例问题:Range[1,10](1 2 4 5 7 8 9 10)={3,6}

以下是各种解决方案的示例:

我的问题是,一个缺失值的简单情况是O(n)复杂度,较大情况的复杂度收敛于大约大于O(nlogn)的某个值:

回答这个问题难道不更容易吗?说sort(mergesort)是范围,然后反复观察缺少的元素

此解决方案应不超过O(nlogn),并且能够解决1到N范围以外的问题,如10到1000或-100到+100等

是否有任何理由相信,对于大量缺失值,上述SO链接中的给定解决方案将优于基于排序的解决方案

注:这个问题似乎有很多常见的解决方案,假设只有数论方法。如果在S/E面试中被问到这样一个问题,那么使用计算机科学/算法的方法是不明智的,假设该方法与数论解决方案的复杂性相吻合……< 更多相关链接:


因为这些数字是从一个小而有限的范围内提取的,所以它们可以在线性时间内“排序”


我们所要做的就是初始化一个包含100个布尔值的数组,对于每个输入,设置对应于输入中每个数字的布尔值,然后逐步报告未设置的布尔值。

给定的解决方案在理论上是否优于排序的解决方案取决于N和K。而您的解决方案的复杂性为
O(N*log(N))
,给定的解是
O(N*K)
。我认为给定的解决方案是(与排序解决方案一样)能够解决任何范围<代码> [a,b] < /> >只通过将范围<代码> [a,b] < /C> > <代码> [1,n] < /> > < p>您只指定时间复杂度,但是空间复杂度也是很重要的考虑。

问题的复杂性可以用
N
(范围的长度)和
K
(缺失元素的数量)来表示

在您链接的问题中,使用方程的解决方案是空间中的O(K)(或者更多?),因为每个未知值需要一个方程

还有一个保留点:您可以更改已知元素的列表吗?在许多情况下,这是不可取的,在这种情况下,任何涉及对元素重新排序或使用元素的解决方案都必须首先在空间中复制O(N-K)

我不能比线性解决方案看得更快:您需要读取所有已知元素(N-K)并输出所有未知元素(K)。因此,你不可能在时间上超过O(N)

让我们把解决办法分解一下

  • 销毁,O(N)空间,O(N日志N)时间:就地排序
  • 保持,O(K)空间?,O(N对数N)时间:方程组
  • 保存,O(N)空间,O(N)时间:计数排序
就我个人而言,虽然我觉得方程组的解很聪明,但我可能会使用其中任何一种排序解。让我们面对现实:它们的编码要简单得多,尤其是计数排序

就时间而言,在实际执行中,我认为“计数排序”将轻而易举地击败所有其他解决方案

注意:计数排序不要求范围为
[0,X)
,任何范围都可以,因为任何有限范围都可以通过简单的转换转换转换为
[0,X)
形式

编辑

将排序更改为O(N),需要所有元素都可用才能对其进行排序

经过一段时间的思考,我还提出了另一个解决方案。如前所述,当N(急剧)增长时,所需的空间可能会爆炸。但是,如果K很小,那么我们可以使用间隔更改列表的表示形式:

  • {4,5,3,1,7}
可以表示为

  • [1,1]U[3,5]U[7,7]
在一般情况下,维护已排序的间隔列表比维护已排序的元素列表的成本要低得多,而且推断缺失的数字也同样容易

时间复杂度很简单:O(N logn),毕竟它基本上是一种插入排序

当然,真正有趣的是,不需要实际存储列表,因此您可以将流提供给算法

另一方面,我很难计算出平均的空间复杂度。占用的“最终”空间是O(K)(最多K+1个间隔),但在构建过程中,由于我们不按特定顺序引入元素,将有更多的缺失间隔


最坏的情况很简单:N/2个区间(奇数对偶数)。不过我无法计算出平均情况。我的直觉告诉我它应该比O(N)好,但我并不那么相信。

如果给你的范围远远超过,那么在这种情况下,范围是[1,10]您可以使用给定的范围和数字执行XOR运算。因为XOR是交换运算。您将只剩下{3,6}


(1234568910)XOR(12457910)={3,6}

如果有总的N元素,其中每个数字x都是1100。

这是怎么回事

  • 创建自己的包含所有数字的集合
  • 从集合中删除给定的数字集合(无需排序)
  • 你的组里剩下的是丢失的号码。

    我已经回答了

    您还可以在\u现有\u数组+1中创建大小为
    最后\u元素\u的布尔值数组

    for
    循环中,标记所有在