ヘッジユニオンは常に分割統治と同じくらい速いですか?


8

Adamsは、2つのセットの和集合を見つけるための分割統治アルゴリズムを説明します(重みが均衡化されたバイナリ検索ツリーとして表されます)。次に彼は、分割統治アルゴリズムを改良したと主張する当時の新しい「ヘッジ結合」アルゴリズムについて説明します。しかし、彼はそれがであるべき理由の証明や実際の説明さえ提供していません。O(m+n)

Blelloch、Ferizovic、およびSunは、Adamsの分割統治アルゴリズムが実際に理論的に最適な達成することを示してい。ここで、です。ただし、これらはヘッジユニオンアルゴリズムには対応していません。Θ(mlog(n/m+1))mn

ヘッジユニオンは実際、分割統治と同じくらい効率的ですか?最も目立たない部分はインナートリムです。少なくとも表面的には、完全に分割された左側と右側のサブツリー間で作業が重複しているように見えます。おそらくこれは何らかの理由で問題ないかもしれませんが、理由はわかりません。

さらなる調査:Haskell Data.SetData.Map、交差と差分のヘッジバリアント、および共用体を使用します。これらのアルゴリズムに関する公開された議論はまったく見つかりませんでした。同様の質問がこれらにも当てはまります。

回答:


3

ヘッジアルゴリズムの理論的な分析はまだ確認または作成していませんが、二分木の分割統治アルゴリズムよりも悪いという経験的証拠はいくつかあります。

Haskell containersパッケージのコードから始めて、呼び出しパターンの特殊化を手動で適用して中間の割り当てを減らすことで、ヘッジユニオンアルゴリズムを最適化しました。これにより、パフォーマンスが約10%向上し、公平なショットが得られました。

Adamsの分割統治コードから始めて、入力のいずれかがシングルトンである場合に特別なケースを追加することにより、ユニオンアルゴリズムを最適化しました(ヘッジユニオンコードは一方を最適化し、もう一方を最適化できるかどうかは明確ではありません)同様に)。

でパッケージ化された一連の操作ベンチマークのコレクションを使用して、各実装をテストしましたcontainers。分割統治は通常、ヘッジよりも速く、時には2倍の速さでした。遅くなると、ほんの少しだけ。

他の集合演算の同様のベンチマークでも同様の結果が得られました。


投機:

ヘッジアルゴリズムは、分岐係数が大きいツリーを使用する場合に役立ちます。再帰的に分割するとコストが高くなる可能性があります。また、小さなサブツリーにも役立ち、追加の作業に見合うだけの十分な割り当てを節約できます。


Data.Setこれらの観察に基づいて実際に実装を変更しましたか?
Joachim Breitner、2018年

@JoachimBreitner、そうです。新しい安全なマージユーティリティにも同じアプローチを使用しましたが、それらの正確なパフォーマンス特性を特徴付けることは確かに困難を伴うことが困難です。
dfeuer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.