Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 文件搜索索引的算法问题_Algorithm - Fatal编程技术网

Algorithm 文件搜索索引的算法问题

Algorithm 文件搜索索引的算法问题,algorithm,Algorithm,有一个问题,我也有解决办法。但我不明白解决办法。请提供一些示例和一些经验 问题: 给定一个包含大约3亿个社会保险号码(9位数字)的文件,找到一个不在该文件中的9位数字。您有无限的驱动器空间,但只有2MB的RAM可供您使用 答复 在第一步中,我们构建一个数组2^16个整数,该整数初始化为0,对于文件中的每个数字,我们将其16个最高有效位编入该数组并递增该数字 由于文件中的数字少于2^32,因此数组中必须(至少)有一个小于2^16的数字。这告诉我们,在具有这些高位的可能数字中,至少缺少一个数字 在第

有一个问题,我也有解决办法。但我不明白解决办法。请提供一些示例和一些经验

问题: 给定一个包含大约3亿个社会保险号码(9位数字)的文件,找到一个不在该文件中的9位数字。您有无限的驱动器空间,但只有2MB的RAM可供您使用

答复 在第一步中,我们构建一个数组2^16个整数,该整数初始化为0,对于文件中的每个数字,我们将其16个最高有效位编入该数组并递增该数字

由于文件中的数字少于2^32,因此数组中必须(至少)有一个小于2^16的数字。这告诉我们,在具有这些高位的可能数字中,至少缺少一个数字

在第二步中,我们只能关注与此标准匹配的数字,并使用大小为2^16的位向量来识别缺失的数字之一


为了使解释更简单,假设你有一个两位数的数字列表,其中每个数字都在0到3之间,但是你不能为16个可能的数字中的每一个留出16位来记忆,不管你是否已经遇到过它。您要做的是创建一个由4个3位整数组成的数组
a
,并在
a[i]
中存储您遇到的第一个数字
i
的数量。(两位整数不够,因为需要值0、4和它们之间的所有数字。)

如果你有档案

00,12,03,31,01,32,02

您的阵列如下所示:

4,1,0,2

现在您知道所有以0开头的数字都在文件中,但对于其余的每个数字,至少缺少一个。让我们选择1。我们知道至少有一个以1开头的数字不在文件中。因此,创建一个4位的数组,对于从1开始的每个数字,设置适当的位,最后,选择一个未设置的位,在我们的示例中,如果可以是0。现在我们有了解决方案:10


在这种情况下,使用此方法是12位和16位之间的差值。就您的数字而言,它是32 kB和119 MB之间的差异。

按整数计算,假设没有重复的数字,您大约有文件中可能存在的数字的1/3

其思想是对数据进行两次传递。将每个数字视为32位(无符号)数字。在第一个过程中,跟踪在最高有效16位中有多少个数字具有相同的数字。实际上,有许多代码是零的(例如,所有10位SSN的代码;很可能,所有第一位数字为零的代码也丢失了)。但在计数为非零的范围中,大多数不会有65536个条目,如果范围中没有间隙,则会出现多少个条目。因此,只要小心一点,你可以在第二遍中选择一个范围来集中注意力

如果幸运的话,您可以在100000000..99999999中找到一个零条目的范围-您可以从该范围中选择任何缺失的数字


假设你不是很幸运,选择一个位数最少的(或者少于65536个条目的);称之为目标范围。将数组重置为全零。重新读取数据。如果您读取的数字不在目标范围内,请忽略它。如果在范围内,则通过将数字的低位16位的数组值设置为1来记录数字。当您读取整个文件时,数组中任何带零的数字都表示缺少SSN。

@svick,上面的数组a是a[0]=4 a[1]=1 a[2]=0 a[3]=2,因此,对于所有缺少的元素,我们将按您提到的方式选择1乘1并在文件中搜索。现在,对于1、2和3位数字,我们将读取整个文件3次+1次(在beigning中),从优化的角度来看,这是不好的。第二件事,我们将如何得到准确的缺失数字还不清楚,你们对这一点有一些了解,你们的位数组如何帮助这一点。