1
我正在使用哈希表来存储一些值。这里是详细信息:哈希表+二进制搜索
- 将有大约1M项存储(以前不知道,所以没有完美的哈希可能)。
- 表是10M大。
- 散列函数是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)您是否在10M盒子上分配了1M项目? 2)你对碰撞的定义是什么? – wildplasser
1)是 2)映射到表中相同插槽的两个不同键 – Alex
随机填充时每个单元的预期元素数:0:9048K 1:905K 2:45K 3:1K5 4:50结论:您的散列函数是可怕的(或您的数据包含重复项) – wildplasser