ロス・バレーから転載[ https://www.luogu.org/blog/yihan/unordered(https://www.luogu.org/blog/yihan/unordered)
これは何ですか?
unordered_map&unordered_set / unordered_multiset:我々は2つの(3)非常に実用的なコンテナを含むC ++ 11でいくつかの有用なコンテナが存在することを知っています
その実装と操作マップ&類似/マルチセット設定、我々は地図を知っていると、実装に設定されている O(logN個)O (L O GのN- 赤黒木の実装が構築されているマップの実現のために)。時間のほとんどは、順序付けられたシーケンス未満でいくつかの問題が非常に良いされているが、多くの場合があるでしょう(私たちは、内部のセットを注文さを知っている)が、よりスピードを必要としています。あなたが選ぶことができます。この時間は、ハッシュを再生します。しかしyijanのための高度ながん患者が自然にこの怠惰な実用的なunordered_mapをしたい&達成unordered_multiset O(1)O (1 )クエリを。
あなたが使用する場合は、このセクションをスキップすることができます
最初に定義されています。C ++ 11の環境であれば、書きやすいです。
#include<unordered_set>
#include<unordered_map> #include<iostream> using namespace std; unordered_set<int> S1; unordered_multiset<int> S2; unordered_map<int,int> M; int main(){ S1.insert(6); S2.insert(7); M[233333] = 666666; cout << M[233333]; }
しかし、我々は、シリーズのレースは、エイズ磁器C ++ 11のは明らかではありませんNOIP!方法は?
それは確かに賢いが、無用です!:(何があると言われていません問題点)
#include<tr1/unordered_set>
#include<tr1/unordered_map> #include<iostream> using namespace std; using namespace tr1; unordered_set<int> S1; unordered_multiset<int> S2; unordered_map<int,int> M; int main(){ S1.insert(6); S2.insert(7); M[233333] = 666666; cout << M[233333]; }
次に、非11環境で使用することができます!(例えば、C ++ 11が実行することができますに投票しないことを選択したluoguideなど!)
まあ、((そんなに、入力した次のと
今、私たちがしたいです!カードアウトunordered_map!
しかし、単純に言って、カードがどのように落ちますか?まず、私たちが知っている、その限りハッシュ関数として、多重衝突であれば、自然率 O(N) - > O(N ^ 2)O (N- )- > O (N- 2 )
あなたは発見プロセスに敏感でない場合は、この項をスキップすることができます
:まず第一に、のunorderedmapソースファイルを手放すGitHubの上
私たちは、この文を見ることができるもの、の原則の実現を知っている必要があり、明らかにハッシュテーブルと呼ばれる _Mod_range_Hashing
と _Prime_rehash_policy
、ここから我々はこのことについて知ることができ、実装工程である:最初のデータをハッシュして、ハッシュ値の剰余を置きますunordered_map。
するには_Prime_rehash_policy
(探検hashtable_c ++ 0x.ccを)我々は、配列を見つけることができます__prime_list
。この時点では、オンにし、実装のどの部分を見つけることができます:マップが大きすぎる場合には、それ自体のサイズを変更します。私たちは、この素数表を見つけたときにこれは脇に置きます。
そして、それは(開かれたhashtable-aux.ccあなたがの配列を見ることができます)!
さて、私たちは今、この配列を見つけ、そして基本的な実装を習得します。しかし、我々は、それが何であったかを実現内蔵のハッシュを見つける必要があります。実際には、使用std::hash
中cppreferenceで書かれました:
順不同連想はstd ::コンテナunordered_set、STD :: unordered_multiset、STD :: unordered_map、STD ::特別なテンプレートはstd ::にハッシュunordered_multimapデフォルトのハッシュ関数に。
ここでは、我々はそれの外にスナップすることができます。いないすべての素数は、これを行うと、1つまたは2つだけ例外ことができます。あまりにも怠惰なブロガーは、この素数を探すのに時間がかかるので、以下の参考文献は、ボーエン文をCF:
gccの6またはそれ以前のために、126271は、仕事をして、とgcc 7以降のために、107897は動作します。
私たちは、今以上126271 6or早く、それは非常に適切な素数であるコンパイラを使用します。
本当にのためのコードを突き出し
luoguは、問題持つABのP1102の数をこれは、一般的なマッピングすることができ、交流の水の問題です。unordered_set&unordered_mapを比較してみましょう
これは、一部ACコードです:
次に図では、次のunordered_mapを使用して、上記マップを使用することです
これは、後にかかわらず、空間と時間の見抜群の順序付けられていないことができます。
それをハック!
私たちは、目の前でカードオフは、入力ファイルを実行するコードを言った素数を使用しています。20万回126271のデジタル入力1。それぞれ、次に実行するために、マップunordered_mapを使用しています。見るために結果は何ですか?(作成された他のタイトルOJでは、速度が類似しているはず)
、テストデータのダウンロード:INPUT_FILE
はい、あなたは右読み、完全な実行4S!
ハックしませんか?
ハッシュ関数を書きます!
もちろん、私はほとんどの時間は、誰かがあなたのunordered_mapをハックのために物事を困難にするつもりはないと信じています。。CFゲーム除きます。。。(CCFは、私は何も方法を持って、このデータを作ります)
特定のは、自分自身のハッシュ関数は、私は自分自身を作っ参考材料とすることができ、書き込み。これはもはや重荷ではありません。
概要
unordered_map /セットは確かに良いことです!
NOIPは複雑で見つかった場合は、はい、
マップを使用してみてください
結局のところ、その結果、カード(死んで最短経路偽のアルゴリズム)をCCFすることができます
ああ、他のCF運命をハックすることを忘れないでください。
:ハッシュ参照CFの記事はみ出しについて ニールさんのブログを(ブロガーが再生からライセンスを受けています)
これをするために使用することが可能に多くの自然NOIPの診察室があります。チートポイントSTLコンテナと。持続可能なバランスの取れた木も、私は問題の解決策を参照することができます永続的なバランスツリー40ライン(ボードのタイトルMLE)を達成することができます
もちろん、PBDにパーティーがハッシュ私は他に方法がない直接ああQWQと呼ばれるこの事を考える必要があります。。