08 查找
查找的基本概念
线性表的查找
顺序查找
类型定义
typedef struct {//顺序表结构类型定义
ElemType *R;//表基址
int length; //表长
} SSTable; //Sequential Search Table
SSTable ST; //定义顺序表ST
算法
int Search_Seq(SSTable ST, KeyTypekey){
//若成功返回其位置信息,否则返回0
for (i=ST.length; i>=1; --i) {
if (ST.R[i].key==key) return i;
}
return 0;
}
改进(哨兵):
折半查找
算法
int Search_Bin (SSTable ST, KeyType key) {
low = 1;
high = ST.length;// 置区间初值
while (low <= high) {
mid = (low + high) / 2;
if (ST.R[mid].key == key) return mid; // 找到待查元素
else if (key < ST.R[mid].key) //缩小查找区间
high = mid - 1;//继续在前半区间进行查找
else low = mid + 1;//继续在后半区间进行查找
}
return 0 ;//顺序表中不存在待查元素
}// Search_Bin
性能分析
分块查找
- 折半法:\(log_2(n+1)\)
- 顺序法:\(\frac {n+1} 2\)
树表的查找
二叉排序树 (BST)
基本概念
递归查找
存储结构:
typedef struct BSTNode{
ElemType data;//数据域
struct BSTNode *Ichild, *rchild;//左右孩子指针
} BSTNode, *BSTree;
BSTree T;//定义二叉排序树T
算法:
BSTree SearchBST(BSTree T,KeyType key) {
if((!T) || (key==T->data.key)) return T;
else if (key<T->data.key)
return SearchBST(T->Ichild,key); //在左子树中继续查找
else return SearchBST(T->rchild,key); //在右子树中继续查找
}// SearchBST
查找分析!:
插入
生成
删除
平衡二叉树 (AVL)
定义
调整失衡
- 二叉排序树的性质:大小的顺序不能变!
调整 LL 型
调整 RR 型
调整 LR 型
调整 RL 型
例题
散列表的查找
基本概念
就是哈希表。
散列函数的构造
直接定址法
除留余数法
处理冲突
开放地址法
线性探测法
二次探测法
伪随机探测法
不说了,\(d_i\) 就是伪随机数。