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が存在しない)になります。
これを解決するには、次の手順に従います-
- バケットと呼ばれる1つのデータ構造を定義し、以下のように初期化します
- バケット:=新しいリスト
- 関数update()を定義します。これが鍵となります
- found:=False
- バケット内の各インデックスiとキーkについて、実行します
- キーがkと同じ場合、
- バケツ[i]:=キー
- found:=True
- ループから抜け出す
- falseが見つかった場合は、
- バケットの最後にキーを挿入します
- キーがkと同じ場合、
- 関数get()を定義します。これには鍵がかかります
- バケット内のkごとに、
- kがキーと同じ場合、
- Trueを返す
- Falseを返す
- kがキーと同じ場合、
- バケット内のkごとに、
- 関数remove()を定義します。これには鍵がかかります
- バケット内の各インデックスiとキーkについて、実行します
- キーがkと同じ場合、
- バケットを削除[i]
- キーがkと同じ場合、
- バケット内の各インデックスiとキーkについて、実行します
- 次に、カスタムhashSetを作成します。次のような方法がいくつかあります
- これを次のように初期化します-
- key_space:=2096
- hash_table:=サイズkey_spaceのバケットタイプオブジェクトのリスト
- 関数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
-
Pythonでの二分木の直径
二分木があるとしましょう。木の直径の長さを計算する必要があります。二分木の直径は、実際には、ツリー内の任意の2つのノード間の最長パスの長さです。このパスは必ずしもルートを通過する必要はありません。したがって、ツリーが以下のようになっている場合、パスの長さ[4,2,1,3]または[5,2,1,3]は3であるため、直径は3になります。 これを解決するには、次の手順に従います- dfsを使用して直径を見つけ、答えを設定します:=0 ルートdfs(root)を使用してdfs関数を呼び出します dfsは以下のdfs(node)のように機能します ノードが存在しない場合は、0を返します 左
-
Pythonでの継承
この記事では、Python3.xでの継承と拡張クラスについて学習します。またはそれ以前。 継承は実際の関係をうまく表し、再利用性を提供し、推移性をサポートします。開発時間が短縮され、メンテナンスが容易になり、拡張も容易になります。 継承は大きく5つのタイプに分類されます- シングル 複数 階層的 マルチレベル ハイブリッド 上の図に示されているように、継承とは、実際に親クラスのオブジェクトを作成せずに、他のクラスの機能にアクセスしようとするプロセスです。 ここでは、単一の階層型継承の実装について学習します。 単一継承 例 # parent class class Studen