►從查詢說起:
在英漢字典中查詢某個英文單詞的中文解釋;在新華字典中查詢某個漢字的讀音、含義;在對數表、平方根表中查詢某個數的對數、平方根;郵遞員送信件要按收件人的位址確定位置等等。
從計算機、計算機網路中查詢特定的資訊,就需要在計算機中儲存包含該特定資訊的表。查詢是許多程式中最消耗時間的一部分。因而,乙個好的查詢方法會大大提高執行速度。
►先討論靜態查詢表:
靜態查詢表應該是查詢中最為簡單的。僅僅是在固定的表中對元素的查詢,而不涉及修改表中的元素。
我們討論的是 在無序表、順序表中的遍歷查詢和快速的折半查詢。
方式:從查詢表的一端依序與表中的元素進行比較。
**是很簡單的,直接給出,以便後續分析:
#include typedefintkeytype;
typedef
struct
elemtype;
typedef
struct
sstable;
intsq_search(sstable st, keytype key)
int init_search(sstable &st,int
length)//初始化表
int creat_search(sstable &st,int
length)//建立表
}int
main()
說明:請注意,我們在0號位置留空,在這裡僅僅是為了直觀顯示索引位置!但是我們還可以優化這段**,那就是設定監視哨。
所謂監視哨,就是將空出來的下標為0的這個元素的值設為key.
分析:這樣我們就不用多次判斷i是否越界,因為就算靜態表中找不到,也會在0位置上配對成功,返回0!
while (i>=1&&st.elem[i].key!=key) i--;我們來分析一下演算法複雜度:改為:st.elem[
0].key = key; //
監視哨:下標為0的位置存放待查詢的元素
while (st.elem[i].key!=key)
方式:在有序表上查詢的時候,我們可以對無序查詢進行優化:
int i =st.length;即當st.elem[i].key<= st.elem[0].key 的時候我們就停止查詢!st.elem[
0].key =key;
while (key < st.elem[i].key) i--;
if (key ==st.elem[i].key)
return
i;
return
0
為什麼呢?因為st.elem[i].key<= st.elem[0].key的時候是兩種可能,要麼小於,既然《就無須再比了,要是=也就得出結果了!
方法:我們把要查詢的值x與陣列的中間值mid進行比較,如果說x總之,先確定待查記錄所在的範圍(區間),若待查記錄等於表中間位置上的記錄,則查詢成功;否則,縮小查詢範圍,即若待查記錄小於中間位置上的元素,則下一次到前半區間進行查詢,若待查記錄大於中間位置上的元素,則下一次到後半區間進行查詢。核心**如下:
while (low<=high)我們分析一下這個結束條件: while(low<=high)當low=high的時候,我們已經可以確定這是能夠進行比較的最後乙個元素了,因為此時不可能再對陣列進行左右劃分!
如果此時,mid元素不等於key的話,可以判定查詢失敗!
若此時midkey,hi-1就會小與low所以自然就會結束迴圈!
資料結構 靜態查詢表
從查詢說起 在英漢字典中查詢某個英文單詞的中文解釋 在新華字典中查詢某個漢字的讀音 含義 在對數表 平方根表中查詢某個數的對數 平方根 郵遞員送信件要按收件人的位址確定位置等等。從計算機 計算機網路中查詢特定的資訊,就需要在計算機中儲存包含該特定資訊的表。查詢是許多程式中最消耗時間的一部分。因而,乙...
資料結構 靜態查詢表
此為本人在學習資料結構時所寫的,各個功能能夠實現,有demo,node.h,tree.h,tree.cpp四個檔案,使用說明如下 按照要求,先進行建樹操作 然後按照輸出的介面選擇查詢操作即可 輸入的資料6 5 4 2 1 3 6。表示建立了一棵二叉鍊錶樹 54 6 21 3 在查詢時輸入 1,則進行...
資料結構 靜態查詢表
順序表與線性鍊錶都可以表示靜態查詢表。兩者的實現靜態查詢表相似,這裡以順序表為例。順序查詢就是從表中最後乙個記錄開始,逐個進行記錄關鍵字與給定值的比較,若某個記錄的關鍵字和給定值比較相等,則查詢成功,反之失敗。對於順序查詢有一種技巧可以優化效率。查詢之前先將key賦值給elem 0 搜尋從後向前搜尋...