Python 設計 HashSet
假設我們想要設計一個 HashSet 資料結構,而不使用任何內建的雜湊表庫。它將包含不同的函式,例如:
- add(x) - 將值 x 插入 HashSet 中。
- contains(x) - 檢查值 x 是否存在於 HashSet 中。
- remove(x) - 從 HashSet 中刪除 x。如果該值不存在於 HashSet 中,則不執行任何操作。
因此,要對其進行測試,請初始化雜湊集,然後呼叫 add(1)、add(3)、contains(1)、contains(2)、add(2)、contains(2)、remove(2)、contains(2)。輸出將分別為 true(1 存在)、false(2 不存在)、true(2 存在)、false(2 不存在)。
為了解決這個問題,我們將遵循以下步驟:
- 定義一個名為 Bucket 的資料結構,如下所示進行初始化
- bucket := 新列表
- 定義一個函式 update()。它將接收鍵作為引數
- found := False
- 對於 bucket 中的每個索引 i 和鍵 k,執行以下操作:
- 如果鍵與 k 相同,則
- bucket[i]:= 鍵
- found:= True
- 退出迴圈
- 如果 found 為 false,則
- 在 bucket 的末尾插入鍵
- 如果鍵與 k 相同,則
- 定義一個函式 get()。它將接收鍵作為引數
- 對於 bucket 中的每個 k,執行以下操作:
- 如果 k 與鍵相同,則
- 返回 True
- 返回 False
- 如果 k 與鍵相同,則
- 對於 bucket 中的每個 k,執行以下操作:
- 定義一個函式 remove()。它將接收鍵作為引數
- 對於 bucket 中的每個索引 i 和鍵 k,執行以下操作:
- 如果鍵與 k 相同,則
- 刪除 bucket[i]
- 如果鍵與 k 相同,則
- 對於 bucket 中的每個索引 i 和鍵 k,執行以下操作:
- 現在建立自定義 hashSet。它將包含以下幾個方法:
- 如下所示進行初始化:
- key_space := 2096
- hash_table:= 一個大小為 key_space 的 Bucket 型別物件的列表
- 定義一個函式 add()。它將接收鍵作為引數
- hash_key:= key mod key_space
- 呼叫 hash_table[hash_key] 的 update(key)
- 定義一個函式 remove()。它將接收鍵作為引數
- hash_key:= keymodkey_space
- 從 hash_table[hash_key] 中刪除鍵
- 定義一個函式 contains()。它將接收鍵作為引數
- hash_key:= keymodkey_space
- 返回 hash_table[hash_key] 的 get(key)
讓我們看看以下實現,以便更好地理解:
示例
class Bucket: def __init__(self): self.bucket=[] def update(self, key): found=False for i,k in enumerate(self.bucket): if key==k: self.bucket[i]=key found=True break if not found: self.bucket.append(key) def get(self, key): for k in self.bucket: if k==key: return True return False def remove(self, key): for i,k in enumerate(self.bucket): if key==k: del self.bucket[i] class MyHashSet: def __init__(self): self.key_space = 2096 self.hash_table=[Bucket() for i in range(self.key_space)] def add(self, key): hash_key=key%self.key_space self.hash_table[hash_key].update(key) def remove(self, key): hash_key=key%self.key_space self.hash_table[hash_key].remove(key) def contains(self, key): hash_key=key%self.key_space return self.hash_table[hash_key].get(key) ob = MyHashSet() ob.add(1) ob.add(3) print(ob.contains(1)) print(ob.contains(2)) ob.add(2) print(ob.contains(2)) ob.remove(2) print(ob.contains(2))
輸入
ob = MyHashSet() ob.add(1) ob.add(3) print(ob.contains(1)) print(ob.contains(2)) ob.add(2) print(ob.contains(2)) ob.remove(2) print(ob.contains(2))
輸出
True False True False
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP