找到丢失的号码?

时间:2012-09-18 05:48:31

标签: algorithm

我遇到了这个非常有趣的问题? 我有3亿个SSN号码(9位数字)

找到丢失的SSN号码?

你有无限的驱动器空间,但只有2MB的RAM?

2 个答案:

答案 0 :(得分:3)

假设只缺少一个元素.. 由于我们有内存限制,我们需要将文件部分加载到内存中,因此将给定文件除以3 * 10pow(8)/ 2MB并将下面的方法应用于文件的一部分(从外部排序中借用的技术)。 该技术很简单,所有元素都是XOR。基本概念来自汉明码。如果我们对1到2power(n-1)的所有元素进行异或,则结果应该等于零。如果缺少某个元素,结果将丢失数字。

忙碌的方法: 我们还可以将自然数的算术和从1到n应用为n(n + 1)/ 2,然后在一个遍历计算给定数组的和中,找到n(n + 1)/ 2和得到的和之间的差。它应该给出缺失的数字。因为十亿数字的总和是一个非常大的数字来处理。

答案 1 :(得分:2)

让我们首先分析一个较小的问题。假设您有9个唯一的1位数字,并且您正在尝试找到丢失的数字。你可以做的是加上10个唯一的1位数字:

0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45

然后你可以将你拥有的9个数字加起来并减去差值以找到缺少的数字。同样的策略可以应用于您的问题,但问题就是找到总和,因为如果可能的话,您不希望手动执行此操作。

让我们看看100个唯一的2位数字的情况:

前10个数字= 45(如上所示)

接下来的10个数字都会有额外的10 + 1位数字值,给我们145的结果。接下来的10个,每个都有一个额外的20 - > 245,依此类推,直到我们得到总数为945的最后10个数字。我们将这些数字加在一起得到4950.

现在,让我们寻找一个与数字位数相关的模式。

1位= 45(那里没有多少但它确实提供了额外的数据点来验证)

2位= 4950

让我们回想一下我们如何添加数字,可能更容易先看看2位数字。

让我们把x到1到9的数字称为最左边的数字。我们会将前一个数字的答案添加到10 *(x - >之后为1个零,如果是2位数的解决方案。)那么我们可以再次利用我们找到的1位数的答案,看看10 * 10 + 20 * 10 + 30 * 10 + 40 * 10 + 50 * 10 + 60 * 10 + 70 * 10 + 80 * 10 + 90 * 10 = 10 *(10 + 20 + 30 + 40 + 50 + 60 + 70 + 80 + 90)= 100 *(1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9)= 100 * 45 = 4500.然后我们也有45次在那里,所以得到我们450. 4500 + 450 = 4950。

现在,是时候推广到递归方程式。

所有n位唯一数字的总和=

1(后面带有n个零)* ans(n-1)+ 1(带有n-1个零)* ans(n-1)+ 1(带有n-2个零)* ans(n-2)。 .. 10 * 45 + 1 * 0

我已经完成了任何进一步的考虑因素,但我希望我已经说清楚了,这也是一些数学上有趣的回答你的问题!