一、查找的基本概念
列表:由同一类型的数据元素组成的集合。
关键码:数据元素中的某个数据项,可以标识列表中的一个或一组数据元素。
键值:关键码的值。
主关键码:可以唯一地标识一个记录的关键码。
次关键码:不能唯一地标识一个记录的关键码。
查找 :在具有相同类型的记录构成的集合中找出满足给定条件的记录。
查找的结果 :若在查找集合中找到了与给定值相匹配的记录,则称查找成功;否则,称查找失败。
静态查找 :不涉及插入和删除操作的查找 。
动态查找 :涉及插入和删除操作的查找。
静态查找适用于:查找集合一经生成,便只对其进行查找,而不进行插入和删除操作; 或经过一段时间的查找之后,集中地进行插入和删除等修改操作;
动态查找适用于:查找与插入和删除操作在同一个阶段进行,例如当查找成功时,要删除查找到的记录,当查找不成功时,要插入被查找的记录。
查找结构 :面向查找操作的数据结构 ,即查找基于的数据结构。
线性表:适用于静态查找,主要采用顺序查找技术、折半查找技术。
树表:适用于动态查找,主要采用二叉排序树的查找技术。
散列表:静态查找和动态查找均适用,主要采用散列技术。
平均查找长度:将查找算法进行的关键码的比较次数的数学期望值定义为平均查找长度。
其中:n:问题规模,查找集合中的记录个数;
pi:查找第i个记录的概率;
ci:查找第i个记录所需的关键码的比较次数。
二、查找
1、顺序查找
普通的顺序查找方法
带监视哨的顺序查找方法
2、折半查找
折半查找的判定树
1、顺序查找 (线性查找)
基本思想:
从线性表的一端向另一端逐个将关键码与给定值进行比较,
若相等,则查找成功,给出该记录在表中的位置;
若整个表检测完仍未找到与给定值相等的关键码,则查找失败,给出失败信息。
int LineSearch :: SeqSearch(int k)
{
i=n;
while (i>0 && data[i]!=k)
i--;
return i;
}
2、改进的顺序查找
基本思想:设置“哨兵”。
哨兵就是待查值,
将哨兵放在查找方向的尽头处,
免去了在查找过程中每一次比较后都要判断查找位置是否越界,从而提高查找速度。
int LineSearch :: SeqSearch(int k)
{
int i = length; //从数组高端开始比较
data[0] = k; //设置哨兵
while (data[i] != k) //不用判断下标i是否越界
i--;
return i;
}
3、顺序查找的性能-不成功
int LineSearch :: SeqSearch(int k)
{
int i = length; //从数组高端开始比较
data[0] = k; //设置哨兵
while (data[i] != k) //不用判断下标i是否越界
i--;
return i;
}
4、单链表的顺序查找
int LinkSearch::SeqSearch2(Node *first, int k){
Node *p;
int count=0;//记录比较的次数
p=first->next;
int j=1;//记录数据在表中的位置
while (p && p->data != k)
{p=p->next; j++; count++;}
if (!p){
cout<<“查找失败,比较的次数为:"<<count<<endl;
return 0;
} else{
cout<<“\n”<<“查找成功,比较的次数为:"<<count<<endl;
return j;
}
}
5、顺序查找的优点:
算法简单而且使用面广。
顺序查找的缺点:
平均查找长度较大,特别是当待查找集合中元素较多时,查找效率较低。
6、折半查找
适用条件:
基本思想:
在有序表中(low, high,low<=high),
取中间记录作为比较对象,
若给定值与中间记录的关键码相等,则查找成功;
若给定值小于中间记录的关键码,则在中间记录的左半区继续查找;
若给定值大于中间记录的关键码,则在中间记录的右半区继续查找。
不断重复上述过程,直到查找成功,或所查找的区域无记录,查找失败。
int LineSearch :: BinSearch1(int k){
int mid, low = 1, high = length; //初始查找区间是[1, n]
while (low <= high) {//当区间存在时
mid = (low + high) / 2;
if (k < data[mid])
high = mid - 1;
else if (k > data[mid])
low = mid + 1;
else
return mid; //查找成功,返回元素序号
}
return 0; //查找失败,返回0
}
三、树
1、判定树的性质
任意结点的左右子树中结点个数最多相差1
任意结点的左右子树的高度最多相差1
任意两个叶子所处的层次最多相差1
2、折半查找判定树
判定树:折半查找的过程可以用二叉树来描述,</