【问题标题】:Algorithm Question on File Search Indexing文件搜索索引算法题
【发布时间】:2011-09-04 02:37:33
【问题描述】:

有一个问题,我也有解决方案。但我无法理解解决方案。请提供一些示例并提供一些经验。

问题

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

回答

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

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

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

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    如果没有重复,您大约有文件中可能存在的数字的 1/3。

    这个想法是对数据进行两次传递。将每个数字视为 32 位(无符号)数字。在第一遍中,跟踪有多少数字在最高有效 16 位中具有相同的数字。在实践中,会有许多代码为零(例如,所有那些用于 10 位 SSN 的代码;很可能所有第一个数字为 0 的代码也都丢失了)。但是在计数非零的范围中,大多数不会有 65536 个条目,如果范围内没有间隙,这将是多少个条目。因此,稍加注意,您可以选择其中一个范围在第二遍中集中精力。

    如果幸运的话,您可以在 100,000,000..999,999,999 中找到一个零条目的范围 - 您可以选择该范围内的任何数字作为缺失值。

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

    【讨论】:

      【解决方案2】:

      为了使解释更简单,假设您有一个两位数字的列表,其中每个数字介于 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 之间的差异。

      【讨论】:

      • @svick,上面的数组 a 是 a[0]=4 a[1]=1 a[2]=0 a[3]=2 所以,对于所有缺失的元素,我们将选择 1 -by-1 并在您提到的文件中搜索。现在对于 1、2 和 3 位,我们将读取整个文件 3 次 + 1 次(在 beigning 中),从优化的角度来看这是不好的。第二件事,我们将如何获得确切的缺失数字尚不清楚,您对此有所了解,您的位数组对此有何帮助。
      猜你喜欢
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 2020-01-10
      相关资源
      最近更新 更多