【问题标题】:Hash Table + Binary Search哈希表 + 二分查找
【发布时间】:2015-11-14 15:45:33
【问题描述】:

我正在使用哈希表来存储一些值。以下是详细信息:

  1. 将存储大约 100 万个项目(以前未知,因此不可能进行完美哈希)。
  2. 表有 10M 大。
  3. 哈希函数是 MurMurHash3。

我做了一些测试并存储了 1M 的值,我得到了 350,000 个冲突和 30 个元素在最冲突的哈希表的插槽中。

这些结果好吗?

对在冲突哈希表的槽中创建的列表实施二进制搜索是否有意义?

您对提高性能有何建议?

编辑:这是我的代码

var
  HashList: array [0..10000000 - 1] of Integer;

for I := 0 to High(HashList) do
  HashList[I] := 0;

for I := 1 to 1000000 do
begin
  Y := MurmurHash3(UIntToStr(I));
  Y := Y mod Length(HashList);
  Inc(HashList[Y]);
  if HashList[Y] > 1 then
    Inc(TotalCollisionsCount);
  if HashList[Y] > MostCollidingSlotItemCount then
    MostCollidingSlotItemCount := HashList[Y];
end;

Writeln('Total: ' + IntToStr(TotalCollisionsCount) + ' Max: ' + IntToStr(MostCollidingSlotItemCount));

这是我得到的结果:

Total: 48169 Max: 5

我错过了什么吗?

【问题讨论】:

  • 1) 您在 1000 万个盒子上分发 100 万件物品? 2) 你对碰撞的定义是什么?
  • 1) 是 2) 映射到表中同一个槽的两个不同键
  • 随机填充时每个单元格的预期元素数:0:9048K 1:905K 2:45K 3:1K5 4:50 结论:您的哈希函数很糟糕(或您的数据包含重复项)
  • 我尝试将十进制数字(作为字符串)从 1 散列到 1000000。我也得到了与 SHA1 相同的结果。
  • 检查你的字符串。对于数字键,乘以一个大的奇数(最好是素数)与 real 散列函数一样好。

标签: hashtable binary-search


【解决方案1】:

这是您将 100 万个项目随机放入 1000 万个单元格时得到的结果

calendar_size=10000000 nperson = 1000000
E/cell| Ncell | frac   |  Nelem   |  frac  |h/cell|  hops  | Cumhops
----+---------+--------+----------+--------+------+--------+--------
  0:  9048262 (0.904826)        0 (0.000000)     0        0        0
  1:   905064 (0.090506)   905064 (0.905064)     1   905064   905064
  2:    45136 (0.004514)    90272 (0.090272)     3   135408  1040472
  3:     1488 (0.000149)     4464 (0.004464)     6     8928  1049400
  4:       50 (0.000005)      200 (0.000200)    10      500  1049900
----+---------+--------+----------+--------+------+--------+--------
  5: 10000000             1000000                1.049900    1049900

左列是单元格中的项目数。第二个:有这个itemcount的单元格个数。


WRT 二进制搜索:很明显,对于像这样的小表(最大链长度=4,但大多数链的长度=1),线性搜索优于二进制搜索。接管点可能在 10 到 100 之间。

【讨论】:

    猜你喜欢
    • 2016-03-11
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2018-06-14
    • 2010-11-26
    • 2012-07-02
    相关资源
    最近更新 更多