哈希表
散列(hash)是以常数平均时间复杂度进行插入,删除和查找的继续,但不支持排序操作。
每个关键字被映射到从0到TableSize-1范围中的某个数,并放到适当的单元中,这个映射就叫做散列函数(hash function),理想情况下不同关键字映射到不同单元,但由于单元有限,因此要寻找散列函数在单元间均匀地分配关键字。当两个关键字散列映射到同一个值的时候称为冲突。解决冲突的方法有几种,包括分离链接发和开放定址法。
分离链接法将散列到同一个值的所有元素保留到一个表中,每个表都有表头,执行find时,使用散列函数确定究竟考察哪个表,然后遍历该表,找到并返回位置;执行insert时,遍历相应的表检查该元素是否已经处于适当的位置,若为新元素则插入表头或表尾。缺点是需要指针,分配地址减缓了速度,同时还需要实现链表。
开放定址法也是用链表解决冲突,当发生冲突就尝试另外选择单元,直到找到空的单元。
h(x) = (h(x) + F(i)) mod TableSize
(1)线性探测法:函数F是i的线性函数,典型的为F(i)= i,若产生冲突,则放入下一个空闲地址。
1,2,3,…,m-1
故只要表足够大,总能找到一个自由单元,但花费时间相对多。更糟的是占据的单元会形成一些区块,称为一次聚集,散列到区块中任何关键字都需要多次试选才能添加到相应区块。
(2)平方探测法:消除线性探