สมมติว่าเราต้องการออกแบบโครงสร้างข้อมูล HashSet โดยไม่ต้องใช้ไลบรารีตารางแฮชในตัว จะมีฟังก์ชั่นที่แตกต่างกันเช่น -
- add(x) − แทรกค่า x ลงใน HashSet
- ประกอบด้วย(x) - ตรวจสอบว่าค่า x มีอยู่ใน HashSet หรือไม่
- remove(x) − ลบ x ออกจาก HashSet ในกรณีที่ไม่มีค่าใน HashSet ไม่ต้องทำอะไร
ดังนั้นเพื่อทดสอบ เริ่มต้นชุดแฮช จากนั้นเรียก add(1), add(3), ประกอบด้วย(1), มี(2), เพิ่ม(2), มี(2), ลบ(2), มี(2 ) จากนั้นผลลัพธ์จะเป็นจริง (1 คือปัจจุบัน) เท็จ (2 ไม่มีอยู่) จริง (2 คือปัจจุบัน) เท็จ (2 ไม่มีอยู่) ตามลำดับ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดโครงสร้างข้อมูลหนึ่งโครงสร้างที่เรียกว่า Bucket เริ่มต้นตามด้านล่าง
- bucket :=รายการใหม่
- กำหนดฟังก์ชัน update() นี่จะใช้เวลาที่สำคัญ
- พบ :=เท็จ
- สำหรับแต่ละดัชนี i และคีย์ k ในบัคเก็ต ให้ทำ
- ถ้าคีย์เหมือนกับ k แล้ว
- bucket[i]:=คีย์
- พบ:=จริง
- ออกมาจากวงจร
- หากพบว่าเป็นเท็จ
- ใส่คีย์ที่ส่วนท้ายของที่เก็บข้อมูล
- ถ้าคีย์เหมือนกับ k แล้ว
- กำหนดฟังก์ชัน get() นี่จะใช้เวลาที่สำคัญ
- สำหรับแต่ละ k ในถัง ทำ
- ถ้า k เหมือนกับคีย์ ดังนั้น
- คืนค่า True
- คืนค่าเท็จ
- ถ้า k เหมือนกับคีย์ ดังนั้น
- สำหรับแต่ละ k ในถัง ทำ
- กำหนดฟังก์ชัน remove() นี่จะใช้เวลาที่สำคัญ
- สำหรับแต่ละดัชนี i และคีย์ k ในบัคเก็ต ให้ทำ
- ถ้าคีย์เหมือนกับ k แล้ว
- ลบที่เก็บข้อมูล[i]
- ถ้าคีย์เหมือนกับ k แล้ว
- สำหรับแต่ละดัชนี i และคีย์ k ในบัคเก็ต ให้ทำ
- ตอนนี้สร้าง hashSet ที่กำหนดเอง จะมีวิธีการดังต่อไปนี้
- เริ่มต้นสิ่งนี้ดังนี้ −
- key_space :=2096
- hash_table:=รายการของวัตถุประเภทที่เก็บข้อมูลของขนาด key_space
- กำหนดฟังก์ชัน add() นี่จะใช้เวลาที่สำคัญ
- hash_key:=ตัวดัดแปลงคีย์ key_space
- เรียก update(key) ของ hash_table[hash_key]
- กำหนดฟังก์ชัน remove() นี่จะใช้เวลาที่สำคัญ
- hash_key:=keymodkey_space
- ลบคีย์จาก hash_table[hash_key]
- กำหนดฟังก์ชันมี () นี่จะใช้เวลาที่สำคัญ
- hash_key:=keymodkey_space
- ส่งคืน (คีย์) ของ hash_table[hash_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