1、直接寻址表:时间复杂度O(1)
一个对象的关键字对应表中一个下标,表中存储的指向该对象的指针。
**缺点:**若对象关键字很多,导致需要建立的表很大,当存储的对象不多时,空间浪费。
2、散列表:时间复杂度O(1)
在直接寻址方式下,具有关键字k的元素被存放在槽k中。在散列方式下该元素存放在槽h(k)中;即利用散列函数h,由关键字k计算出槽的位置。这里,函数h将关键字的全域U映射到散列表T[0…m-1]的槽位上。
h:U->{0,1,…,m-1}
由于U>=m,因此冲突无法避免,但可以选择较好的散列函数h尽量减少冲突。
链接法解决冲突:
将散列到同一槽中的所有元素都放在一个链表中,如图,槽j中有一个指针,指向存储所有散列到j的元素的链表的表头,如果不存在这样的元素,则槽j中为NULL。
此时散列表是一个链表指针数组。
3、散列函数:
3.1、除法散列法:
通过取k除以m的余数,将关键字k映射到m个槽位中的某一个上。即散列函数:
h(k) = k mod m
3.2、乘法散列法:
4、开放寻址法:
参考资料:算法导论11章 散列表