1. 程式人生 > 實用技巧 >查詢演算法簡介&順序表查詢

查詢演算法簡介&順序表查詢

  查詢表是同一型別的資料元素構成的集合,根據操作方式,查詢表可以分為兩類:

    靜態查詢表:只進行查詢操作;

    動態查詢表:在查詢過程中同時插入查詢表中不存在的資料元素,或者刪除已經存在的資料元素。

  為了提高查詢的效率,我們專門為查詢設定了相應的資料結構,稱為查詢結構根據查詢用到的資料結構,可以將查詢分為以下幾類:

    :順序表查詢(順序查詢,有哨兵的順序查詢),有序表查詢(二分查詢,插值查詢,斐波那契查詢),雜湊表查詢;

    索引:稠密索引查詢,分塊索引查詢,倒排索引查詢;

    :二叉排序樹查詢,平衡二叉樹查詢。

  其中,藉助於表和索引的查詢為靜態查詢,藉助於樹的查詢為動態查詢。

  順序查詢查詢過程:從表中的第一個或最後一個記錄開始,依次將記錄的關鍵字與給定的關鍵字進行比較,若某個記錄的關鍵字與給定的關鍵字的值相等,則查詢成功,返回該記錄在查詢表中的位置;否則,查詢失敗,返回0。

 1 //順序查詢
 2 //a,陣列;n,陣列長度;key,帶查詢的關鍵字
 3 int SequentialSearch(int* a, int n, int key)
 4 {
 5     for (int i = 1; i <= n; i++)//a[0]不參與查詢
 6     {
 7         if (a[i] == key)
 8             return
i;//返回key在陣列a中的下標 9 } 10 return 0;//返回0,說明查詢失敗,否則,查詢成功 11 }

  上述順序查詢,每次迴圈都需要進行下標越界的判斷,可以將a[0]設定為哨兵,解決需要進行下標越界判斷的問題。

 1 //有哨兵的順序查詢
 2 int SequentialSearch2(int* a, int n, int key)
 3 {
 4     int i = n;//迴圈從陣列的尾部開始
 5     a[0] = key;//哨兵,儲存帶查詢的關鍵字的值
 6 
 7     //無論陣列中是否存在待查詢的關鍵字
 8     //最終一定會滿足a[i] == key 的條件,因為key存在a[0]中
9 while (a[i] != key ) 10 i--; 11 12 return i;//返回0,說明查詢失敗,否則,查詢成功,返回key在陣列a中的下標 13 }

參考書籍:程傑 著,《大話資料結構》,清華大學出版社。