平均情况下的运行时间增长数量级:
算法 | 查找 | 插入 |
---|---|---|
顺序查找 | N/2 | N |
二分查找 | lgN | N/2 |
二叉查找树 | 1.39lgN | 1.39lgN |
红黑树 | 1.00lgN | 1.00lgN |
B树 | ||
Hash查找(拉链法) | N/2M | N/M |
Hash查找(线性探测) | <1.5 | <2.5 |
分析插入的运行时间:
顺序查找:插入新元素前,需要对比所有元素,所以是N
二分查找:插入新元素前,会将所有较大的元素向后移动一格(实际上应该是lgN+N/2,lgN是查找的时间)。对于静态表(不允许插入)来说,二分查找很有优势。
二叉查找树:插入操作和查找未命中平均比查找命中需要一次额外的比较。
红黑树:除了递归调用后的三条if语句,红黑树中插入的递归实现和二叉查找树相同。红黑树中根节点到任意节点的平均路径长度为1.00lgN。
- PS:为什么提出红黑树?
- 由于树的形状影响二叉查找树的效率,所以为了得到分布均匀的树,保持二叉查找树的平衡性,提出2-3树的数据结构,(为什么2-3树能在插入元素后继续保持平衡?由下向上生长,所有空链接到根节点的距离相等)但2-3树实现复杂,我们用红黑二叉查找树的简单数据结构来表达并实现它。基本思想是用标准的二叉查找树(完全由2-节点构成)和一些额外的信息(红链接将两个2-节点构成一个3-节点)来表示2-3树。定义是含有红黑链接并满足下列条件的二叉查找树:1.红链接均为左链接2.没有任何一个节点同时和两条红链接相连 3.该树是完美黑色平衡的。
Hash查找(拉链法):M条链表,每条平均长度为N/M。
Hash查找(线性探测法):在一张大小为N并含有M=a*N个键的基于线性探测的散列表中,命中和未命中的查找所需的探测次数分别为: 0.5+0.5/(1−a)和0.5+0.5/(1−a)2 。我们用动态数组保证a<0.5。