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
Database 提高查找行(整型列)的速度_Database_Algorithm_Search_Hash - Fatal编程技术网

Database 提高查找行(整型列)的速度

Database 提高查找行(整型列)的速度,database,algorithm,search,hash,Database,Algorithm,Search,Hash,我有一个15整数列,表中有5000000行。给定一个包含15个整数的输入记录,我需要将输入记录与5000000记录表进行比较,并获得所有匹配的行 注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整数列,表中有5000000行。给定一个包含15个整数的输入记录,我需要将输入记录与5000000记录表进行比较,并获得所有匹配的行

注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行返回相同的索引。这并不多,但应该可以让您开始

您可能需要一个哈希函数,该函数生成尽可能少的冲突;但它也必须是可交换的(即:向散列中添加数字的顺序是不相关的)。您可以通过使用异或和位移位的组合来实现这一点(参见此)


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

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

[1,9,10,11,12,15,19,21,22,23,32,33,45,76,99] => [12, 33]
因此,15个值在第12列和第33列中

对于键,您必须创建一个自定义哈希和等于函数

  • 散列的一个简单方法是:对查询进行排序,并为每个条目计算
    hash*=120941+x
    。有关更好的哈希函数,请参见
  • 对于相等性检查,只需将排序查询的每个索引的编号与键进行比较

正确执行此操作,对每行中的整数进行排序,并对表中的行进行排序。在表的使用寿命期间,排序的成本将低于您所倾向的所有散列和非散列。同时,在表中建立一个索引,可能是从每行的前2或3个整数开始。

与“High Performance Mark”(高性能标记)的建议完全相同(+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个值之一。)


[这可能是一个禁区问题-您的DB设计是否灵活?这似乎不是一个稳定的设计,因为列似乎代表子实体,但我没有能够得出结论的详细信息。]

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