使用する際に実際のアプリケーションでは、具体的な利点がありますの代わりにO(ログ(N ))のアルゴリズム?
これは、従来の二分探索木実装の代わりに、たとえばvan Emde Boas木を使用する場合です。ただし、たとえば、場合、最良の場合、対数アルゴリズムは対数アルゴリズムよりも(約)5倍優れています。また、一般的に、実装はよりトリッキーで複雑です。
私が個人的にVEBツリーよりもBSTを好むとすれば、どう思いますか?
簡単にそれを示すことができます:
使用する際に実際のアプリケーションでは、具体的な利点がありますの代わりにO(ログ(N ))のアルゴリズム?
これは、従来の二分探索木実装の代わりに、たとえばvan Emde Boas木を使用する場合です。ただし、たとえば、場合、最良の場合、対数アルゴリズムは対数アルゴリズムよりも(約)5倍優れています。また、一般的に、実装はよりトリッキーで複雑です。
私が個人的にVEBツリーよりもBSTを好むとすれば、どう思いますか?
簡単にそれを示すことができます:
回答:
まだlog (log n )よりも指数関数的に(log (n )で)速く成長することを忘れないでください!
実際、とlog (log (n ))の商を見れば、それほど印象的なものはありません。
[ ソース ]
しかし、それでも、最大サイズの場合、係数は5〜6になります。大きいサイズは実際には珍しくありませんし、その要因によって高速化であることに注意してください素晴らしいです!昼食後または明日のみ結果が異なる場合があります。高速化の一部は、ツリー実装のより高い定数によって失われる可能性があることに注意してください。あなたはプロットに持っている(または分析)ですC ⋅ ログ(N )およびD ⋅ ログ(ログ(nは))で、C 、dは実際の映像を取得するために、実際の実行時定数を。
さらに、Daveが言及していることが重要です。このように高速化された操作が、たとえば線形に頻繁に実行される場合、一定の高速化は線形の高速化になります。つまり、アルゴリズム全体の先行定数を減らすことができます。上で述べたように、それは素晴らしいことです。操作を回実行するとどうなるか見てください。
[ ソース ]
さて、それが問題の価値がない場合、私は何を知りません。
私は実際にバンエムデボアスツリーを一度ベンチマークしました。AAツリー、ハッシュマップ、ビット配列と比較しました。
テストsize
では、間隔内で乱数を使用して挿入を実行し[0, bound]
、size
検索してからsize
削除してから、再度size
検索します。削除は乱数に対しても行われるため、まず構造内にあるかどうかを把握する必要があります。
秒単位の結果(size
= 2000000、bound
= 10000000)は次のとおりです。
AATreeLookup - O(n log n)
Inserting... 3.3652452
Searching... 5.2280724
Deleting... 7.3457427
Searching... 9.1462039
HashLookup - O(n) expected
Inserting... 0.3369505
Searching... 0.6223035
Deleting... 0.9062163
Searching... 1.1718223
VanEmdeBoasTree - O(n log log n)
Inserting... 0.7007531
Searching... 1.1775800
Deleting... 1.7257065
Searching... 2.2147703
ArrayLookup - O(n)
Inserting... 0.0681897
Searching... 0.1720300
Deleting... 0.2387776
Searching... 0.3413800
ご覧のように、バンエムデボアスツリーは、ハッシュマップの約2倍、ビット配列の10倍、バイナリ検索ツリーの5倍の速度です。
もちろん、上記には免責事項が必要です。テストは人工的なものであり、コードを改善したり、出力がより速いコンパイラなどで別の言語を使用したりすることができます。
この免責事項は、アルゴリズム設計で漸近分析を使用する理由の中心にあります。定数が何であるかがわからないため、定数は環境要因に応じて変化する可能性があるため、できる最善のことは漸近分析です。