对初始化传入一个M值的哈希表性能的思考

来源:14-7 哈希表更复杂的动态空间处理方法

慕粉3169703

2019-08-04

一个哈希表的性能差异主要取决于M的取值,选取一个合适的M值,会使得每次操作后哈希表数据分布得更均匀,相应地哈希冲突也会减少。如果有一种情况,再操作哈希表之前,我们事先知道要操作数据的规模大小N,是不是可以直接调用带M参数的构造函数,传入的M等于N,来初始化一个哈希表。这样每次进行add或者remove的时候,能够保证每个数组元素对应的treeMap容量最大为1(key可能有重复)。这样来看,每个数组位置最多存放一个数据?这样,用链地址表法是不是就不会存在哈希冲突了。并且,add或remove操作也不会有扩容和缩容的操作了?这样初始化的哈希表性能是不是相对更好呢?

写回答

1回答

liuyubobobo

2019-08-05

我不确定我是不是理解了你的问题。


M保证数据分布均匀,关键是我们实现的代码中,这个哈希函数的计算,得到的哈希值,尽量均匀:

private int hash(K key){    
    return (key.hashCode() & 0x7fffffff) % M;    
}


这里关键是,对M求余。如果M是合数,很容易不均匀,课程中有介绍。所以,并不是M的取值等于你的数据量N,是最好的。因为,关键是你的具体数据是什么。在哈希表的定义下,你的具体数据是什么,用来计算哈希值,进而,用来计算数据存储的位置。数学上,M取素数,可以最大程度保证,不管你的数据是什么,得到的分布最均匀的概率最大。


继续加油!:)

1
0

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程