バイナリツリーは、階層データを格納する特定の目的に役立ちますか?それらの標準的な使用は何ですか?


12

バイナリツリーの構造と、それらのトラバース方法を理解しています。しかし、私はそれらの実際の使用法、プログラムとプログラミングの目的を実現するのに苦労しています。階層データの「実際の」例について考えると、ほぼ確実に2つ以上の子があります。たとえば、家系図では、母親には2人以上の子供がいることがよくあります。

「バイナリツリー」は、配列とリストの処理時間が高速であるため、線形関連データの保存にのみ有効ですか?または、階層データを保存する特定の目的に役立ちますか?もしそうなら、二分木の適用の例は何ですか。ノードに最大 2つの子があるようなデータは何ですか?


バイナリツリーの主な用途はデータの順序付けだと思います。https://en.wikipedia.org/wiki/Binary_search_tree
マンドリル

回答:


25

いいえ、二分木はあなたが考えている意味で階層データを保存するためのものではありません。n項ツリーの主な使用例nは固定数ですが、セマンティック階層ではなく高速検索機能です。

1人が1から100までの数字を考え、もう1人ができるだけ少ない推測で推測しなければならないという古いゲームを思い出してください。間違った推測をした場合、その数字を考えている人があなたもあなたに教えなければなりません高すぎるか低すぎる?常に50から始めて25または75に進み、その後の新しい推測ごとに検索範囲を半分に分割する必要があることがすぐにわかるため、しばらくすると退屈になります。最大7回の推測で、保証されています。

楽しいゲームにはならないかもしれませんが、その特性はバイナリ(および他のn項)ツリーを有用にするものです。それらを使用して、非常に大きなデータセットを非常に短い時間で検索できます。


素晴らしい回答ありがとうございます。バイナリツリーは、配列やリストにデータを格納するための別の構造ですが、高速な検索機能の利点がありますか?
sw123456

1
@ sw123456:そうです。すべてのエンジニアリングと同様に、トレードオフが伴います(同じ数の要素を持つ配列よりも多くの(そしてより断片化された)メモリを使用します。O(n)O(1)ではなくデータセットの要素#nにアクセスします)アクセスなど)が、高速検索は間違いなくバイナリツリーの主な利点です。
メイソンウィーラー

@ sw123456それを説明するのを手伝ってくれてうれしいです:)
メイソンウィーラー

3
ツリーのバランスが取れている場合、要素へのアクセスはO(log(n))です。O(n)は、縮退した場合の最悪のケースになります(ほとんどのノードは1つのブラケットのみを使用)。
マンドリル

@ sw123456ネットワークルーティングは、Trieと呼ばれるバイナリツリーのわずかな変更を使用します(問題ドメインの効率を高めるために作成されます)。IPアドレスを検索してパケットの転送先を見つけるときにルーターがツリーをビット単位で走査するときに、実際に階層情報を保存します。IPアドレスも本質的に階層的であるため、IPを走査してプレフィックスの最長一致を見つけると、ルーターはIP階層、サブネットIPなどを走査します。意味的には明らかではありませんが、関係はあります。Masonが答えたように、ルーターは検索効率のためにこの構造を使用します。
クリスクレフィス

3

ノードが無制限の数の子を持つことができるツリー構造は、バイナリツリーを使用して実装できます。

ツリー内の各ノードについて、それを左右のポインターを持つノードに置き換えます。左のポインターは、ノードの最初の子に移動します。正しいノードは、ノードの次の兄弟に移動します。特定のノードのすべての子は、右のポインターで結合されたリンクリストにあり、リストのヘッドは親の左のポインターでポイントされています。

複雑なn項ツリーは、単純な2進ツリーになりました。

これはKnuth、Vol。1どこか。


これは本当に興味深い実装です。各子ノードはリンクリストの開始点であるため、各ノードの訪問が開始されるという事実により、バランスが取れていればツリーはO(log)n)でなく、そうでなければO(n)でなくなると思います線形検索をオフにしますか?この実装により、検索時間が大幅に遅くなりますか?しかし、逆に、検索時間は標準の線形構造よりも速いでしょうか?これを正しく理解しましたか?
sw123456

@ sw123456、元のツリーのバランスが取れていた場合、結果のバイナリツリーはほぼ確実にバランスが取れません。他のすべては、ツリーのファン、特定のノードが持つ子供の数に依存すると考えています。線形検索は、特定のノードの子のどれをたどるかを見つけたときにのみ発生します。しかし、n項ツリーの他の実装でそれを回避できるかどうかはわかりません。
-Justsalt

2

バイナリツリーはなぜそれらを使用するのですか?

プログラミングでは、同じタイプのデータのコレクションで多くの作業を行います。

このデータを保存する2つの基本的な方法は、リンクリストと配列です。

どちらにも利点と欠点があります。リンクリストでは、任意の位置に要素を追加したり、要素を削除したりするのは簡単です。ただし、特定の要素にアクセスするのは困難です。目的の要素に到達するまでリストを確認する必要があるためです。

  • 効率的に検索しませんが、挿入と削除は簡単です。

特定の要素への配列アクセスは簡単ですが、要素を挿入または削除することは困難です。挿入手段は、配列を1つ拡張し、挿入位置1の前のすべての要素を右に移動して要素を挿入するためです。

  • (ソートされている場合)効率的に検索しますが、挿入と削除は困難です。

したがって、リンクリストと配列の両方に欠点があります。

配列とリンクリストの両方の問題に対処するために、バイナリツリーが作成されます。

  1. 簡単な挿入と削除
  2. 簡単な検索

したがって、バイナリツリーは、定期的に変更される大量のデータがある場合に作成されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.