学校では、挿入または削除時にAVLツリーのバランスを取る方法を教えています。
この種の知識は、実際に実際どのように役立つのでしょうか?誰かがこの種の知識が実際にいつ役立つのか例を示すことができますか?
私が見たものから、職場ではそのような詳細はほとんど出てきません...
アルゴリズムと一部のデータ構造に関する詳細な知識が重要になることはありますが、AVLツリーの回転(および同様の詳細な概念)などの詳細は重要ではありません。
ありがとう!
学校では、挿入または削除時にAVLツリーのバランスを取る方法を教えています。
この種の知識は、実際に実際どのように役立つのでしょうか?誰かがこの種の知識が実際にいつ役立つのか例を示すことができますか?
私が見たものから、職場ではそのような詳細はほとんど出てきません...
アルゴリズムと一部のデータ構造に関する詳細な知識が重要になることはありますが、AVLツリーの回転(および同様の詳細な概念)などの詳細は重要ではありません。
ありがとう!
回答:
AVLツリーの調査は、次の理由で役立ちます。
抽象データについて推論するための素晴らしいプラクティスです。特定のツリーについて考える必要はありません。あらゆる可能性を考慮する必要があります。この種の推論で練習することは、より単純な場合にも役立ちます。
述語とコントラクトを理解するための素晴らしいプラクティスです。ツリーのバランスを取り、各操作を証明するために使用するツールがバランスを維持していることを確認することは、たとえばセキュリティ上の問題や並列コードに適用できます。
独自のバリアントを作成したり、まったく新しいタイプのデータ構造を作成したりすることもできます。
新しいライブラリまたはプラットフォーム用にAVLツリーを実装する必要があります。
各種類のソートアルゴリズムまたは各種類のバランスの取れたツリーを学習する特定のメリットについて議論できます。最終的にどの学習をするかは重要ではありませんが、最も重要なトピックを完全に網羅するようにしてください。
現実の世界でアルゴリズムを知ることがどれほど重要かを知りたい場合は、Friendsterの没落についてのIncの記事である「How to Kill a Great Idea!」と、効率を改善するための基本原則のわずかな適用がどのように役立つかを読んでください。
マクニールポイントに加えて...
赤黒ツリーは、C ++ std::map
(少なくともAFAIK)などの標準ライブラリ実装で広くサポートされていない便利で効率的な操作があるため、より直接的に役立つ可能性があります。赤黒ツリーは、「分割」(ツリーを2つに分割し、1つは指定されたキーより小さいキーを含み、もう1つはより大きいキーを含む)と「結合」(逆、大きなキーのツリーと小さなツリーの組み合わせ)をサポートできますキー)は両方ともO(log n)の時間で実行できますが、これらが標準コンテナライブラリでサポートされている場合は、十分に隠されているようです。
ただし、データ構造の「拡張」は一般的です。簡単な例は、O(log n)添え字付けをサポートするために、ほぼすべてのツリーデータ構造のノードにサブツリーのサイズ情報を追加することです。より洗練された例には、間隔ツリーが含まれます。
データ構造を拡張するというアイデアを得ると、特定のアプリケーションに役立つさまざまなバリエーションがあり、ライブラリとして事前にパッケージ化されたものはほとんどありません。既存の標準ライブラリデータ構造(などstd::map
)は、ソースコードをコピーして直接変更するまで拡張できません。テンプレートパラメータを使用して拡張することはできません。
もちろん、拡張されたデータ構造を開発するには、基礎となる拡張されていないデータ構造を理解する必要があります。
AVLツリーは、挿入/削除よりも多くの検索を行う場合(およびそれらの分割/結合操作が不要な場合)、赤黒ツリーよりも高速になる可能性があるため、アプリケーションによっては、増強。
現実の世界では本当に役に立たない...
考えさせる以外は。
現実の世界にははるかに困難な問題があり、その多くにはまだよく知られた解決策がありません。