在计算机科学中,据说哈希表的插入、删除和查找操作的复杂度为O(1),这是最好的。所以,我想知道,既然哈希运算如此之快,为什么我们需要使用其他数据结构呢?为什么我们不能简单地使用哈希/哈希表来处理所有事情?
平均而言,哈希表在插入、检索和删除方面确实具有出色的时间复杂度。但是:
Big-O 复杂性并不是一切。 常数因子也非常重要。您可以使用哈希表代替数组,并将数组索引作为哈希键。无论哪种情况,检索项目的时间复杂度都是 O(1)。但与数组相比,哈希表的常数因子要高得多。
。对于某些极端情况(例如,所有数据都落入同一个桶中),效率会很低。
仍然有一个很好的观点。哈希表有非常广泛的合适用例。这就是为什么它们是某些脚本语言(例如 Lua)中主要的内置数据结构。
HashTable
并不是所有人的答案。如果你的哈希函数没有很好地分配你的密钥,那么在最坏的情况下,
hashMap
可能会变成linkedList
,而插入、删除、搜索在最坏的情况下将需要O(N)
。
HashMap
具有显着的内存占用,因此在某些用例中,您的内存比时间复杂度更宝贵,那么您
HashMap
可能不是最佳选择。
HashMap
不是范围查询或前缀查询的答案。这就是为什么大多数数据库供应商确实通过
Btree
实现索引,而不是仅通过范围或前缀查询的哈希来实现。
HashTable
通常表现出较差的引用局部性,即要访问的数据在内存中看似随机分布。