Hash算法
给N (1<N<10)个自然数,每个数的范围为(1~10000),以最快速度判断某一个数是否在这N个数内。
N:5 10,52,63,15 判断7在不在其中
可以用二分法,但二分法的前提条件是有序 。 所以采用 排序+二分的方式,算法复杂度为 O(nlogn)
下面是hash算法:O(1)
int a[] = new int[n];//数组的下标表示序列里面的数 最开始把a[]数组全部置为0--
a[0] = 0;//表示0不存在于n个数中
a[1] = 1;//表示1存在于n个数中
a[10] = 1;
判断7 即判断a[7]是不是等于1.但当数组个数多的时候不好判断
由Hash函数:取模:10个数最多对应10个空间,对N取模
10%10 = 0 ==> a[0] = 10;
52%10 = 2 ==> a[2] =52
63%10=3 ==> a[3] = 63;
a[1] =1;
a[5] = 5;
找7: 7%10 = 7 ==>a[7] = -1 所以7不存在其中
如果数组中还含有一个20,则 20%10 = 0, == > a[0] = 10,20出现冲突,就是所说的哈希冲突。
Hash的效率取决于冲突的数量,通过hash算法,冲突越多,效率就越低。所以一个好的hash函数可以决定hash的效率。
HashMap:
JDK1.7:数组+链表
JDK1.8:数组+链表+红黑树
链表:链式结构,插入删除快,查找慢
链表存的数据个数大于8个就变成红黑树,其实就是Hash冲突的数量。