搜尋的演算法過程就是在一些項的集合中找到乙個特定的項,我們感興趣的是這些演算法的工作原理以及他們相互比較的優劣
從列表的第一項開始,直到發現正在尋找的資料項或者遍歷所有資料項
無序表順序搜尋的比對
二分法必須用於有序的列表中,二分搜尋的複雜度是o(log(n))
def
binarysearch
(alist,item)
:"""二分法搜尋"""
first =
0 last =
len(alist)-1
found =
false
while first<=last and
not found:
midpoint =
(first+last)//2
if alist[midpoint]
== item:
found =
true
else
:if item
: last = midpoint-
1elif item>alist[midpoint]
: first = midpoint+
1return found
二分法搜尋-遞迴版
def
binarysearch
(alist,item)
:"""實現二分搜尋的遞迴呼叫"""
iflen
(alist)==0
:return
false
else
: midpoint =
len(alist)//2
if alist[midpoint]
== item:
return
true
else
:if alist[midpoint]
>item:
return binarysearch(alist[
:midpoint]
,item)
else
:return binarysearch(alist[midpoint+1:
],item)
雜湊表是一種資料的集合,其中的每個資料都通過某種特定的方式進行儲存以方面日後的查詢。雜湊表的每乙個位置叫做槽,能夠存放乙個資料項,並以從0開始遞增的整數命名。
如果雜湊函式過於複雜,導致花費大量的時間去計算槽的名稱,還不如進行簡單的順序搜尋或者二分法搜尋。
當兩個資料雜湊到相同的槽,我們必須用一種系統化的方法將第二個資料放到雜湊表裡。這個過程叫做衝突解決,是實現雜湊函式的重要部分
簡單的方法就是從發生衝突的位置開始順序向下開始尋找,直到我們遇到第乙個空的槽。注意到
我們可能需要回到第乙個槽(迴圈)來實現覆蓋整個雜湊
class
hashtable()
:def
__init__
(self)
: self.size =
11 self.slots =
[none
]*self.size
self.data =
[none
]*self.size
defput(self,key,data)
: hashvalue = self.hashfunction(key,
len(self.slots)
)#當對應的雜湊值的槽為空時,分別將key和data分別插入到slots和data中
if self.slots[hashvalue]
==none
: self.slots[hashvalue]
= key
self.data[hashvalue]
= data
else
:#如果非空槽已包含key,則將以前的data替換為新的data
if self.slots[hashvalue]
== key:
self.data[hashvalue]
= data
else
:#使用rehash()函式重新計算hashvalue(nextslot),即下乙個空槽的位置
nextslot = self.rehash(hashvalue,
len(self.slots)
)while self.slots[nextslot]
!=none
and self.slots[nextslot]
!= key:
nextslot = self.rehash(nextslot,
len(self.slots)
)#找到空槽,插入key和data
if self.slots[nextslot]
==none
: self.slots[nextslot]
= key
self.data[nextslot]
= data
#或者找到包含key的非空槽,更新data
else
: self.data[nextslot]
= data
defhashfunction
(self,key,size)
:"""用於計算首次的hashvalue"""
return key%size
defrehash
(self,oldhash,size)
:#用於解決衝突
return
(oldhash+1)
%size
defget(self,key)
: startslot = hashfunction(key,
len(self.slots)
) data =
none
stop =
false
found =
false
position = startslot
while
not stop and
not found and self.slots[position]
!=none
:if self.slots[position]
== key:
found =
true
data = self.data[position]
else
: position = self.rehash(position,
len(self.slots)
)if position == startslot:
stop =
true
return data
def__getitem__
(self,key)
:return self.get(key)
def__setitem__
(self, key, data)
:return self.put(key, data)
在分析雜湊表的使用情況時最重要的因素是負載因子。從概念上來看,如果較小,那麼發生衝突的概率就較低,這意味著資料項有更大的可能填充在它們本該處於的位置上。如果較大,這意味著整個雜湊表接近於被填滿,緊接著會造成越來越多的衝突。衝突的解決也會變得越來越困難,需要越來越多的比對操作來找到乙個空槽。如果通過資料鏈方法解決衝突,逐漸增多的衝突預示著在每條鏈上會儲存越來越多的資料 List lt T gt 的搜尋和排序
原來是通過委託來實現的啊0 0.code public class vector public vector double?r,double?theta theta theta 360 r r theta theta 過載 運算子 public static vector operator vect...
Elasticsearch (九)搜尋排序和高亮
準備測試案例 delete blog put blog title content postdate put blog article 1 put blog article 2 put blog article 3 put blog article 4 put blog article 5 1.ma...
拓撲排序 深度優先搜尋和廣度優先搜尋實現
定義 給定n個頂點的有向圖g,如果乙個排列滿足任意乙個有向邊 v,u v在該排列中都在u的前面,那麼這個排列稱為g的拓撲排序。注意 無環圖的拓撲排序可能不止一種,有環圖不存在拓撲排序。思路 深度優先搜尋 或廣度優先搜尋 整個圖,將出度為0的頂點入棧,中途要判斷是否會形成環,最後輸出棧得到的序列就是該...