1 **
查找
**
按照查找的引出的先后顺序介绍:
1. 静态查找(树)表
静态查找表(Static Search Table):只作查找操作的查找表。
A:查询某个“特定”数据元素是否在查找表中;
B:检索某个“特定”数据元素和各种属性。
以下介绍的是有序表查找,无序表只能顺序查找。
二分查找
作为有序表查找的一种非常普通且实用的方法。大家并不陌生。
思想:先确定待查记录所在的范围(区间),然后逐步缩小范围找到或找不到该记录为止。如果mid对应值大于key,high = 密度-1;如果mid对应值小于key,low = mid + 1;否则找到结果。
性能分析:对于任意的n,当较大(n>50)时,假设表中每个记录的查找概率相等(1/n),则查找成功时折半查找的近似平均查找长度为= log2(n+1)-1。
斐波那契查找
原理:根据斐波那契序列的特点对表进行分割。
其中:
假设开始时数组A中记录个数比某个斐波那契数小1,即n=Fu-1,然后将给定值key和查找序列中A[Fu-1]进行比较,
若相等,则查找成功
若key > A[Fu-1],则在A[Fu-1+1]至A[Fu-1]区间的数组中进行查找;
若key < A[Fu-1],则继续在A[0]至A[Fu-1-1]区间的数组中进行查找;
性能分析:斐波那契查找的平均性能比折半查找好,但最坏情况下的性能 (虽然仍为O(lgn)) 却比折半查找差。
小小优点:分割时只需进行加、减运算。
插值查找
原理:是根据给定值key来确定进行比较关键字A[i]的查找方法。
其中,A[l]和A[h]分别为有序表中具有最小关键字和最大关键字的下标
性能比较:它只适合于关键字均匀分布的数组,在这种情况下,对数组较长的数组来说,其平均性能比折半查找好。
由于上面讨论的查找都是等概率的查找,如果待查找数为非等概率出现,那么上述的方法并非是使平均查找长度最短
静态最优查找树(SOST)
提出背景:
定义:
性能分析:由于构造的代价比较大,达到O(n^3)
次优查找树(NOST)
提出背景:对于上述查找的所有结点来说,它们的出现是等概率的;
当它们被查找的概率不同时,这时原来的为了使整体的ASL(平均查找长度)最小
定义:递归定义,推到公式
构造过程:1、按照元素值大小进行排序,并记录每个元素的概率
2、每次选择最小的P值作为该子树的根
性能分析:
索引顺序表
提出背景:
定义:
原理:缩小区间的查找过程
性能:可以折半查找
2. 动态查找(树)表
动态查找表(Dynamic Search Table):在查找过程同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。
A:查找是插入数据元素;
B:查找时删除数据元素。
二叉排序树或平衡二叉树-BST
提出背景:对于有序表的查找来说,在进行二分查找时,
定义:
平衡二叉查找树-AVL
提出背景:
定义:对于树中每个结点来说,它的左右子树高度差的绝对值不超过1
B树、B+、B-
提出背景:
键树
引入原因:
最优二叉树—huffman树—不是查找树的一种,可以做对比
3. 哈希表
2 算法复杂度
常见的几种排序算法复杂度如下:
方式: 平均 最坏 最好
插入 n^2 n^2 n
希尔 n^1.3 / /
冒泡 n^2 n^2 n
快速 nlogn n^2 nlogn
选择 n^2 n^2 n^2
堆排 nlogn nlogn nlogn
归并 nlogn nlogn nlogn
基数 d(n+r) d(n+r) d(n+r)