RandomPool等しい確率ランダムクイックアクセスキー

そして、キー構造体へのランダムの迅速なアクセスの確率はそれほど

RandomPool構造

次の3つの機能を完了し
、追加を繰り返していない、キーの構造に追加される:INSERT(キー)を
削除(キー)キーの元の構造を除去する;
getRandomを():ランダム等しい確率を任意のキー構造体を返します。
[必須]
insertdelete及びgetRandom時間計算方法であります ザ・ 1 O(1)

アルゴリズムの考え方

HashSet構造はinsertdelete動作時間の複雑さがあります ザ・ 1 O(1) 確率、及び今ランダム鍵を待つように戻り、
random発生等確率値が、HashSetに従ってkeyインデックスの代わりに使用することが考えられる指標値、HashMap値を導入する;
従って2HashMapkey_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 - 「シフトほかに
    塗りつぶし-数- 「塗りつぶし- NUM

    num_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())

ご質問や提案が、コメント欄や正しい私にメッセージを残してください!

私たちは、あなたが費やす時間と労力に感謝します!

公開された57元の記事 ウォン称賛44 ビュー20000 +

おすすめ

転載: blog.csdn.net/the_harder_to_love/article/details/104221340