我正在使用哈希表来存储一些值。以下是详细信息:
我做了一些测试并存储了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
我错过了什么吗?
答案 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之间。