几种基础查找方法的性能比较:
算法(数据结构) | 查找(最坏) | 插入(最坏) | 查找命中(平均) | 插入(平均) | 插入(平均)是否支持有序性相关操作 |
顺序查询(无序联播) | N | N | N/2 | N | 否 |
二分查找(有序数组) | lgN | N | lgN | N/2 | 是 |
二叉树查找(二叉查找树) | N | N | 1.39lgN | 1.39lgN | 是 |
2-3树查找(红黑树) | 2lgN | 2lgN | 1.00lgN | 1.00lgN | 是 |
拉链法(链表数组) | <lgN | <lgN | N/(2M) | N/M | 否 |
线性探测法(并行数组) | clgN | clgN | <1.5 | <2.5 | 否 |
顺序查找:在表中查找一个不存在的键时,我们会将表中每个键和给定的键比较(N)。因为不允许出现重复的键,每次插入操作之前我们都需要这样查找一遍。
推论: 向一个空表中插入N个不同的键需要~N²/2次比较。
二分查找:在N个键的有序数组中进行二分查找最多需要(lgN+1)次比较(无论是否成功)。插入一个新的元素在最坏情况下要访问~2N次数组。
推论: 向一个空表中插入N个不同的键需要~N²/2次比较。
二叉树查找:使用二叉查找树的算法运行时间取决于树的形状。最好的情况下含有N个节点的树是完全平衡的,每条空链和根节点的距离都为~lgN;最坏情况下,搜索路径上可能有N个节点(此时相当于顺序查找)。
相对于二叉查找树,散列表的优点在于代码更简单,且查找时间最优。
二叉查找树相对于散列表的优点在于抽象结构更简单(不需要设计散列函数),红黑树可以保证最坏情况下的性能且他能够支持的操作更多(如排名,选择,排序和范围查找)。
根据经验法则,大多数程序员的第一选择都是散列表,在其他因素更重要时才会选择红黑树。