- 给出一个序列:
47 7 29 11 9 84 54 20 30 如何才能对它们进行排序并且要查找它的位置的时候特别方便?
散列表就是找出每一个数据的关键字并且按照关键字存放在特定的位置;
核心思想就是弄一个映射函数H(key),使得key的位置ret=H(key)
除留余数法是找出某个数字p,让位置ret=key%p;
当然很有可能在存放了几个之后就会有重叠位置的情况发生,也就是冲突。
这里解决冲突的方法是平方探测法:让这个重叠的初始位置ret去加Di;
Di是一段序列:1^2,-1^2,2^2,-2^2.... 其中i是发生冲突的次数
例如说p=11.存放数字7的时候没问题(ret=7%11=7),然而存放29的时候(ret=29%11=7)
发生了冲突,那么第一次冲突就加1,也就是前进一格.8这个位置没有别的数据,不会冲突,所以存放在8;冲突解决
如果8这个位置也存放了其他的数字,那就是第二次冲突,这次要加D2也就是ret=(-1)=6;倒退一格
如果6这个位置也冲突那么就加D3也就是加4,前进四格...
循环下去直到找到空位置为止.
这里关键是找到这里的“某个数字p”。除留余数法中的p指的其实是散列表的最大储存空间。一般是比原序列大的素数。取素数是为了减少冲突。
这里的p用T