【发布时间】:2011-12-03 22:05:58
【问题描述】:
这是一道面试题:
有 10 亿个有 11 位数字的手机号码,它们随机存储在一个文件中,用于 例如 12345678910,第一个数字必须是 1。通过这些数字看是否有 一个有重复的,只看是否存在重复,如果发现重复, 返回 True,或返回 False。 仅允许 10 MB 内存。
这是我的解决方案:
使用 hash(num)%1000 将所有这些数字散列到 1000 个文件中,然后重复的应该落入同一个文件中。
经过哈希处理后,我得到了 1000 个小文件,每个小文件都包含 1 million 数字 at most,对吗?我不确定这个,我只是这样做1 billion / 1000 = 1 million。
然后为每个文件构建一个哈希表来存储每个数字和一个flag 代表它的出现。
我猜,用5 B代表数字,4 B代表较低的8 digits,1 B代表较高的3 digits;实际上1 bit 就足够了flag,因为我只需要找出重复是否存在,只需要多少次。但是如何将1 bit 标志应用于每个数字?我迷路了,所以我选择bool 作为标志,1 B 被占用。
所以最后,哈希表中的每个数字都将采用5B<for number> + 1B<for flag> + 4B<for the next-pointer> = 10B,然后每个文件将采用10M作为哈希表。
这是我的愚蠢解决方案,请给我一个更好的解决方案。
谢谢。
跟进:
如果这 10 亿个电话号码中有
no duplicates,给定一个 电话号码,如何找出给定的一个is or is not in这些1 十亿数字? 使用尽可能少的内存。
我想出了 2 个解决方案,
电话号码可以用我上面说的5B表示,扫描文件,一次读一个号码,
xor the given number with the one read from the file,如果结果是0,那么给定的在文件,这需要O(n)时间,对吧?Partition这些数字根据leading bit变成2 small files,也就是说,带有leading 1-bit的数字进入一个文件,leading 0-bit进入另一个文件,同时计算有多少个数字在每个文件中,如果给定的数字落入1-bit文件,并且1-bit文件的count是not full,则again partition根据secondary leading-bit的1-bit文件,并检查给定的数字递归地;如果 1 位文件is full,那么给定的数字必须在文件中,这需要O(logn)时间,对吧?
【问题讨论】:
-
什么是十亿? 1E9 ?
-
@wildplasser,是的,10^9。
-
从您的帖子的其余部分可以明显看出,但美国人似乎有一个奇怪的习惯,即混淆 xxxillions ;-)
-
这是不久前的特色问题之一(每周通讯)。愚蠢的是,我想在阅读答案之前自己考虑一下... :)
-
既然你以某种方式“拥有”了输入,你是不是已经使用了超过 10MB 的空间?如果那部分不算在内,一个简单的 O(n^2) 算法将仅使用 O(1) 额外
标签: algorithm large-data