栈、队列、链表(单向/双向/循环)、树(二叉树/普通树【左孩子右兄弟表示法】)
散列表,普通数组概念的推广,普通数组可以直接寻址,能在O(1)时间内访问数组任意位置;如果存储空间允许,可以提供一个数组,为每个可能的关键字保留一个位置,然而
实际存储的关键字数目比全部的可能关键字总数要小,因此采用散列表是一种比较有效的替代方式。
散列表不是直接把关键字作为数组的下标,而是根据关键字计算出相应的下标
一个动态集合,n
个元素,每个元素都是取自于全域
U={0, 1, ..., M-1}中的一个关键字
直接寻址方式:为全域分配m个槽,关键字为k的元素存放在对应的槽k中
散列表:分配m个槽,
关键字为k的元素存放在槽h(k)中;
槽的个数m由散列函数决定,h : U -> {0, 1, ..., m-1}
冲突:两个关键字映射到同一个槽中
一方面可以通过精心设计散列函数来尽量减少冲突的个数,另一方面需要解决出现冲突的问题
链接法:同一槽中的所有元素放在一个链表中
开放寻址法:所有的元素都存放在散列表里;因此散列表可能被填满,从而不能再插入新的元素
处理冲突——通过
探查空槽来放置待插入的关键字
1) 线性探查:h(k, i) = (h'(k) + i) mod m;
i表示第i次探查
2) 二次探查:h(k, i) = (h'(k) + ci + di^2) mod m
3) 双重散列:h(k, i) = (h1(k) + ih2(k)) mod m