1.查找
改变查找表中数据元素之间的关系以至于提高查找效率,即设置面向查找操作的数据结构,查找结构。
查找表-静态/动态
查找表经常进行查找(查询和检索)、插入、删除三大操作
数据项(字段)-(主/次)关键码
数据元素(记录)-(主/次)关键字
2.顺序表查找
顺序查找
优化(在查找的终点设置哨兵):减少不必要的判断语句提高程序效率
3.有序表查找
折半查找/二分查找:只适用于可以1随机存取的有序的顺序表。
由折半查找的定义,每次把一个数组从中间结点分割时,总是把数组分为结点数相差最多不超过 1 的两个子数组(且总是同一边多一,取决于mid向上还是向下取整),从而使得对应的判定树的两棵子树高度差的绝对值不超过 1 ,所以其判定树应是平衡二叉树,有n+1个查找失败结点(不计数总高度)。更适用于静态查找表。
/* 折半查找 */
int Binary_Search(int *a,int n,int key)
{
int low,high,mid;
low=1; /* 定义最低下标为记录首位 */
high=n; /* 定义最高下标为记录末位 */
while(low<=high)
{
mid=(low+high)/2; /* 折半 */
if (key<a[mid]) /* 若查找值比中值小 */
high=mid-1; /* 最高下标调整到中位下标小一位 */
else if (key>a[mid])/* 若查找值比中值大 */
low=mid+1; /* 最低下标调整到中位下标大一位 */
else
{
return mid; /* 若相等则说明mid即为查找到的位置 */
}
}
return 0;
}
*插值查找和*斐波那契查找,时间复杂度都为log2n,它们的本质为分割点的选择。
分块查找,总元素数n,当块数和块内元素数等于n^0.5时,ASL最小,为n^0.5+1。
4.*线性索引查找
索引是把一个关键字与它对应的记录相关联的过程。
一个索引项至少包含关键字与对应的记录指针。
对于m阶B树,一个结点占用一个磁盘页块,包含m/2向下取整-1至m-1个数的索引项(关键字+记录指针)。
三种线性索引:稠密索引、分块索引、倒排索引。
5.二叉排序树
二叉排序树:为了提高查找、插入、删除关键词的速度。实现动态查找表的高效率。
/* 二叉树的二叉链表结点结构定义 */
typedef st