そして、キー構造体へのランダムの迅速なアクセスの確率はそれほど
RandomPool構造
次の3つの機能を完了し
、追加を繰り返していない、キーの構造に追加される:INSERT(キー)を
削除(キー)キーの元の構造を除去する;
getRandomを():ランダム等しい確率を任意のキー構造体を返します。
[必須]
insert
、delete
及びgetRandom
時間計算方法であります
。
アルゴリズムの考え方
HashSet
構造はinsert
、delete
動作時間の複雑さがあります
確率、及び今ランダム鍵を待つように戻り、
random
発生等確率値が、HashSet
に従ってkey
インデックスの代わりに使用することが考えられる指標値、HashMap
値を導入する;
従って2HashMap
:key_num_map
及びnum_key_map
key_num_map
メンテナンスkey
値num_key_map
ランダムに生成された値によって得られますkey
ハイライト:
-
count
保存key数量
-
対応
num
して値count
の増加(ユニーク)。 -
key_num_map
そして、num_key_map
削除指定されたキーがされて必要に応じて調整するとカウントNUMに対応する、
指定されたキーに対応する値にNUM、の充填回数対応するキー、——》
変更後のキーの状態を
key_num_map
中:
キー- NUM - 「シフトほかに
塗りつぶし-数- 「塗りつぶし- NUMnum_key_map
で:
NUM -キー- "NUM -フィル
COUNT -フィル- "削除
対応するコード
import random
class RandomPool():
def __init__(self):
self.key_num_map = {}
self.num_key_map = {}
self.count = 0
def insert(self, key):
if key not in self.key_num_map:
self.key_num_map[key] = self.count
self.num_key_map[self.count] = key
self.count += 1
def delete(self, key):
if key in self.key_num_map:
self.count -= 1
num = self.key_num_map[key] # number the key mapping in key_num_map
fill = self.num_key_map[self.count] # last key in num_key_map
self.key_num_map[fill] = num
self.num_key_map[num] = fill
del self.num_key_map[self.count]
del self.key_num_map[key]
def get_random(self):
return self.num_key_map[random.randrange(0, self.count)]
def __str__(self):
return ' '.join(self.key_num_map.keys())
# 简单测试
if __name__ == '__main__':
random_pool = RandomPool()
random_pool.insert('jiang')
random_pool.insert('zhi')
random_pool.insert('qiang')
print(random_pool)
print(random_pool.get_random())
random_pool.insert('jiang')
print(random_pool)
random_pool.delete('jiang')
print(random_pool)
print(random_pool.get_random())
ご質問や提案が、コメント欄や正しい私にメッセージを残してください!
私たちは、あなたが費やす時間と労力に感謝します!