順序表的查找 - 順序查找


查找(search):給定結點的關鍵字值 x ,查找值等於 x 的結點的存儲地址。

按關鍵字 x 查:

① 成功,表中有 x ,返回 x 的存儲地址;

② 不成功,x 不在表中,返回無效地址。

順序查找就是以表的一端為起點,向另一個端點逐個元素查看,

可以是從 表頭 → 表尾的順序,也可以是從 表尾 → 表頭的順序

順序查找方法,既適用於無序表,又適用於有序表。

順序查找屬於 “窮盡式搜索法”:通常以 查找長度,度量查找算法的時間復雜性。

查找長度:即查找過程中測試的節點數目。

順序查找的查找長度 = for 循環體的執行次數,最小為1,最多為n。

等概率下:平均查找長度 = (n + 1)/ 2

最壞情況和平均情況:T(n)= O(n)    效率最低的查找算法

我們觀察一下上圖那兩個 for循環體,不難發現,每次執行都需要 判斷兩個條件:

① 測試是否循環到頭;

② 測試是否找到元素 x。

因此我們不妨使用 “監督元” 技術,不僅簡化了程序結構,也提高了查找速度。

 

 若從 表尾 → 表頭 的順序查找,監督元則在表頭處,稱為 “表頭監督元”,如下圖:

 

 

 

若從 表頭 → 表尾 的順序查找,監督元則在表頭處,稱為 “表尾監督元”,如下圖:

 

 

帶表頭監督元的順序查找算法:

int SQsearch(int a[],int x,int n){ // SQsearch 是函數名,僅此。

  int i;

  i = n;

  a[0] = x;

  while(a[i] != x)

    i -- ;

  return i;

}

算法思想:

① i = n;// 設置查找起點

② a[0] = x;// 放置監督元,因為在進入循環體之前,已經預先在 a[0] 放置了一個元素 x,所以 x 無論是否真的在表中,總能找到 x ,使第三句的循環中止。注意!!!a[1] 到 a[n] 存儲的才是真正的表元素。

如果 x 真存在表中,必然在某個 i 大於 0 時找到 x,循環終止。

如果循環變量 i 的值變到 0 時循環才終止,那就說明 x 不在表中。

③ while(a[i] != x)

  i --; // 從右向左查。

④ return i;// 判定查找結果。查找結果由變量 i 的值判定,

x 在表中,i ≠ 0

x 不在表中,i = 0

只犧牲一個存儲單元,就能將查找效率提升一倍。這在表長 n 較大,查找頻繁的情況下是很合算的,“空間換時間”。雖然查找速度提高一倍,但時間復雜性的階不變,仍是O(n),只是時間復雜性函數的常系數變小了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM