折半查找
最坏查找长度为[log2n]+1,复杂度O(log2n)
int Search_Bin(SSTable ST,
KeyType key){
low=1; high=ST.length;
while (low <= high) {
mid = (low + high) / 2;
if (key=ST.elem[mid].key)
return mid;
else if(key<ST.elem[mid].key)
high=mid-1;
else
low = mid + 1;
}
return 0;
}
分块查找
对数据进行分块,使得块内无序、块间有序。将各块中的最大关键字构成
一个索引表,表中还要包含每块的起始地址。
分块查找过程
① 对索引表用折半查找定位最后一个小于等于key的块
② 确定了待查关键字所在的块后,块内采用顺序查找
优缺点
优点:删除或者插入相对容易,移动记录量变小。
缺点:要增加一个索引表的存储空间并对初始索引表进行排序运算。
适用情况:如果线性表既要快速查找又“经常”动态变化,则可采用分块
查找
二叉排序树
二叉排序树或是空树,或是满足如下性质的二叉树:
(1)若其左子树非空,则左子树上所有结点的值均小于根结点的值;
(2)若其右子树非空,则右子树上所有结点的值均大于等于根结点的值;
(3)其左右子树本身又各是一棵二叉排序树
操作
若为空,则返回NULL;
不空时:
若查找的关键字等于根结点,返回T
否则
若小于根,查其左子树,返回左子树中的查找结果
若大于根,查其右子树,返回右子树中的查找结果
BSTree SearchBST(BSTree T,KeyType key) {
if((!T) return NULL;
else {
if(key==T->data.key) return T;
else if (key<T->data.key)
return SearchBST(T->lchild,key);
else return SearchBST(T->rchild,key);
}
} // SearchBST
哈希查找
1.根据设定的哈希函数和处理冲突的方法,将一组关键字映象到一组有限的
连续的存储空间上,以关键字对应的Hash函数值作存储地址,如此所得
表称为哈希表。
映像过程称为哈希造表或散列,存储地址称为哈希地址或散列地址。
关键是构造合适的Hash函数和找合适的冲突处理方法
2.对数值型的关键字常见构造方法有:
直接定址法 数字分析法 折叠法 平方取中法 除留取余法 随机数法
3.处理冲突的方法:
开放地址法 再哈希法 链地址法 公共溢出区
内部排序方法总结比较
1.直接插入排序正序时最好时间复杂度O(n),逆序最坏O(n2),平均O(n2),
空间复杂度O(1);稳定;原始序列基本有序时该方法好
2.折半插入排序T(n)=O(n2),原本有序无序均如此,最好O(NLogN),
S(n)=O(1);稳定
3.希尔排序(缩小增量排序):平均时间复杂度O(n1.x),S(n)=O(1);不稳定
4.冒泡排序(改进)正序时间复杂度最好O(n),逆序最坏O(n2),平均O(n2),
S(n)=O(1); 稳定
5.快速排序平均时间复杂度O(nlogn),平均性能最优,正序或逆序最坏
O(n2), 有辅助栈,空间复杂度最坏O(n),平均O(logn);不稳定. 枢轴改进
6.选择排序复杂度T(n)=O(n2),原本有序无序均如此,S(n)=O(1);稳定
7.堆排序T(n)=O(nlogn),S(n)=O(1);不稳定(因为间隔着比和移动)
8.归并排序最好最坏复杂度为O(nlogn),空间复杂度O(n),稳定
9.链式基数排序最好最坏时间复杂度为O(d*(n+ rd )),空间O(rd),稳定
10.内部排序方法分类:复杂度O(n2)的简单排序方法,O(nlogn)的高效
排序方法(比较法的理论下界),O(d*(n+rd))的基数排序方法.
最坏查找长度为[log2n]+1,复杂度O(log2n)
int Search_Bin(SSTable ST,
KeyType key){
low=1; high=ST.length;
while (low <= high) {
mid = (low + high) / 2;
if (key=ST.elem[mid].key)
return mid;
else if(key<ST.elem[mid].key)
high=mid-1;
else
low = mid + 1;
}
return 0;
}
分块查找
对数据进行分块,使得块内无序、块间有序。将各块中的最大关键字构成
一个索引表,表中还要包含每块的起始地址。
分块查找过程
① 对索引表用折半查找定位最后一个小于等于key的块
② 确定了待查关键字所在的块后,块内采用顺序查找
优缺点
优点:删除或者插入相对容易,移动记录量变小。
缺点:要增加一个索引表的存储空间并对初始索引表进行排序运算。
适用情况:如果线性表既要快速查找又“经常”动态变化,则可采用分块
查找
二叉排序树
二叉排序树或是空树,或是满足如下性质的二叉树:
(1)若其左子树非空,则左子树上所有结点的值均小于根结点的值;
(2)若其右子树非空,则右子树上所有结点的值均大于等于根结点的值;
(3)其左右子树本身又各是一棵二叉排序树
操作
若为空,则返回NULL;
不空时:
若查找的关键字等于根结点,返回T
否则
若小于根,查其左子树,返回左子树中的查找结果
若大于根,查其右子树,返回右子树中的查找结果
BSTree SearchBST(BSTree T,KeyType key) {
if((!T) return NULL;
else {
if(key==T->data.key) return T;
else if (key<T->data.key)
return SearchBST(T->lchild,key);
else return SearchBST(T->rchild,key);
}
} // SearchBST
哈希查找
1.根据设定的哈希函数和处理冲突的方法,将一组关键字映象到一组有限的
连续的存储空间上,以关键字对应的Hash函数值作存储地址,如此所得
表称为哈希表。
映像过程称为哈希造表或散列,存储地址称为哈希地址或散列地址。
关键是构造合适的Hash函数和找合适的冲突处理方法
2.对数值型的关键字常见构造方法有:
直接定址法 数字分析法 折叠法 平方取中法 除留取余法 随机数法
3.处理冲突的方法:
开放地址法 再哈希法 链地址法 公共溢出区
内部排序方法总结比较
1.直接插入排序正序时最好时间复杂度O(n),逆序最坏O(n2),平均O(n2),
空间复杂度O(1);稳定;原始序列基本有序时该方法好
2.折半插入排序T(n)=O(n2),原本有序无序均如此,最好O(NLogN),
S(n)=O(1);稳定
3.希尔排序(缩小增量排序):平均时间复杂度O(n1.x),S(n)=O(1);不稳定
4.冒泡排序(改进)正序时间复杂度最好O(n),逆序最坏O(n2),平均O(n2),
S(n)=O(1); 稳定
5.快速排序平均时间复杂度O(nlogn),平均性能最优,正序或逆序最坏
O(n2), 有辅助栈,空间复杂度最坏O(n),平均O(logn);不稳定. 枢轴改进
6.选择排序复杂度T(n)=O(n2),原本有序无序均如此,S(n)=O(1);稳定
7.堆排序T(n)=O(nlogn),S(n)=O(1);不稳定(因为间隔着比和移动)
8.归并排序最好最坏复杂度为O(nlogn),空间复杂度O(n),稳定
9.链式基数排序最好最坏时间复杂度为O(d*(n+ rd )),空间O(rd),稳定
10.内部排序方法分类:复杂度O(n2)的简单排序方法,O(nlogn)的高效
排序方法(比较法的理论下界),O(d*(n+rd))的基数排序方法.