找到存储在文件中的数字中再次出现的数字

TCM*_*TCM 2 c algorithm

比如说,我有10亿个数字存储在一个文件中.我怎么能找到之前曾经出现过的数字?

好吧,我不能只是在数组中一次填充数十亿个数字,然后保持一个简单的嵌套循环来检查数字是否已经出现过.

你会如何解决这个问题?

提前致谢 :)

kbr*_*ton 7

我曾经把它作为一个面试问题.

这是一个O(N)的算法

使用哈希表.按顺序存储指向数字的指针,其中散列键是根据数值计算的.一旦发生碰撞,您就找到了副本.

作者编辑:

下面,@ Phimuemue明确指出,在保证冲突之前,4字节整数具有固定的界限; 即2 ^ 32,或约.4GB.在伴随此答案的对话中考虑时,此算法的最坏情况内存消耗将大大降低.

此外,使用如下所述的位阵列可以将存储器消耗减少到1/8,512mb.在许多机器上,这种计算现在可以不考虑任何持久的散列,在-高性能少排序优先策略.

现在,较长的数字或双精度数字是位阵列策略的低效方案.

Phimuemue编辑:

当然需要采取一些"特殊"哈希表:

采用由2 ^ 32位组成的哈希表.由于问题是关于4字节整数,因此它们中至多有2 ^ 32个不同,即每个数字一位.2 ^ 32位= 512mb.

所以现在只需确定hashmap中相应位的位置并进行设置即可.如果遇到已经设置的位,则序列中已经出现了该数字.

  • 你们的人生活在哪个星球?!100亿个数字@ 4个字节每个是40GB的数据!而且你正在认真地争辩说你可以把它放在哈希表中? (3认同)
  • @fearofawhackplanet - 我们正在寻找100亿条记录,每条记录包含1个32位整数.由于我们只对"欺骗而不是欺骗"感兴趣,我们可以使用整数值对我们感兴趣的位进行索引,从而获得2 ^ 29字节(2 ^ 32位)的存储空间. (3认同)
  • 您在编辑中描述的内容不是散列表,因为不涉及散列; 它有点阵. (3认同)