总结一下各种查找算法的性能
下表:各种符号表实现的渐进性能的总结
算法(数据结构) | 最坏情况的运行时间的增长数量级(N次插入后) 查找 插入 | 平均情况下的运行时间的增长数量级(N次随机插入之后) 查找命中 插入 | 关键接口 | 内存使用(字节) | 是否支持有序性相关的操作 |
---|---|---|---|---|---|
顺序查找(无序链表) | N N | N/2 N | equals() | 48N | 否 |
二分查找(有序数组) | lgN N | lgN N/2 | compareTo() | 16N | 是 |
二叉树查找(二叉查找树) | N N | 1.39lgN 1.39lgN | compareTo() | 64N | 是 |
2-3树查找(红黑树) | 2lgN 2lgN | 1.00lgN 1.00lgN | compareTo() | 64N | 是 |
拉链法*(链表数组) | <lgN <lgN | N(2M) N/M | equals() hashCode() | 48N + 32M | |
线性探测法*(并行数组) | clgN clgN | <1.5 <2.5 | equals() hashCode() | 在32N和128N之间 |
带*需要均匀并独立的散列函数
下面总结各查找算法的特点
符号表来描述一张抽象的表格,我们会将信息(值)存储在其中,然后按照指定的键来搜索并获取这些信息。符号表有时被称为字典,有时又叫做索引
以下的算法不单纯是只有查找,还有一套数据结构和应用的api,api有对应这种查找方法的相关要实现的方法(理解上不要单纯想是只有查找,是一整套的思想)
符号表的各种实现的优缺点
使用的数据结构 | 实现 | 优点 | 缺点 |
---|---|---|---|
链表(顺序查找) | SequentialSearchST | 适用于小型问题 | 对于大型符号表很慢 |
有序数组(二分数组) | BinarySearchST | 最优的查找效率和空间需求,能够进行有序性相关的操作 | 插入操作很慢 |
二叉查找树 | BST | 实现简单,能够进行有序性相关的操作 | 没有性能上界的保证,链接需要额外的空间 |
平衡二叉树 | RedBlackBST | 最优的查找和插入效率,能够进行有序性相关的操作 | 链接需要额外的空间 |
散列表 | SeparaChainHashST LinearProbingHashST | 能够快速地查找和插入常见类型的数据 | 需要计算每种类型的数据的散列 无法进行有序性相关的操作 链接和空结点需要额外的空间 |
-
顺序查找(无序链表)
特点:1.在含有N对键值的基于(无序)链表的符号表中,未命中的查找和插入操作都需要N次比较。命中的查找在最坏情况下需要N次比较。特别地,先给一个空表中插入N个不同的键需要 ~N^2次比较 -
有序数组的二分查找
使用的数据结构可以是一对平行的数组,一个存储键,一个存储值,实现核心是rank()方法,它返回表中小于给定键的键的数量(即是数组下标)特点:1.在N个键的有序数组中进行二分查找最多需要(lgN + 1)次比较,无论是否成功
2.向大小为N的有序数组中插入一个新的元素在最坏下需要访问 ~2N词数组,因此向一个空符号表中插入N个元素在最坏情况下需要访问 ~N^2次数组 -
二叉查找树
每个结点都含有一个Comparable的键(以及相关联的值)且每个结点的键都大于其左右子树中的任意结点的键而小于右子树的任意结点的键。使用二叉查找树的算法的运行时间取决于树的形状,而树的形状又取决于键被插入的先后顺序。在最好的情况下,一棵含有N个结点的树是完全平衡的,每条空链接和根结点的距离都为~lgN。最坏的情况下,搜索路径下可能有N个结点。特点:1.在由N个随机键构成的二叉查找树中,查找命中平均所需的比较次数为~2lnN(约1.39lgN)
2.在由N个随机键构造的二叉查找树中插入操作和查找未命中平均所需的比较次数为~2lnN(约1.39lgN)
3.在一棵二叉查找树中,所有操作在最坏的情况下所需的时间都和数的高度成正比 -
平衡查找树
2-3查找树:将一棵标准的二叉查找中的结点称为2-结点(含有一个键和两条链接),现在引入3-结点,它含有两个键和三条链接。2-结点和3-结点中的每条链接都对应着其中保存的键所分割产生的一个区间。一棵完美平衡的2-3查找树中的所有空链接到根结点的记录都应该是相同的。特点:1.在一棵大小为N的2-3树中,查找和插入操作访问的结点必然不超过lgN个
红黑二叉查找树:用标准的二叉查找树(完全由2-结点构成)和一些额外的信息(替换3-结点)来表示2-3树。将树中的链接分为两种类型:红链接将两个2-结点连接起来构成一个3-结点,黑链接则是2-3树中的普通链接。无需修改就可以直接使用标准二叉查找树的get()方法。红黑二叉查找树一种等价的定义:1.红链接均为左链接,2.没有任何一个结点同时和两条红链接相连,3.该树是完美黑色平衡的,即任意空链接到根结点的路径上的黑链接数量相同
特点:1.一棵大小为N的红黑树的高度不会超过2lgN
2.一棵大小为N的红黑树中,根结点到任意结点的平均路径长度为~1.00lgN
3.在一棵红黑树中,以下操作在最坏情况下所需的时间是对数级别的:查找get(),插入put(), 查找最小键,查找最大键,floor(),ceiling(), rank(), select(), 删除最小键deleteMin(),删除最大键deleteMax()和范围查找range()