リンクリストとBinarySearchTreeの主な違いは何ですか? BSTはLinkedListを維持するための単なる方法ですか?私のインストラクターはLinkedListについて、次にBSTについて話しましたが、それらを比較したり、どちらを優先するかを言ったりしませんでした。これはおそらく愚かな質問ですが、私は本当に混乱しています。誰かがこれを簡単な方法で明確にできれば幸いです。
リンクリスト:
Item(1) -> Item(2) -> Item(3) -> Item(4) -> Item(5) -> Item(6) -> Item(7)
二分木:
Node(1)
/
Node(2)
/ \
/ Node(3)
RootNode(4)
\ Node(5)
\ /
Node(6)
\
Node(7)
リンクリストでは、アイテムは単一の次のポインターを介してリンクされます。バイナリツリーでは、各ノードは0、1、または2つのサブノードを持つことができます。バイナリ検索ツリーの場合、左ノードのキーはノードのキーより小さく、右ノードのキーはノード。ツリーのバランスが取れている限り、各アイテムへの検索パスは、リンクリストの検索パスよりもはるかに短くなります。
検索パス:
------ ------ ------
key List Tree
------ ------ ------
1 1 3
2 2 2
3 3 3
4 4 1
5 5 3
6 6 2
7 7 3
------ ------ ------
avg 4 2.43
------ ------ ------
構造が大きくなると、平均検索パスは大幅に小さくなります。
------ ------ ------
items List Tree
------ ------ ------
1 1 1
3 2 1.67
7 4 2.43
15 8 3.29
31 16 4.16
63 32 5.09
------ ------ ------
Binary Search Treeは、各内部ノードxが左に格納されている要素を格納する二分木です。 xのサブツリーはx以下であり、要素はxの右サブツリーは、x以上です。
これでリンクリストはノードのシーケンスで構成され、各ノードには任意の値と、次または前のノードを指す1つまたは2つの参照が含まれます。
コンピューターサイエンスでは、- バイナリ検索ツリー(BST) は、次のプロパティを持つバイナリツリーデータ構造です。
コンピューターサイエンスでは、 リンクリスト は基本的なデータ構造の1つであり、他のデータ構造の実装に使用できます。
したがって、バイナリ検索ツリーは、リンクリストまたは配列を使用して実装できる抽象概念です。リンクリストは基本的なデータ構造です。
主な違いは、バイナリ検索ツリーがソートされることです。バイナリ検索ツリーに挿入すると、それらの要素がメモリに格納される場所は、その値の関数です。リンクリストを使用すると、値に関係なく、要素がリストに盲目的に追加されます。
すぐにいくつかのトレードオフを行うことができます:リンクリストは挿入順序を保持し、挿入は安価ですバイナリ検索ツリーは一般に検索が高速です
リンクリストは、互いにリンクされた「ノード」の連続番号です。つまり、
public class LinkedListNode
{
Object Data;
LinkedListNode NextNode;
}
バイナリ検索ツリーは同様のノード構造を使用しますが、次のノードにリンクする代わりに、2つの子ノードにリンクします。
public class BSTNode
{
Object Data
BSTNode LeftNode;
BSTNode RightNode;
}
新しいノードをBSTに追加するときに特定のルールに従うことにより、非常に高速に移動できるデータ構造を作成できます。ここでの他の回答はこれらのルールを詳しく説明しているので、コードレベルでノードクラスの違いを示したいだけです。
ソートされたデータをBSTに挿入すると、リンクリストが作成され、ツリーを使用する利点が失われることに注意することが重要です。
このため、linkedListはO(N)トラバーサルデータ構造であり、BSTはO(N)最悪の場合のトラバーサルデータ構造です。 、最適な場合はO(log N)。
リンクリストとBSTには、コンテナとして機能する両方のデータ構造であることを除いて、実際にはあまり共通点はありません。 リンクリスト 基本的には、リストの順序を維持しながら、リスト内の任意の場所で要素を効率的に挿入および削除できます。このリストは、1つの要素から次の要素(および多くの場合、前の要素)へのポインターを使用して実装されます。
一方、 バイナリ検索ツリー は、より高い抽象化のデータ構造です(つまり、指定されていませんhowこれは内部的に実装されています)これにより、効率的な検索が可能になります(つまり、特定の要素を見つけるために、すべての要素を調べる必要はありません)。
リンクリストは、縮退したバイナリツリー、つまり、すべてのノードに子が1つしかないツリーと考えることができることに注意してください。
実際には非常に簡単です。リンクリストは、特定の順序で連結されていない一連のアイテムです。あなたはそれを決して枝のない本当に細い木と考えることができます:
1 -> 2 -> 5 -> 3 -> 9 -> 12 -> |i.
(最後は、終端のnullに対するascii-artの試みです)
バイナリ検索ツリーは2つの点で異なります:バイナリ部分は、各ノードに2の子があり、1つではないことを意味します。左側、右側のみ大きいもの:
5
/ \
3 9
/ \ \
1 2 12
9には左の子がなく、1、2、および12は「葉」です。枝はありません。
理にかなっていますか?
ほとんどの「ルックアップ」タイプの使用では、BSTの方が優れています。しかし、「後の先入れ先出しまたは後入れ先出しに対処するために物事のリストを保持する」ためだけに、リンクされたリストはうまくいくかもしれません。
リンクされたリストは、まさに...リストです。それは線形です。各ノードには、次のノードへの参照があります(二重リンクリストの場合は前のノードへ)。ツリーブランチ---各ノードには、さまざまな子ノードへの参照があります。バイナリツリーは、各ノードに2つの子しかない特殊なケースです。したがって、リンクリストでは各ノードに前のノードと次のノードがあり、バイナリツリーではノードに左の子、右の子、および親があります。
これらの関係は、構造を横断する方法に応じて、双方向または単方向になります。
リンクリストの問題は、そのリスト内での検索です(取得または挿入のいずれか)。
単一リンクリストの場合、先頭から開始して、目的の要素を見つけるために順番に検索する必要があります。リスト全体をスキャンする必要を回避するには、リスト内のノードへの追加の参照が必要です。この場合、単純なリンクリストではなくなります。
バイナリツリーを使用すると、本質的に並べ替えられ、ナビゲートできるため、より迅速な検索と挿入が可能になります。
過去に私が首尾よく使用した代替手段は、SkipListです。これにより、リンクリストに似たものが提供されますが、バイナリツリーに匹敵する検索パフォーマンスを可能にする追加の参照が提供されます。
これらには類似点がありますが、主な違いは、バイナリ検索ツリーが要素または「キー」の効率的な検索をサポートするように設計されていることです。
二重リンクリストのようなバイナリ検索ツリーは、構造内の他の2つの要素を指します。ただし、リストの最後に要素を追加するのではなく、構造に要素を追加する場合、「左」ノードにリンクされた要素が現在のノードと「右」にリンクされた要素よりも小さくなるようにバイナリツリーが再編成されますノードは現在のノードより大きい。
単純な実装では、新しい要素は構造の最初の要素(ツリーのルート)と比較されます。少ない場合は「左」ブランチが使用され、それ以外の場合は「右」ブランチが検査されます。ブランチが空であることがわかるまで、これは各ノードで継続します。新しい要素がその位置を埋めます。
この単純なアプローチでは、要素を順番に追加すると、リンクリストが作成されます(同じパフォーマンス)。ノードを再配置することにより、ツリーのバランスの尺度を維持するためのさまざまなアルゴリズムが存在します。たとえば、AVLツリーは、最適な検索時間を提供して、ツリーのバランスをできるだけ保つために最も多くの作業を行います。赤黒の木はバランスの取れた木を維持しないため、検索が若干遅くなりますが、キーが挿入または削除されると平均して作業が少なくなります。
リンクリストは、隣接ノードが相互に接続された直線の線形データです。 A-> B-> C。あなたはそれをまっすぐなフェンスと考えることができます。
BSTはツリーのような階層構造であり、メイントランクがブランチに接続され、それらのブランチが順番に他のブランチに接続されます。ここでの「バイナリ」ワードとは、各ブランチが最大2つのブランチに接続されることを意味します。
リンクリストを使用して、各アイテムが最大1つのアイテムに接続されているストレートデータのみを表します。一方、BSTを使用してアイテムを2つのアイテムに接続できます。 BSTを使用して家系図などのデータを表すことができますが、各人には3つ以上の子が存在する可能性があるため、これはn項検索ツリーになります。
バイナリ検索ツリーは任意の方法で実装できます。リンクリストを使用する必要はありません。
リンクリストは、ノードと、ノード内の他のノードへのポインター/参照を含む単純な構造です。リストのヘッドノードを指定すると、リンクリスト内の他のノードを参照できます。二重リンクリストには、次のノードへの通常の参照だけでなく、前のノードへの参照の2つのポインター/参照があります。二重リンクリストの最後のノードがリストの最初のノードを次のノードとして参照し、最初のノードが最後のノードを前のノードとして参照する場合、循環リストと呼ばれます。
バイナリ検索ツリーは、バイナリ検索比較アルゴリズムに基づいて、入力を2つのほぼ等しい半分に分割するツリーです。したがって、要素を見つけるのに必要な検索はごくわずかです。たとえば、1〜10のツリーがあり、3を検索する必要がある場合、最初に5または6のおそらく最上部の要素がチェックされます。3はそれよりも小さいため、前半のみその後、ツリーがチェックされます。次の値が3の場合は、それがあります。それ以外の場合は、見つからないかデータが返されるまで比較が行われます。したがって、ツリーはルックアップでは高速ですが、挿入や削除では不必要に高速ではありません。これらは非常に大まかな説明です。
それらはまったく異なるデータ構造です。
リンクリストは、各要素が次の要素にリンクされている要素のシーケンスであり、二重リンクリストの場合は前の要素にリンクされています。
バイナリ検索ツリーはまったく異なるものです。ルートノードがあり、ルートノードには最大2つの子ノードがあり、各子ノードは最大2つの子ノートなどを持つことができます。これは非常に巧妙なデータ構造ですが、ここで説明するのは少し面倒です。 Wikipedia artcle をご覧ください。