折半查找(二分查找)
1.顺序表 等概率
2.low mid high
3.判定二叉树
4.递归到非递归属于第一种 简单的循环可以解决,所以在递归里面的出口条件不需要while语句。
1) 递归方法实现:
int BSearch(elemtype a[],elemtype x,int low,int high)
/*在下届为low,上界为high的数组a中折半查找数据元素x*/
{
int mid;
if(low>high) return -1;
mid=(low+high)/2;
if(x==a[mid]) return mid;
if(x<a[mid]) return(BSearch(a,x,low,mid-1));
else return(BSearch(a,x,mid+1,high));
}
2) 非递归方法实现:
int BSearch(elemtype a[],keytype key,int n)
{
int low,high,mid;
low=0;high=n-1;
while(low>=high)
{
mid=(low+high)/2;
if(a[mid].key==key) return mid;
else if(a[mid].key<key) low=mid+1;
else high=mid-1;
}
return -1;
}
int BSearch(elemtype a[],elemtype x,int low,int high)
/*在下届为low,上界为high的数组a中折半查找数据元素x*/
{
int mid;
if(low>high) return -1;
mid=(low+high)/2;
if(x==a[mid]) return mid;
if(x<a[mid]) return(BSearch(a,x,low,mid-1));
else return(BSearch(a,x,mid+1,high));
}
2) 非递归方法实现:
int BSearch(elemtype a[],keytype key,int n)
{
int low,high,mid;
low=0;high=n-1;
while(low>=high)
{
mid=(low+high)/2;
if(a[mid].key==key) return mid;
else if(a[mid].key<key) low=mid+1;
else high=mid-1;
}
return -1;
}
计算式的查找方法---哈希法
数字分析 平方取中 分段叠加 除留余数 伪随机数
2.处理冲突的方法
开放地址 再哈希法 链地址法 建立公共溢出区
3.性能分析
ASLunsucc ASLsucc
动态查找表
一:二叉排序树
1.小左大右
2.其删除的两种方法
二:平衡二叉树(AVL)
1.左旋和右旋
三:B-树
1.文件系统所用
2.平衡的多路查找树(类似于二叉排序树,只是每个结点有多个孩子)
3.其插入和删除涉及到分裂和合并(由于每层的孩子个数是有限制的)
四:键树
1.存储方法:
1)双链树----孩子兄弟链表(每个结点存它的第一个孩子,它的右面的兄弟)
2Trie树-----多重链表
1.小左大右
2.其删除的两种方法
二:平衡二叉树(AVL)
1.左旋和右旋
三:B-树
1.文件系统所用
2.平衡的多路查找树(类似于二叉排序树,只是每个结点有多个孩子)
3.其插入和删除涉及到分裂和合并(由于每层的孩子个数是有限制的)
四:键树
1.存储方法:
1)双链树----孩子兄弟链表(每个结点存它的第一个孩子,它的右面的兄弟)
2Trie树-----多重链表
分块查找
1.又叫索引顺序表查找
2.折半查找+顺序查找
块与块之间是有序的 + 块内元素是无序的
次优查找树
1.在非等概率的前提下。
2.PH值(权值*层取和)近似最小,不是最优查找树。
3.eg:
关键字: A B C D E
权值:0 1 30 2 29 3
0 1 31(30+1) 33(31+2) 62 65
64((65-1)-0) 33((65-31)-1)1 30 26
取值: C