用素数可以降低hash冲突,为什么hashmap底层使用二倍扩容的方式,这样做的目的是为什么?

来源:14-8 更多哈希冲突的处理方法

慕容9198694

2018-07-04

写回答

1回答

liuyubobobo

2018-07-04

事实上,HashTable底层实现,扩容不是二倍方式,而是二倍加一。即原来有c的空间,经过扩容以后,有2*c+1的空间:)(initialCapacity取11)


这个方案是在编程简单和“尽量”避免哈希冲突之间的一个平衡。使用这种方式,即使某个空间大小不是一个素数,也不会像不断乘以二那样糟糕:)


如果你学习过我的《算法与数据结构》,并且看过第二章的补充代码:希尔排序,就会知道,其实在希尔排序中,也使用过类似的技巧。对于希尔排序的步长数列,数学家给出了很多最优解的猜想,不过通常,我们编程实现,直接使用3*h+1的方式获得这个步长序列。生成简单,又不失效率:)

0
5
慕容9198694
回复
liuyubobobo
谢谢你,老师用心了??
2018-08-09
共5条回复

玩转数据结构

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

6221 学习 · 1704 问题

查看课程