資料結構之查詢

2021-08-01 09:28:25 字數 3507 閱讀 4939

1、搜尋

最簡單的使用 in 運算子

>>> 

15in [3,5,2,4,1]

false

2、順序查詢:複雜度是 o(n)

試想,當查詢的專案不存在列表中時,無序查詢的話最好、最差、平均情況都是n次,但有序查詢就不一樣了,最好的情況是1次,最差n次,平均n/2次對吧。

3、二分查詢:複雜度是 o( log^n )

def

binarysearch

(alist, item):

if len(alist) == 0:

return

false

else:

midpoint = len(alist)//2

if alist[midpoint]==item:

return

true

else:

if itemreturn binarysearch(alist[:midpoint],item)

else:

return binarysearch(alist[midpoint+1:],item)

testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]

print(binarysearch(testlist, 3))

這裡呼叫了遞迴。有乙個疑問,當查詢的結果不存在時,則必然最後一步查詢是乙個元素的列表,那麼midpoint = 0,alist[:0],貌似這個定義是錯誤的。怎麼解?

4.雜湊查詢

4.1 雜湊查詢的本質是先將資料對映成它的雜湊值。雜湊查詢的核心是構造乙個雜湊函式,它將原來直觀、整潔的資料對映為看上去似乎是隨機的一些整數。

1)餘數法、分組求和/tablesize、平方取中/tablesize。雜湊表的初始大小是任意的,但是重要的是,大小是質數,使得衝突解決演算法可以盡可能高效。

雜湊表的大小取決於一組質數,原因是在hash函式中,你要用這些質數來做模運算(%).而分析發現,如果不是用質數來做模運算的話,很多生活中的資料分布,會集中在某些點上。所以這裡最後採用了質數做模的除數。因為用質數做了模的除數,自然儲存空間的大小也用質數了。因為模完之後,資料是在[0-所選質數)之間。

2)對於字串,可以根據其ascii碼累加,並以其位置值作為權重因子,除以tablesize來作為雜湊值。

4.2 解決衝突

1)線性探測的開放定址技術:從原始雜湊值位置開始,然後以順序方式移動槽,直到遇到第乙個空槽,為避免聚集,可以將探頭加3。

2)線性探測思想的乙個變種稱為二次探測。代替使用常量 「跳過」 值,將雜湊值遞增 1,3,5,7,9, 依此類推。這意味著如果第一雜湊值是 h,直到找到空槽,則連續值是h + 1,h + 4,h + 9,h + 16,等等。

class

hashtable

():def

__init__

(self):

self.size = 11

self.slots = [none] * self.size #儲存key值 [none, none, none, none, none, none, none, none, none, none, none]

self.data = [none] * self.size #儲存對應value值

defhashfunction

(self, key):

return key % self.size #餘數法

defrehash

(self, oldhash):

return (oldhash + 1) % self.size

defput(self,key,val):

hashvalue = self.hashfunction(key) #根據雜湊函式求出的雜湊值

if self.slots[hashvalue] ==none:

self.slots[hashvalue] = key

self.data[hashvalue] = val

else:

if self.slots[hashvalue] == key:

self.data[hashvalue] = val # replace

else:

nextslot = self.rehash(hashvalue)

while self.slots [nextslot] != none

and self.slots[nextslot] !=key: #解決衝突線性定址的三種情況,not none,not key

nextslot = self.rehash(nextslot)

if self.slots[nextslot] == none: #尋找到的槽為空

self.slots[nextslot] = key

self.data[nextslot] = val

else: #尋找到的槽key值相等

self.data[nextslot] = val # replace

defget

(self, key):

startslot = self.hashfunction(key)

val = none

stop = false

found = false

position = startslot

while self.slots[position] != none

andnot found and

not stop:

if self.slots[position] == key:

found = true

val = self.data[position]

else:

position = self.rehash(position)

if position == startslot:

stop = true

return val

def__getitem__

(self, key):

return self.get(key)

def__setitem__

(self, key, val):

self.put(key, val)

h = hashtable()

h[54] = 'cat'

print(h.slots)

關於getitemsetitem的用法:

python四個魔法方法len,getitem,setitem,delitem

資料結構之查詢

date 08 07 11 descript 折半查詢,插入跟刪除演算法 public class binaryinsertex extends seqlist public binaryinsertex int n public void create catch exception ex pub...

資料結構之查詢

一 靜態查詢 有序表查詢 平均查詢長度 特點 1 折半查詢 log n 1 1 只是適用於有序表,且限於順序儲存結構 線性鍊錶無法進行折半查詢。2 斐波那契查詢 o logn 平均效能比折半好,但最壞效能比折半差 分割時只需進行加減運算,適用於關鍵字均勻分布的表 對錶長較大的順序表,其效能比折半好 ...

資料結構之查詢

1.折半查詢只能用於有序資料,且是順序儲存結構 實質是用了陣列的下標的折半 2.折半查詢效率是比較高的,但折半查詢必須是順序儲存結構,為了能讓鏈式儲存結構也能用這樣的模式,就引出了平衡二叉樹,他的效率在順序查詢和折半查詢之間 3.b 樹主要用於檔案資料儲存,也就是外存,因為外存的訪問速度慢,為減少訪...