查詢演算法簡介&順序表查詢
阿新 • • 發佈:2020-11-20
查詢表是同一型別的資料元素構成的集合,根據操作方式,查詢表可以分為兩類:
靜態查詢表:只進行查詢操作;
動態查詢表:在查詢過程中同時插入查詢表中不存在的資料元素,或者刪除已經存在的資料元素。
為了提高查詢的效率,我們專門為查詢設定了相應的資料結構,稱為查詢結構。根據查詢用到的資料結構,可以將查詢分為以下幾類:
表:順序表查詢(順序查詢,有哨兵的順序查詢),有序表查詢(二分查詢,插值查詢,斐波那契查詢),雜湊表查詢;
索引:稠密索引查詢,分塊索引查詢,倒排索引查詢;
樹:二叉排序樹查詢,平衡二叉樹查詢。
其中,藉助於表和索引的查詢為靜態查詢,藉助於樹的查詢為動態查詢。
順序查詢的查詢過程:從表中的第一個或最後一個記錄開始,依次將記錄的關鍵字與給定的關鍵字進行比較,若某個記錄的關鍵字與給定的關鍵字的值相等,則查詢成功,返回該記錄在查詢表中的位置;否則,查詢失敗,返回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 returni;//返回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 }
參考書籍:程傑 著,《大話資料結構》,清華大學出版社。