我想比较哈希表和基数树。对于固定长度的键,当然,考虑到我们不关心排序顺序,哈希表总是最好的选择,但是对于可变长度的键,事情要复杂得多,所以问题将假设可变长度的键。
时间复杂度:
我尝试了以下操作,其中 data1 是“testtesttest...”,data2 是“testtesttest...2”(它们各自的长度为 40000,并且 data2 最后只有一个字符串与 data1 不同)。对于哈希表插入,唯一耗时的是哈希函数,所以我只使用哈希函数,尽管这不是大多数语言使用的 has 函数。
console.time();
radixTree.addWord(data1);
radixTree.addWord(data2);
console.timeEnd();
console.time();
keccak256(data1);
keccak256(data2);
console.timeEnd();
基本上,在基数树中添加 2 个这样的字符串需要 9 毫秒,而在哈希函数中需要 2 毫秒。您可以添加额外的开销来实际将其存储在哈希表中(因为我在这里没有使用它),但最多需要 3 毫秒。所以 9 毫秒 vs 3 毫秒。为什么说这两种算法的插入时间都是O(n)?
如果我们不关心有序集而只是构建字典,我就看不到raddix树在性能方面胜过哈希表。就内存而言,第一次创建哈希表可能会占用更多内存,但就时间复杂度而言,哈希表总是会带来更好的性能。你的想法?
只有当您将基数树与其他树进行比较并且需要有序列表时,基数树才是好的,这不是真的吗?
使用某种基数树(通常是大型扇出 B 树变体)而不是可变长度键的哈希表的常见原因: