對順序儲存的資料進行查詢,最簡單的演算法就是從頭開始,逐個檢查。若能夠在表中找到與給定關鍵字匹配的元素,則查詢成功,否則查詢失敗。
這個演算法可以非常簡單的得以實現:
typedef struct
s_eletype;
typedef struct
s_list;
int search(s_list lst, int k, s_eletype* x)
}return false;
}
這是乙個非常普通的版本。簡單,但是有沒有更高效的演算法呢。在與表中每乙個元素的對比過程中,程式都進行了兩次比較:第一次是檢查陣列有沒有越界,即i < lst.size
;第二次是檢查表中對應位置上元素的關鍵字是否與給定的關鍵字匹配。假定,引數傳進來的關鍵字一定能夠在表中找到相關元素,那陣列越界檢查能否去掉呢,畢竟能少一步操作就少一步嘛。
那search
函式就可以改一下:
int search(s_list lst, int k, s_eletype* x)
return false;
}
這樣處理確實可以在關鍵字確定可以得到匹配的情況下提公升一些效率,但是太危險了。一旦給定的關鍵字在表中沒有相應的元素匹配,這程式就不知道會跑**去,所以還需要進一步處理。為了讓這個查詢範圍不越界,必須讓它止步於表尾,怎麼止步?可以利用lst.element[i].key != k
這個條件,在申請表空間時可以多申請乙個元素所需的空間,即size+1
;在最後乙個位置賦予要查詢元素的關鍵字,這個元素又被稱為哨兵。
int search(s_list lst, int k, s_eletype* x)
return false;
}
顯然,哨兵這種方式可以減少一次比較,但是會多消耗乙個元素大小的空間。所以在選擇的時候需要考慮整個表的大小,如果資料量很大,表很長,增加乙個元素大小的空間來提公升一定的效率是可以接受的;但是如果資料量小,減少乙個比較步驟好像影響微乎其微。
以上的實現方式並沒有考慮資料的有序性,倘若資料是從小到大有序存放的呢。
例如:key12
3567
8910哨兵
value
1125
2314
1512
3156
45元素關鍵字從小到大有序排放,如給定查詢的元素關鍵字為3
,for
迴圈只需執行三次便可查到相應元素。那如果傳進來的關鍵字為4
呢,那整個搜尋過程必須找遍整個表才能結束,但是我們明明知道表中key值在5
之後怎麼也不可能查詢到key
值為4
的元素,後面這些查詢工作都是白做的。假如引數傳進來的key
在表中key[i]
與key[i+1]
之間的概率等同,則實際需要進行比較的次數平均為(n+1)/2
,但上面程式實際進行的比較次數卻是(n+1)
次,必須改進。
既然是有序的,那麼程式可以在lst.element[i].key >= k
時退出for
迴圈,即條件可以改為lst.element[i].key < k
。
int search(s_list lst, int k, s_eletype* x)
return false;
}
以上**都是為了乙個目的:在每個元素等概率搜尋時,減少平均搜尋長度,盡可能的提高搜尋的速度與效率。但是在大多數情況下,表中元素的搜尋概率並不相等且無法提前計算各元素的搜尋概率,或者說有的元素在一段時間內頻繁地被訪問,之後卻很少訪問。這時候就需要這個線性表有一定的自組織性。
有三種可能的自組織表方式:計數方式、移至開頭和互換位置。
本篇完 -?
查詢演算法之順序查詢
演算法思想 順序查詢演算法是一種較為簡單的演算法,它把待查詢的所有序列元素都遍歷一遍,直到查詢到該關鍵字為止。時間複雜度最壞的情況下為o n 時間複雜度最好的情況下為o 1 順序查詢演算法實現 author qiu public class ordersearch 待查詢陣列 int key 8 待...
查詢演算法之順序查詢
順序查詢又稱為線性查詢,查詢過程為 從陣列的第乙個位置 或最後乙個位置 開始,遍歷整個陣列,對下標索引對應的值與要查詢的值進行比較,如果相等,則查詢成功,返回下標值 如果遍歷完整個陣列,下標對應的值與要查詢的值都不等,則查詢不成功,返回 1。演算法實現 public int search seq i...
查詢演算法之順序查詢Python
查詢演算法中最直觀最容易理解的就是順序查詢了,思路比較簡單,就是在順序表 包括鍊錶 中按次序逐個比較,直到找到或者遍歷完線性表。關鍵點是順序遍歷。def sequentialsearch alist,item pos 0 found false while pos len alist and not...