LeetCode 380:一定時間の挿入、削除、削除GetRandom O挿入ランダムな要素を取得する(1)

トピック:

設計された支持体の平均の時間複雑さO(1)は、データ構造は以下の動作を行います。

  1. insert(val):要素が存在しないヴァルとき、コレクションに挿入されます。
  2. remove(val):コレクションから項目を削除する要素のvalがある場合。
  3. getRandom:従来のランダムコレクションを返します。各要素は持っていなければならないのと同じ確率返されます。

で、次のすべての操作をサポートするデータ構造設計の平均 O(1)時間を。

  1. insert(val):挿入存在していない場合設定する項目valを。
  2. remove(val):存在する場合のセットからアイテムvalを削除します。
  3. getRandom:要素の現在のセットからランダムな要素を返します。各要素は持っている必要があります同じ確率返されるのを。

例:

// 初始化一个空的集合。
RandomizedSet randomSet = new RandomizedSet();

// 向集合中插入 1 。返回 true 表示 1 被成功地插入。
randomSet.insert(1);

// 返回 false ,表示集合中不存在 2 。
randomSet.remove(2);

// 向集合中插入 2 。返回 true 。集合现在包含 [1,2] 。
randomSet.insert(2);

// getRandom 应随机返回 1 或 2 。
randomSet.getRandom();

// 从集合中移除 1 ,返回 true 。集合现在包含 [2] 。
randomSet.remove(1);

// 2 已在集合中,所以返回 false 。
randomSet.insert(2);

// 由于 2 是集合中唯一的数字,getRandom 总是返回 2 。
randomSet.getRandom();

問題解決のアイデア:

  • O(1)の挿入および削除操作の時間計算量を必要とする:ハッシュアルゴリズムは、ハッシュのセットを設計された高レベルのプログラミング言語を利用することができ、最初から設計することができる/地図

  • 戻り値は、ランダム要素と同じ確率を必要とする:ランダムなハッシュセットは、ストレージアレイに順次、ランダムに生成されたインデックス添字、戻り対応する要素の値として、別の手段であることが要素を返すことができません

その後、補助配列のインデックスのインデックス値の記憶素子の価値、重要な要素の値は、ハッシュマップ記憶素子を使用する必要があります

インサートインサートは、配列、ハッシュマップです

そのようなアレイはますます擬似の原因となるため、削除操作の困難嘘、最初単にダミー値を形成することにより、削除されない配列要素の値を削除し、続いて、キーと値のペアのハッシュマップを、削除は不可能ですより大きなメモリを爆発します。

コード:

Javaの:

class RandomizedSet {
    List<Integer> list;
    Map<Integer, Integer> map;
    Random rand;

    /** Initialize your data structure here. */
    public RandomizedSet() {
        list = new ArrayList();
        map = new HashMap();
        rand = new Random();
    }

    /**
     * Inserts a value to the set. Returns true if the set did not already contain the specified element.
     * 常规插入操作
     */
    public boolean insert(int val) {
        if (map.containsKey(val))
            return false;
        map.put(val, list.size()); // value 表示存储在 list 中的索引下标
        list.add(val); // 添加在数组 list 尾部
        return true;
    }

    /**
     * Removes a value from the set. Returns true if the set contained the specified element.
     * 
     */
    public boolean remove(int val) {
        if (!map.containsKey(val)) // 如果哈希映射中不存在该键 直接返回 False
            return false;
        int tmp = list.get(list.size() - 1); // 暂存数组最后一位元素值
        int index = map.get(val); // 获取待删除元素在 list 数组中对应的索引下标 index
        list.set(index, tmp); // 将 list 中该元素值改为暂存的数组最后一位值
        map.put(tmp, index); // 更新哈希映射中代表数组最后一位的键值对 对应的索引下标为 index
        list.remove(list.size() - 1); // 删除数组最后一位
        map.remove(val); // 删除哈希映射中该键值对
        return true;
    }

    /** Get a random element from the set. */
    public int getRandom() {
        return list.get(rand.nextInt(list.size())); // 产生一个大小为 [0, 数组大小) 的随机索引下标
    }
}

Pythonの:

from random import choice

class RandomizedSet:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.val_map = dict()
        self.val_list = list()

    def insert(self, val: int) -> bool:
        """
        Inserts a value to the set. Returns true if the set did not already contain the specified element.
        """
        if val not in self.val_map:
            self.val_map[val] = len(self.val_list) # value 表示存储在 val_list 中的索引下标
            self.val_list.append(val) # 添加在数组 val_list 尾部
            return True
        return False

    def remove(self, val: int) -> bool:
        """
        Removes a value from the set. Returns true if the set contained the specified element.
        """
        if val in self.val_map:
            index = self.val_map[val] # 获取待删除元素在 list 数组中对应的索引下标 index
            last_val = self.val_list[-1] # 暂存数组最后一位元素值
            self.val_list[index] = last_val # 将 list 中该元素值改为暂存的数组最后一位值
            self.val_map[last_val] = index # 更新哈希映射中代表数组最后一位的键值对 对应的索引下标为 index
            self.val_map.pop(val) # 删除哈希映射中该键值对
            self.val_list.pop() # 删除数组最后一位
            return True
        return False

    def getRandom(self) -> int:
        """
        Get a random element from the set.
        """
        return choice(self.val_list) # 返回数组中的随机一个元素

愛のバグ書き込み:マイクロ手紙公衆_ノーへようこそ注意
私はBug.jpegを書くのが大好き

おすすめ

転載: www.cnblogs.com/zhangzhe532/p/12511701.html