順序查詢非常簡單,只是個開胃菜,今天主要練習的是雜湊查詢
先上順序查詢**:
defsequence_search(array, num):
for i in
range(len(array)):
if array[i] ==num:
return
i
return
false
array_0 = [23, 43, 12, 54, 65, 48]
print(sequence_search(array_0, 12))
>>> 2
在來看hash查詢:
演算法思想
雜湊的思路很簡單,如果所有的鍵都是整數,那麼就可以使用乙個簡單的無序陣列來實現:將鍵作為索引,值即為其對應的值,這樣就可以快速訪問任意鍵的值。這是對於簡單的鍵的情況,我們將其擴充套件到可以處理更加複雜的型別的鍵。
演算法流程
單純論查詢複雜度:對於無衝突的hash表而言,查詢複雜度為o(1)(注意,在查詢之前我們需要構建相應的hash表)。
classhashsearch:
def__init__
(self, num):
ifisinstance(num, int):
self.num =abs(num)
self.empty =self.num
self._list = [none] *self.num
else
:
raise typeerror('
num must be a int number')
def__hash
(self, key):
return key %self.num
defput(self, key):
assert self.empty > 0, '
this array is full
'index = self.__hash
(key)
while
self._list[index]:
index = self.__hash(index+1)
self._list[index] =key
self.empty -= 1
deffind(self, key):
index = self.__hash
(key)
temp =index
while self._list[index] !=key:
index = self.__hash(index+1)
if index ==temp:
return
false
return index
class
hashtable:
def__init__
(self):
#雜湊表的初始大小已經被選擇為 11。儘管這是任意的,但是重要的是,
#大小是質數,使得衝突解決演算法可以盡可能高效。
self.size = 11self.slots = [none] *self.size
self.data = [none] *self.size
#hash 函式實現簡單的餘數方法
defhash(self, key, size):
return key %size
#衝突解決技術是 加1 rehash 函式的線性探測
defrehash(self, old_hash, size):
return (old_hash+1) %size
#假定最終將有乙個空槽,除非 key 已經存在於 self.slots 中。 它計算原始
#雜湊值,如果該槽不為空,則迭代 rehash 函式,直到出現空槽。如果非空槽已經包含 key,
#則舊資料值將替換為新資料值。
defput(self, key, data):
hash_value =self.hash(key, len(self.slots))
if self.slots[hash_value] is
none:
self.slots[hash_value] =key
self.data[hash_value] =data
else
:
if self.slots[hash_value] ==key:
self.data[hash_value] =data
else
: next_slot =self.rehash(hash_value, len(self.slots))
while self.slots[next_slot] is
not none and
\ self.slots[next_slot] !=key:
next_slot =self.rehash(next_slot, len(self.slots))
if self.slots[next_slot] is
none:
self.slots[next_slot] =key
self.data[next_slot] =data
else
: self.data[next_slot] =data
#從計算初始雜湊值開始。如果值不在初始槽中,則 rehash 用
#於定位下乙個可能的位置。
defget(self, key):
start_slot =self.hash(key, len(self.slots))
data =none
stop =false
found =false
pos =start_slot
while self.slots[pos] is
not none and
not found and
notstop:
if self.slots[pos] ==key:
found =true
data =self.data[pos]
else
: pos =self.rehash(pos, len(self.slots))
if pos ==start_slot:
stop =true
return
data
#我們過載 __getitem__ 和 __setitem__ 方法以允許使
#用 訪問。 這意味著一旦建立了hashtable,索引操作符將可用。
def__getitem__
(self, item):
return
self.get(item)
def__setitem__
(self, key, value):
self.put(key, value)
python實現順序查詢和雜湊查詢
順序查詢非常簡單,只是個開胃菜,今天主要練習的是雜湊查詢 先上順序查詢 def sequence search array,num for i in range len array if array i num return i return false array 0 23 43,12 54,65...
python實現順序查詢和折半查詢
1 順序查詢 特點 不需要內容有序,乙個乙個查詢 缺點 查詢效率低,不適合大資料 假設資料的總個數為n,則計算複雜度為n 2 下面的程式由三個函式組成,第乙個函式是裝飾器,作用是計算函式的 執行時間 第二個函式的作用是資料的輸入,為方便直接給列表裝載i 第三個函式的作用是實現順序查詢 coding ...
python實現簡單的雜湊查詢
雜湊簡單滴說就是把字串str 轉換成 一組數字,該組數字是唯一的 哎喲,太難說了,lol開了,詳細見 下面給出 實現 這裡我測試的字串是以前三位字母,最後一位數字為例,例如 bcd3 nhj4 gbd0 lis 0 for i in range 26 26 26 10 用於儲存得到的雜湊值 prin...