Python程式:在不使用庫set類的情況下定義集合資料結構


假設我們希望實現一個具有以下方法的集合資料結構:

  • 建構函式:構造集合的新例項
  • add(val):將整數val插入到集合中
  • exists(val):檢查val是否在集合中
  • remove(val):從集合中刪除val

因此,如果我們構造一個集合s,然後呼叫s.add(10),s.add(20),s.add(10),s.exists(10),s.remove(10),s.exists(10),s.exists(20),則輸出將是

  • 對於s.add(10),它將插入10
  • 對於s.add(20),它將插入20
  • 10已經在s中,所以不會發生任何事情
  • s.exists(10)將返回true,因為10存在
  • 透過s.remove(10)刪除10
  • s.exists(10)將返回false,因為10已被移除,並且一個元素只能存在一次
  • s.exists(20)將返回true,因為20存在。

為了解決這個問題,我們將遵循以下步驟:

  • 定義建構函式。
  • buckets := 一個空對映,它將儲存一個數據列表
  • 定義一個函式add()。它將接收val
  • 如果exists(val)為false,則
    • 將val插入到buckets[val]的末尾
  • 定義一個函式exists()。它將接收val
  • 當val在buckets[val]中時返回true,否則返回false
  • 定義一個函式remove()。它將接收val
  • 刪除buckets[val]

示例

讓我們看看以下實現以獲得更好的理解:

from collections import defaultdict
class MySet:
   def __init__(self):
      self.buckets = defaultdict(list)

   def add(self, val):
      if not self.exists(val):
         self.buckets[val].append(val)

   def exists(self, val):
      return val in self.buckets[val]

   def remove(self, val):
      del self.buckets[val]

s = MySet()
s.add(10)
s.add(20)
s.add(10)
print(s.exists(10))
s.remove(10)
print(s.exists(10))
print(s.exists(20))

輸入

s = MySet()
s.add(10)
s.add(20)
s.add(10)
s.exists(10)
s.remove(10)
s.exists(10)
s.exists(20)

輸出

True
False
True

更新於: 2021年10月14日

239次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.