【查找】基於線性表的查找法

查找的主要方法

在這裏插入圖片描述

基於線性表的查找法
一、順序查找法

順序查找法的特點是,用所給關鍵字與線性表中各元素的關鍵字逐個比較,直到成功或失敗。存儲結構通常爲順序結構,也可爲鏈式結構。

順序結構數據類型的定義:

#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<low 時,表示不存在這樣的子表空間,查找失敗
在這裏插入圖片描述
在這裏插入圖片描述

[算法描述-折半查找法]
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裏 略
三、 分塊查找法

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章