哈希表+二进制搜索

时间:2015-11-14 15:45:34

标签: hashtable binary-search

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

  1. 将存储大约1M个项目(以前不知道,所以不可能有完美哈希)。
  2. 表格大10M。
  3. 哈希函数是MurMurHash3。
  4. 我做了一些测试并存储了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 个答案:

答案 0 :(得分:1)

这是将1M项随机放入10M单元格

时的结果
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之间。