[解決済み] C++のSTLでバイナリサーチツリーを実装?
質問
ご存知ですか? C++ STL が含まれています。 バイナリサーチツリー(BST) の実装が必要なのか、それとも自分でBSTオブジェクトを作成した方がいいのか?
STLにBSTの実装がない場合、利用できるライブラリはありますか?
私の目標 は、目的のレコードをできるだけ早く見つけることができるようにすることです。私はレコードのリスト(数千は超えないはず)を持っており、私はそのリストの中でフレーム単位(コンピュータゲームです)の検索を行います。私は、私の関心のあるレコードの識別子としてunsigned intを使用しています。どのような方法であれ、最も速い方法が私にとって最も効果的でしょう。
どのように解決するのですか?
必要なのは、あるデータをあるキーで検索する方法です。キーは
unsigned int
このように、いくつかの可能性があります。もちろん
std::map
:
typedef std::map<unsigned int, record_t> my_records;
しかし、それ以外の可能性もあります。例えば、かなり高い確率で
ハッシュマップはさらに高速になります
バイナリツリーよりも ハッシュマップは
unordered_map
は、C++では
C++11
コンパイラやstd libですでにサポートされている可能性があります (コンパイラのバージョンとドキュメントを確認してください)。これらは、最初に
C++TR1
(
std::tr1::unordered_map
)
キーが密接に分散している場合は、単純な 配列 で、そのキーをインデックスとして使用します。速さに関して言えば、配列へのインデックスに勝るものはないでしょう。しかし、キーの分布があまりにランダムだと、多くのスペースを浪費することになります。
としてレコードを保存する場合 ポインター また、データをキーでソートしてベクターに保存することもできます。
typedef std::vector< std::pair<unsigned int, record_t*> > my_records;
より良いデータローカリティのため、おそらくプロセッサキャッシュと相性が良く、シンプルな
std::vector
理論的には他のデータ構造が有利になるはずですが、多くの場合、他のデータ構造よりも良いパフォーマンスを発揮します。その弱点は、中間に挿入したり、削除したりすることです。しかし、この場合、32ビットシステムでは、2*32ビットPODのエントリを移動する必要があり、実装では、メモリ移動のためのCPU intrinsicsを呼び出して実行する可能性があります。
関連
-
[解決済み】構造体のベクター初期化について
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み] 家系図ソフトのサイクル
-
[解決済み] なぜC++ STLは "ツリー "コンテナを提供しないのですか?
-
[解決済み] 二分木の応用例にはどのようなものがありますか?
-
[解決済み】2分木と2分探索木の違いについて
-
[解決済み】スキップリストとバイナリサーチツリーの比較
-
[解決済み] Pythonによる二項探索(バイセクショ ン)機能
-
[解決済み] 二分探索木におけるk番目の最小要素を最適な方法で探す
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】変数やフィールドがvoid宣言されている