【查找】基于线性表的查找法

查找的主要方法

【查找】基于线性表的查找法_第1张图片

基于线性表的查找法
一、顺序查找法

顺序查找法的特点是,用所给关键字与线性表中各元素的关键字逐个比较,直到成功或失败。存储结构通常为顺序结构,也可为链式结构。

顺序结构数据类型的定义:

#define LIST_SIZE 20
typedef struct {
     
KeyType key;
OtherType other_data;
} RecordType;
typedef struct {
     
RecordType r[LIST_SIZE+1]; /* r[0]为工作单元 */
int length;
} RecordList;
[算法思想]

在表的一端设置一个称为“监视哨”的附加单元,存放要查找元素的关键字。从表的另一端开始查找,如果在“监视哨”找到要查找元素的关键字,返回失败信息,否则返回相应下标。

[算法描述-设置监视哨的顺序查找法]
int SeqSearch(RecordList l, KeyType k)
/*在顺序表 l 中顺序查找其关键字等于 k
   的元素,若找到,则函数值为该元素在表中的位置,否则为 0*/
{
     
  l.r[0].key = k; //其中 l.r[0] 为“监视哨”,可以起到防止越界的作用。
  i = l.length;
  while (l.r[i].key != k)
    i--;
  return(i);
}
[算法分析]

用平均查找长度(ASL)分析顺序查找算法的性能。假设列表长度为 n,那么查找第 i个数据元素时需进行 n-i+1 次比较,即 Ci=n-i+1。又假设查找每个数据元素的概率相等,即 Pi=1/n,则顺序查找算法的平均查找长度为:
在这里插入图片描述
为便于比较,下面给出不用“监视哨”的算法

[算法描述-不设置监视哨的顺序查找法]
int SeqSearch(RecordList l, KeyType k)
/*不用“监视哨”法,在顺序表中查找关键字等于 k 的元素*/
{
     
  i = l.length;
  while (i >= 1 && l.r[i].key != k)
    i--;
  if (i >= 1)
    return (i) else return (0);
}

算法 2 与算法 1 相比,循环控制条件中增加了 i>=1,用以判断查找过程是否越界。加 上“监视哨”可省去这个条件,从而提高查找效率。

二、折半(二分)查找法

折半查找法又称为二分查找法,这种方法对待查找的列表有两个要求:
(1)必须采用顺序存储结构;(2)必须按关键字大小有序排列。

[算法思想]

首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;
否则利用中间位置记录将表分成前、后两个子表。
如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

下图给出了用折半查找法查找 12、50 的具体过程,其中 mid=(low+high)/2,当 high 【查找】基于线性表的查找法_第2张图片
【查找】基于线性表的查找法_第3张图片

[算法描述-折半查找法]
int BinSrch (RecordList l, KeyType k)
/*在有序表 l 中折半查找其关键字等于 k 的元素,若找到,则函数值为该元素在表中的
位置*/
{
     
  low = 1;
  high = l.length; /*置区间初值*/
  while (low <= high) {
     
    mid = (low + high) / 2;
    if (k == l.r[mid].key)
      return(mid); /*找到待查元素*/
    else if (k < l.r[mid].key)
      high = mid - 1; /*未找到,则继续在前半区间进行查找*/
    else
      low = mid + 1; /*继续在后半区间进行查找*/
  }
  return (0);
}
[算法分析]
ppt里 略
三、 分块查找法

【查找】基于线性表的查找法_第4张图片

你可能感兴趣的:(数据结构)