1.顺序查找
顺序查找又叫线性查找,主要用于在线性表(顺序表和链表均可)中进行查找。
基本思想:从线型表一端开始,逐个检查关键字是否满足给定的条件。
ASL=(n+1)/2
2.折半查找
又称为二分查找。仅适用于有序的顺序表。
基本思想:将给定的关键字和给定序列中间位置关键字比较,若相等则成功;若不相等,则在中间元素的前半部分或后半部分范围重复查找,直到找到,或查找不成功。
查找判定树:
ASL(成功)如上图。
3.分块查找
又称为索引顺序查找。
基本思想:将查找表分为若干子块。块内元素可以无序,但块间是有序的。(即第一个块中最大关键字小于第二个块中的所有关键字)
查找过程:1.在索引表中确定待查记录所在的块(折半查找或者顺序查找);
2.块内顺序查找。
4.二叉排序树
左子树关键字<根关键字<右子树关键字
非递归:
typedef struct BiTNode{
ElemType key;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTNode* BSTSearch(BiTree p,int key)
{
while(p!=null)
{
if(p==p->key)
{
return p;
}
else if(key<p->key)
{
return p->lchild;
}
else
{
return p->rchild;
}
}
return null;
}
递归
typedef struct BiTNode{
ElemType key;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTNode* BSTSearch(BiTree p,int key)
{
if(p==null)
{
return null;
}
else
{
if(p==p->key)
{
return p;
}
else if(key<p->key)
{
return BSTSearch(p->lchild,key)
}
else
{
return BSTSearch(p->rchild,key);
}
}
}
5.B树和B+树
B树特性:
1.m阶B树每个结点至多有m个分支;
2.根结点且不是叶子结点至少有2个分支;
3.非根非叶子结点至少有【(m/2)上取整 】 个分支;
4.结点内关键字互不相等;
5.n个分支对应n-1个关键字;
6.关键字按递增顺序排列;
7.叶子结点都在同一层
8.所有结点包含信息
9.不可以顺序查找
一个关键字的空位子对应一个分支
B+树特性:
1.n个关键字n个分支;
2.m阶B+树每个结点至多有m个分支;
3.叶结点包含信息,非叶结点只是索引作用
4.可以顺序查找
一个关键字对应一个分支
6.散列表
散列函数:一个把查找表中的关键字映射成该关键字对应地址的函数。
散列函数的构造方法:
1.直接定地址法
H(key)=a*key+b
2.除留余数法
H(key)=key%p
表长m,p是小于m但最接近m的质数。
解决冲突的方法
1.开放定地址法
其中的线型探测法:冲突发生时顺序探测下一个单元。
2.拉链法
把所有的同义词存储在一个线性链表中。