哈希表,散列表—搜索专用的数据结果
背后的核心数据结构:数组 <-根据数组的随机访问的时间复杂度是o(1)
1.根据元素(关键字) =>确定一个整型的数值 分类编号
整型数值 = f(元素) f:哈希函数
2.上一步得到的整型数据,范围大。所以需要再把整型约束回合法的下标中
3.元素放入数组的该位置中
int [] array = new int[26] 数组的元素代表该位置字母的出现次数
a->0,b->1…
String cur = “asdasdasda”;
for( ch : cur.toCharArray()){
int index = f(ch);
array[index] ++:
}
这个就是一个哈希表的体现。
哈希冲突
例如: k1.quals(k2) == false && hash(k1) == hash(k2 )
1.哈希冲突的发生是否是必然的?
我们准备的哈希表是通用的,所以往往是无法避免的,
因为为了避免空间浪费
2.遇到哈希冲突的解决办法
1.闭散列:不引入新的结构,完全在数组中解决问题。(如果发生了被占用的情况,找打其他位置)
2.开散列 --哈系统
数组中的元素不再是 关键字元素了,而是关于关键字的一条链表
冲突是一个链表
1.冲突无法避免,但需要把冲突率降到一定的有效范围内
1.哈希函数需要设计合理
反例:func(Key key) {return 0;}
2.冲突率和某个数据有关
负载因子 = 个数/长度
int Object.hashCode();
1.留给个