c++ - 有效地找到不在大小为 40、400 或 4000 的集合中的整数
问题描述
与经典问题相关的是,在给定的 40 亿个整数中找到一个整数,但又不完全相同。
为了澄清,我真正的意思是整数只是其数学定义的一个子集。也就是说,假设只有有限数量的整数。在 C++ 中说,它们int
在[INT_MIN, INT_MAX]
.
现在给定一个std::vector<int>
(不重复) or std::unordered_set<int>
,其大小可以是 40、400、4000 左右,但不能太大,如何有效地生成一个保证不在给定数字中的数字?
如果不担心溢出,那么我可以将所有非零值相乘并将乘积加 1。但是有。对手的测试用例可以故意包含INT_MAX
.
我更赞成简单的、非随机的方法。有没有?
谢谢!
更新:为了消除歧义,假设一个未排序的std::vector<int>
,保证没有重复。所以我问是否有比 O(n log(n)) 更好的东西。另请注意,测试用例可能同时包含INT_MIN
和INT_MAX
。
解决方案
您可以只返回N+1
输入中未包含的第一个候选整数。最简单的候选人是数字0
。N
这需要O(N)
空间和时间。
int find_not_contained(container<int> const&data)
{
const int N=data.size();
std::vector<char> known(N+1, 0); // one more candidates than data
for(int i=0; i< N; ++i)
if(data[i]>=0 && data[i]<=N)
known[data[i]]=1;
for(int i=0; i<=N; ++i)
if(!known[i])
return i;
assert(false); // should never be reached.
}
随机方法可以更节省空间,但在最坏的情况下可能需要更多的数据传递。
推荐阅读
- c++ - DirectX12 的问题:“d3dApp.h”:没有这样的文件或目录
- r - 如何基于大数据帧计算共现矩阵?
- delphi - 使用 Delphi-Mocks 通过私有记录在 DUnitx 中进行测试
- tensorflow - 为 Tensorflow 自动分配 CUDA 设备
- windows - 如何在 Windows 的 package.json 中的 NPM 脚本中关闭终端?
- angular - 垫自动完成不过滤值
- node.js - 如何配置 Apollo Server PubSub eventEmitter 在超过最大侦听器时抛出或记录错误?
- javascript - 如何从外部 JS 文件加载 Chart.js 脚本?
- java - 简单while循环的时间复杂度
- python - 如何在熊猫中“估算”2层分组中的缺失项目