日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python实现顺序查找和哈希查找

發布時間:2025/3/20 python 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python实现顺序查找和哈希查找 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

順序查找非常簡單,只是個開胃菜,今天主要練習的是哈希查找

先上順序查找代碼:

def sequence_search(array, num):for i in range(len(array)):if array[i] == num:return ireturn Falsearray_0 = [23, 43, 12, 54, 65, 48] print(sequence_search(array_0, 12)) >>> 2

在來看hash查找:

算法思想

哈希的思路很簡單,如果所有的鍵都是整數,那么就可以使用一個簡單的無序數組來實現:將鍵作為索引,值即為其對應的值,這樣就可以快速訪問任意鍵的值。這是對于簡單的鍵的情況,我們將其擴展到可以處理更加復雜的類型的鍵。

算法流程

1)用給定的哈希函數構造哈希表;
2)根據選擇的沖突處理方法解決地址沖突;
  常見的解決沖突的方法:拉鏈法和線性探測法。
3)在哈希表的基礎上執行哈希查找。

單純論查找復雜度:對于無沖突的Hash表而言,查找復雜度為O(1)(注意,在查找之前我們需要構建相應的Hash表)。

class HashSearch:def __init__(self, num):if isinstance(num, int):self.num = abs(num)self.empty = self.numself._list = [None] * self.numelse:raise TypeError('num must be a int number')def __hash(self, key):return key % self.numdef put(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] = keyself.empty -= 1def find(self, key):index = self.__hash(key)temp = indexwhile self._list[index] != key:index = self.__hash(index+1)       if index == temp:return Falsereturn index ''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class HashTable:def __init__(self):# 哈希表的初始大小已經被選擇為 11。盡管這是任意的,但是重要的是,# 大小是質數,使得沖突解決算法可以盡可能高效。self.size = 11self.slots = [None] * self.sizeself.data = [None] * self.size# hash 函數實現簡單的余數方法def hash(self, key, size):return key % size# 沖突解決技術是 加1 rehash 函數的線性探測def rehash(self, old_hash, size):return (old_hash+1) % size# 假定最終將有一個空槽,除非 key 已經存在于 self.slots 中。 它計算原始# 哈希值,如果該槽不為空,則迭代 rehash 函數,直到出現空槽。如果非空槽已經包含 key,# 則舊數據值將替換為新數據值。def put(self, key, data):hash_value = self.hash(key, len(self.slots))if self.slots[hash_value] is None:self.slots[hash_value] = keyself.data[hash_value] = dataelse:if self.slots[hash_value] == key:self.data[hash_value] = dataelse: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] = keyself.data[next_slot] = dataelse:self.data[next_slot] = data# 從計算初始哈希值開始。如果值不在初始槽中,則 rehash 用# 于定位下一個可能的位置。def get(self, key):start_slot = self.hash(key, len(self.slots))data = Nonestop = Falsefound = Falsepos = start_slotwhile self.slots[pos] is not None and not found and not stop:if self.slots[pos] == key:found = Truedata = self.data[pos]else:pos = self.rehash(pos, len(self.slots))if pos == start_slot:stop = Truereturn data# 我們重載 __getitem__ 和 __setitem__ 方法以允許使# 用 [] 訪問。 這意味著一旦創建了HashTable,索引操作符將可用。def __getitem__(self, item):return self.get(item)def __setitem__(self, key, value):self.put(key, value)

總結

以上是生活随笔為你收集整理的python实现顺序查找和哈希查找的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。