排序和搜尋

2021-09-29 19:34:53 字數 4070 閱讀 5164

搜尋的演算法過程就是在一些項的集合中找到乙個特定的項,我們感興趣的是這些演算法的工作原理以及他們相互比較的優劣

從列表的第一項開始,直到發現正在尋找的資料項或者遍歷所有資料項

無序表順序搜尋的比對

二分法必須用於有序的列表中,二分搜尋的複雜度是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的頂點入棧,中途要判斷是否會形成環,最後輸出棧得到的序列就是該...