web-dev-qa-db-ja.com

AVLツリーと実際の世界

学校では、挿入または削除時にAVLツリーのバランスをどのように調整できるかを教えられています。

この種の知識は実際に現実の世界でどのように役立つでしょうか?誰かがこのタイプの知識が実際に役立つときの例を挙げられますか?

私が見たところ、職場ではそのような詳細はほとんど出てきません...

アルゴリズムと一部のデータ構造に関する詳細な知識がどのように重要であるかを確認できますが、AVLツリーの回転(および同様の詳細な概念)などの詳細は確認できません。

ありがとう!

14
rrazd

AVLツリーの調査は、次の理由で役立ちます。

  • 抽象データについて推論するのに最適な方法です。特定のツリーについて考える必要はありません。あらゆる可能性を考慮する必要があります。この種の推論で練習することは、より単純なケースにも役立ちます。

  • 述語と契約を理解するための素晴らしい実践です。ツリーのバランスが取れていること、および各操作がバランスが保たれていることを証明するために使用するツールは、たとえば、セキュリティの問題や並列コードに適用できます。

  • 独自のバリアントを記述したり、まったく新しいタイプのデータ構造を作成したりすることができます。

  • 新しいライブラリまたはプラットフォーム用のAVLツリーを実装する必要があるだけかもしれません。

各種のソートアルゴリズムまたは各種のバランスツリーを学習する特定のメリットについて議論できます。最終的にどれを学習するかは重要ではありません学習することになりますが、最も重要なトピックをすべて網羅するようにしてください。

現実世界でアルゴリズムを知ることがいかに重要であるかを知りたい場合は、「 素晴らしいアイデアを殺す方法 」を参照してください。IncのFriendsterの没落に関する記事と、効率を改善することが彼らを助けたかもしれません。

13
Macneil

マクニールズポイントに加えて...

赤黒木は、C++ std::map(少なくともAFAIK)などの標準ライブラリ実装では広くサポートされていない便利で効率的な操作があるため、より直接的に役立つ可能性があります。赤黒ツリーは、「分割」(ツリーを2つにカットし、1つは指定されたキーより小さいキーを含み、もう1つはより大きいキーを含む)および「結合」(大きいキーのツリーと小さいツリーを組み合わせた逆)をサポートできます。キー)は両方ともO(log n)時間で行うことができますが、これらが標準のコンテナーライブラリでサポートされている場合は、十分に隠されているようです。

ただし、「拡張」データ構造は一般的です。簡単な例は、ほとんどすべてのツリーデータ構造のノードにサブツリーのサイズ情報を追加して、O(log n)添え字をサポートすることです。より洗練された例には、間隔ツリーが含まれます。

データ構造を拡張するというアイデアを得たら、特定のアプリケーションに役立つ多くのバリエーションがあり、ライブラリとして事前にパッケージ化されたものがほとんどありません。既存の標準ライブラリデータ構造(std::mapなど)は、ソースコードをコピーして直接変更しない限り拡張できません。テンプレートパラメータを使用してそれらを拡張することはできません。

もちろん、拡張データ構造を開発するには、基礎となる非拡張データ構造を理解する必要があります。

挿入/削除よりもはるかに多くの検索を行う場合(およびそれらの分割/結合操作が不要な場合)、AVLツリーは赤黒ツリーよりも高速になる可能性があるため、アプリケーションによっては、増強。

5
Steve314

番号

現実の世界ではあまり役に立たない...

を除いて、あなたが考えさせる

現実の世界にははるかに難しい問題があり、その多くはしないでくださいにはすでによく知られている解決策があります。

5
Steven A. Lowe