【问题标题】:Improve the speed of locating a row (integer columns)提高定位行(整数列)的速度
【发布时间】:2010-10-07 04:55:47
【问题描述】:

我有一个 15 整数列,表中有 5,000,000 行。给定一个包含 15 个整数的输入记录,我需要将输入记录与 5,000,000 条记录表进行比较并获得所有匹配的行。

注意1:一行中的所有整数都是唯一的
注意2:匹配的列顺序和输入记录并不重要。
例如:1、10、15、23、9、22、99、11、19、32、45、21、76、12、33 和 33、10、15、99、11、19、32、45、21 , 23, 9, 22, 76, 12, 1 应该产生匹配结果

是否可以实现散列函数/按位运算来为每一行生成唯一索引。如果记录中的值相同,该函数可以为 2 行返回相同的索引

【问题讨论】:

  • 家庭作业?您有 15 个整数列或 1 个大整数列,您希望将 15 个绑定整数值打包到其中?是 5,00,000 = 500k | 5m?

标签: database algorithm search hash


【解决方案1】:

这并不多,但应该可以帮助您入门。

您可能想要一个产生尽可能少的冲突的哈希函数;但它也必须是可交换的(即:将数字添加到散列的顺序无关紧要)。您可以通过使用 XOR 和位移的组合来实现这一点(参见 page)。

您可能希望将哈希存储在另一列中。然后你可以散列你正在寻找的输入并在你的数据库中查找散列。请注意,哈希允许误报,因此您仍然需要检查候选行是否真的是您想要的(即:对所有内容进行排序并进行比较)。

【讨论】:

    【解决方案2】:

    正确地完成工作,对每一行中的整数进行排序,并对表中的行进行排序。在表格使用的整个生命周期中,排序的成本将低于您倾向于的所有散列和反散列。当你在做的时候,在表中建立一个索引,可能从每行的前 2 或 3 个整数开始。

    【讨论】:

      【解决方案3】:

      对于快速查询,您可以预处理表。我将创建一个 HashMap,其中 15 个值的排序数组是键,列索引列表将结果排序到同一个数组中是值。例如,一个条目可能如下所示:

      [1,9,10,11,12,15,19,21,22,23,32,33,45,76,99] => [12, 33]
      

      所以这 15 个值在第 12 列和第 33 列中。

      对于键,你必须创建一个自定义的 hash 和 equals 函数。

      • 哈希的简单方法:对查询进行排序,并为每个条目计算hash *= 120941 + x。参见例如here 获得更好的哈希函数。
      • 对于相等性检查,只需将排序查询的每个索引的数字与键进行比较。

      【讨论】:

        【解决方案4】:

        正如“高性能标记”所建议的那样(我这边 +1)——确实,这是正确的方法。您应该保持行排序(以便 15 个整数按排序顺序排列在列中)。这样,在比较两行时,您可以轻松找到它们是否相同(从任何一端开始,一直持续到发现不匹配 - 如果所有 15 个数字都匹配,则它是匹配的)。

        如果您只需要一个哈希函数进行索引,那么同样的想法也可以帮助您: 将 15 个数字连续排序,并创建一个等于:

        i=1 到 15 的总和 (a_i * k^i) // k 是一个正整数 - 见下文

        这为您提供了一个相当不错的索引。如果你可以保持 k 非常大,这可以证明是无冲突的,但索引值的大小会增加。即使 k 为 2,假设整数范围为 2^16,对于 500 万行和 15 列,它在很大程度上是无冲突的。

        另一个想法 - 由于您主要关注启发式方法,您还可以考虑一种更简单的方法:

        再保留 3 列,分别表示最小值、最大值和 15 列的总和。检查这 3 个是否匹配 2 行将消除大量的真阴性。一些误报仍然存在。 (很容易注意到,在上面的方案中使用 k=1 与保持列的总和作为索引值相同,这是本子解决方案中提到的 3 个值之一。)

        [一个可能是禁区的问题 - 你的数据库设计灵活吗?这似乎不是一个稳定的设计,因为列似乎代表子实体,但我没有细节可以得出结论。]

        【讨论】:

          猜你喜欢
          • 2014-04-09
          • 1970-01-01
          • 2019-10-25
          • 1970-01-01
          • 1970-01-01
          • 2011-10-16
          • 1970-01-01
          • 1970-01-01
          • 2020-11-24
          相关资源
          最近更新 更多