C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

挿入削除GetRandomO(1)-C++で許可される複製


一部の操作をサポートするデータ構造を作成したいとします。これらの操作は、O(1)時間で実行する必要があります。したがって、これらの操作を-

のようにします。
  • insert(x):コレクションにxを挿入します
  • remove(x):コレクションからxを削除します
  • getRandom():これにより、そのコレクションからランダムな要素が検索されます。

これを解決するには、次の手順に従います-

  • 配列番号を作成します
  • 1つのマップを作成するm
  • 関数insert()を定義します。これにはvalが必要です。
  • ret:=valがmにない場合
  • m[val]の最後にnumsのサイズを挿入します
  • numsの最後に{val、m [val] –1}ペアのサイズを挿入します
  • return ret
  • 関数remove()を定義します。これにはvalが必要です。
  • ret:=valがmにない場合
  • retがゼロ以外の場合、-
    • last=numsの最後の要素
    • m[最後のキー][最後の値]:=m[val]の最後の要素
    • nums [[m [val]]の最後の要素:=最後
    • m[val]から最後の要素を削除します
    • m [val]が空の場合、-
      • mからvalを削除
    • numsから最後の要素を削除する
  • return ret
  • 関数getRandom()を定義します
  • コレクションからランダムな要素を1つ返します

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class RandomizedCollection {
public:
   vector <pair <int, int>> nums;
   unordered_map <int, vector<int>> m;
   RandomizedCollection() {
   }
   bool insert(int val) {
      bool ret = m.find(val) == m.end();
      m[val].push_back(nums.size());
      nums.push_back({val, m[val].size() - 1});
      return ret;
   }
   bool remove(int val) {
      bool ret = m.find(val) != m.end();
      if(ret){
         pair <int, int> last = nums.back();
         m[last.first][last.second] = m[val].back();
         nums[m[val].back()] = last;
         m[val].pop_back();
         if(m[val].empty())m.erase(val);
         nums.pop_back();
      }
      return ret;
   }
   int getRandom() {
      return nums[rand() % nums.size()].first;
   }
};
main(){
   RandomizedCollection ob;
   ob.insert(10);
   ob.insert(35);
   ob.insert(20);
   ob.insert(40);
   cout << (ob.getRandom()) << endl;
   ob.remove(20);
   cout << (ob.getRandom()) << endl;
}

入力

Insert 10, 35, 20, 40, then get one random number, say 40, then remove 20, again get random element, that is say 35.

出力

40
35

  1. C++でツリーノードを削除する

    ツリーがあり、このツリーはノード0をルートとしていると仮定します。これは、次のように与えられます- ノードの数はノードです i番目のノードの値はvalue[i] i番目のノードの親はparent[i] ノードの値の合計が0であるすべてのサブツリーを削除する必要があります。削除すると、ツリーに残っているノードの数が返されます。したがって、ツリーが次のような場合- 7つのノードがあり、出力は2になります これを解決するには、次の手順に従います- 子供と呼ばれる地図を作成する dfs()というメソッドを定義します。これにより、ノード、配列値、グラフが取得されます temp:=ペ

  2. C++でBSTのノードを削除する

    二分探索木があるとします。 1つのキーkを取得し、指定されたキーkをBSTから削除して、更新されたBSTを返す必要があります。したがって、ツリーが次のような場合- そして、キーk =3の場合、出力ツリーは-になります。 これを解決するには、次の手順に従います- ルートノードを削除するためにdeleteRoot()というメソッドを定義します。これは次のように機能します ルートがnullの場合、nullを返します ルートに右のサブツリーがない場合は、ルートの左に戻ります x:=ルートの後継者 xの左側を左に設定:=ルートの左側 ルート