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)
關於getitem和setitem的用法: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 樹主要用於檔案資料儲存,也就是外存,因為外存的訪問速度慢,為減少訪...