常见的数据组织:数组,链表,树。数组的目的是存储,存储的目的是为了以后查找。
查找的策略:在已经存储的数据中找到需要的数据。
(1)普通查找O(n),组织方式可以无序的数组或者普通链表。
(2)已经排序的数组存储的:二分查找log2(n);
(3)二叉排序树,AV树。组织方式(链式存储的),实际上是排序的。时间复杂度O(log2(n));
以上排序方式是与数据量n有关系,显然数据量越大,这个查找的时间就越长。也就是说,我们无法保证在给定的时间值内查找到。
人们试图去寻找另外一种方式:如果时间复杂度与n无关。即O(1).hash算法。
hash函数,一个映射。目标:对任意的内容(字符串)可以在固定的时间内映射成一个整数,将这个整数作为一个大的数组的下标。在对应的数组位置存放相应的原始数据。
hash查找理想的插入和查找效率是O(1),但条件是需要找到一个良好的散列函数,使得分布较为均匀。另外hash需要较大的空间,至少要比O(n)大几倍,否则产生冲突的概率很高,通过相应的办法可以解决冲突。
使用hash函数的原则:
(1)选择的数组存储空间最好是质数。(提高散列度)
(2)运算时间和字符串长度仍然是相关的。(为了区别不同字符串)
(3)大量的位运算。
(4)仍然没有一个函数可以完全解决冲突的问题,即两个不同的字符串可能映射到一个值。
解决hash冲突问题:
(1)开地址法
出现冲突,就向下寻找。
(2)拉链法
每个单元加入链式结构,如果冲突放在链表后边。出现冲突,就往后边去查找。