[解決済み】スキップリストとバイナリサーチツリーの比較
質問
として知られるデータ構造に最近出会いました。 スキップリスト . 二分探索木と非常によく似た動作をしているようです。
なぜ、バイナリサーチツリーではなく、スキップリストを使おうと思ったのでしょうか?
どのように解決するのか?
スキップリストは、同時アクセス/変更にもっと適応的です。 Herb Sutter は 記事 同時並行環境におけるデータ構造について より詳細な情報が載っています。
バイナリサーチツリーの実装で最もよく使われるのは 赤黒い木 . 同時進行の問題は、ツリーが変更されたときに、しばしばリバランスが必要になることです。 リバランス操作は、木の大部分に影響を与える可能性があり、木のノードの多くにミューテックスロックが必要になります。 ノードをスキップリストに挿入する場合は、はるかに局所的で、影響を受けるノードに直接リンクしているノードだけをロックする必要があります。
Jon Harropsのコメントからの更新
FraserとHarrisの最新論文を読みました。 ロックなしの並行プログラミング . ロックフリーのデータ構造に興味があるなら、本当に良いものだ。 この論文では トランザクショナルメモリ と理論演算であるmulti-word-compare-and-swap MCASがあります。 どちらもハードウェアではまだサポートされていないため、ソフトウェアでシミュレートしている。 MCASをソフトウェアで構築できたことに、かなり感心しています。
トランザクションメモリについては、ガベージコレクタが必要なため、特に説得力は感じませんでした。 また ソフトウェアトランザクショナルメモリ は、パフォーマンスの問題に悩まされています。 しかし、もしハードウェア・トランザクション・メモリが一般的になったら、私はとても楽しみです。 結局のところ、これはまだ研究であり、あと10年ぐらいはプロダクションコードには使えないでしょう。
8.2節では、いくつかの並列ツリー実装の性能を比較しています。 その結果を要約する。 50ページ、53ページ、54ページに非常に有益なグラフがあるので、PDFをダウンロードする価値がある。
- スキップリストのロック はめちゃめちゃ速いです。 同時アクセス数が増えても 驚くほど高速になります。 これがスキップリストの特徴で、他のロックベースのデータ構造は、圧力がかかると壊れる傾向があります。
- ロックフリースキップリスト は、ロック付きスキップリストより一貫して高速ですが、かろうじてです。
- トランザクションスキップリスト は、ロック版と非ロック版に比べ、一貫して2-3倍遅くなります。
- ロック式赤黒い木 同時アクセスに耐えられない。 その性能は、新しい同時アクセスユーザが増えるたびに直線的に低下します。 2つの既知のロック機能付き赤黒木の実装のうち、1つは基本的に木のリバランス中にグローバルロックがかかります。 もうひとつは、複雑なロックエスカレーションを使用しますが、グローバルロックの実装を大きく上回ることはありません。
- ロックフリーの赤黒い木 は存在しない(もはや真実ではない、Updateを参照)。
- トランザクション赤黒い木 は、トランザクションのスキップリストと同等である。 これはとても驚きで、とても期待できることでした。 トランザクション・メモリは、書くのがずっと簡単であれば、より遅くなります。 非同期バージョンで素早く検索と置換を行うのと同じくらい簡単なこともある。
更新情報
ロックフリーの木に関する論文はこちらです。
CASを用いたロックフリーの赤黒い木
.
深く調べたわけではありませんが、表面上はしっかりしているように思います。
関連
-
[解決済み] O(log* N)とは何ですか?
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み] ゲーム「2048」の最適なアルゴリズムとは?
-
[解決済み] フラットテーブルをツリーにパースする最も効率的/エレガントな方法は何ですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】リンクリストのループを検出する方法は?
-
[解決済み】2分木と2分探索木の違いについて
-
[解決済み】C#のツリーデータ構造
-
[解決済み】HSLからRGBへの色変換
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] n個のユニオンのfind(サイズによるユニオン)演算を実行する際の時間計算量がO(n log n)であるのはなぜか?
-
[解決済み] バックトラックアルゴリズムの時間計算方法は?
-
[解決済み] O(log n)とは具体的にどういう意味ですか?
-
[解決済み] 深さ優先グラフアルゴリズムの時間複雑性【非公開
-
[解決済み】Redisに使用されている基礎的なデータ構造は何ですか?
-
[解決済み】与えられた和になるように数字の組み合わせの可能性を探す
-
[解決済み】背景色からフォントカラーを決定する方法
-
[解決済み】log(n!)=Θ(n-log(n))なのか?)
-
[解決済み】整数の流れから実行中央値を求める
-
[解決済み】HSLからRGBへの色変換