查找
一、顺序表查找
二、有序表查找
- 折半查找
- 插值查找:根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法,其核心在于插值的计算公式(key-a[low]) / (a[high]-a[low])。
- 斐波那契查找
三、线性索引查找(线性索引:将索引项集合组织为线性结构,也称为索引表)
(1)稠密索引:在线性索引中,将数据集中的每个记录对应一个索引表。
(2)分块索引:把数据集的记录分成了若干块,块内无序,块间有序。
(3)倒排索引:(索引项的通用结构为 次关键码+记录号表)记录号表存储具有相同次关键字的所有记录的记录号。
四、二叉排序树(Binary Sort Tree),又称为二叉查找树(Binary Search Tree),它或者是一棵空树,或者是具有下列性质的二叉树:
- 若它的左子树不空,则左子树上所有节点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有节点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉排序树。
1、构造二叉排序树并不是为了排序,而是为了提高查找和插入删除关键字的速度。
2、对二叉排序树进行中序遍历,可得一个有序序列。
3、构造二叉排序树并不是为了排序,而是为了提高查找和插入删除关键字的速度。
4、对二叉排序树进行中序遍历,可得一个有序序列。
5、二叉排序树的查找、插入和删除
typedef struct BiTNode{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
//二叉排序树的查找
Status SearchBST(BiTree T, int key, BiTree f, BiTree *p){
if(!T){
*p = f;
return false;
}else if(key == T->data){
*p = T;
return TRUE;
}else if(key < T->data){
return SearchBST(T->lchild, key, T, p);
}else{
return SearchBST(T->rchild, key, T, p);
}
}
//插入
Status InsertBST(BiTree *T, int key){
BiTree p, s;
if(!SearchBST(*T, key, NULL, &p)){
s = (BiTree)malloc(sizeof(BiTNode));
s->data = key;
s->lchild = s->rchild = NULL;
if(!p)
*T = s;
else if(key < p->data)
p->lchild = s;
else
p->rchild = s;
return TRUE;
}
else
return false;
}
//删除
Status DeleteBST(BiTree *T, int key){
if(!*T)
return FALSE;
else{
if(key == (*T)->data)
return Delete(T);
else if(key < (*T)->data)
return DeleteBST(&(*T)->lchild, key);
else
return DeleteBST(&(*T)->rchild, key);
}
}
Status Delete(BiTree *p){
BiTree q,s;
if((*p)->rchild == NULL){
q = *p; *p = (*p)->lchild; free(q);
}else if((*p->lchild == NULL)){
q = *p; *p = (*p)->rchild; free(q);
}else{
q = *p; s = (*p)->lchild;
while(s->rchild){
q = s; s = s->rchild;
}
(*p)->data = s->data;
if(q != *p)
q->rchild = s->lchild;
else
q->lchild = s->lchild;
free(s);
}
return TRUE;
}
五、平衡二叉树(AVL树)
1、平衡二叉树(Self-Balancing Binary Tree 或 Height-Balanced Binary Search Tree),是一种二叉排序树,其中每一个结点的左子树和右子树的高度差至多等于1。
2、平衡因子BF(Balance Factor):二叉树上结点的左子树深度减去右子树深度的值。
3、最小不平衡子树:距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树。
六、多路查找树(B树)
其每一个结点的孩子数可以多于两个,且每一个结点处可以存储多个元素。
四种特殊形式:2-3树、2-3-4树、B树、B+树。
(1)2-3树:其中的每一个结点都具有两个孩子(2结点)或三个孩子(3结点)。
一个2结点包含一个元素和两个孩子(或没有孩子)[这个2结点要么没有孩子,要有就有两个]。(左子树包含的元素小于该元素,右子树包含的元素大于该元素)
一个3结点包含一小一大两个元素和三个孩子(或没有孩子)。(左子树包含小于较小元素的元素,右子树包含大于较大元素的元素,中间子树包含介于两元素之间的元素)
2-3树中所有的叶子都在同一层次上。
(2)2-3-4树:2-3树的概念扩展,包括了4结点的使用,一个4结点包含小中大三个元素和四个孩子(或没有孩子)。(如果某个4结点有孩子的话,左子树包含小于最小元素的元素;第二子树包含大于最小元素,小于第二元素的元素;第三子树包含大于第二元素,小于最大元素的元素;右子树包含大于最大元素的元素)
(3)B树:是一种平衡的多路查找树,2-3树和2-3-4树都是B树的特例。结点最大的孩子数目称为B树的阶(order)。(2-3树是3阶B树,2-3-4树是4阶B树)
(4)B+树:B+树是为磁盘或其他直接存取辅助设备而设计的一种平衡查找树,在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶节点中,各叶节点指针进行连接。(B+树由B树和索引顺序访问方法演化而来,但是在实际使用过程中几乎已经没有使用B树的情况了。)
七、散列表查找(哈希表)
1、散列技术是在记录的存储位置和它的关键字中间建立一个确定的对应关系f,使得每个关键字key对应的一个存储位置f(key)。
2、对应关系f称为散列函数,又称为哈希(Hash)函数。
3、采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。关键字对应的记录存储位置称为散列地址。
4、散列技术既是一种存储方法,也是一种查找方法。(散列技术与线性表、树、图等结构不同的是,前面几种结构,数据元素之间都存在某种逻辑关系,可以用连线图示表示出来,而散列技术的记录之间不存在什么逻辑关系,它只与关键字有关联因此散列主要是面向查找的存储结构。)
5、散列技术最适合的求解问题是查找与给定值相等的记录。(简化了比较过程)