ホームページ ウェブフロントエンド jsチュートリアル 二分探索木 (BST) について理解する

二分探索木 (BST) について理解する

Dec 16, 2024 pm 04:10 PM

二分探索木に関連する問題をいくつか解いていたので、記憶を修正して、学んだことをフォロワーと共有するのは面白いかもしれないと思いました。それでは、行きましょう:

二分探索木 (BST) とは何ですか

二分探索ツリー (BST) は、データの効率的な検索、挿入、削除を可能にするコンピューター サイエンスの基礎的なデータ構造です。これはツリーベースの構造で、すべてのノードに最大 2 つの子があり、 の子は常に親ノードよりも 小さく の子は親ノードよりも大きくなります。 大きい.

BST の主な機能

1.効率的な検索: バランスのとれたツリーの時間計算量は O(log n) です。

2.動的構造: ノードは動的に追加または削除できます。

3.階層表現: ファイルシステムや家系図などの階層データ表現で役立ちます。


TypeScript を使用した二分探索ツリーの実際的な実装を見てみましょう。

class Node {
    value: number;
    left: Node | null;
    right: Node | null;

    constructor(value: number) {
        this.value = value;
        this.left = null;
        this.right = null;
    }
}

class BinarySearchTree {
    root: Node | null;

    constructor() {
        this.root = null;
    }

    insert(value: number): void {
        const newNode = new Node(value);
        if (this.root === null) {
            this.root = newNode;
            return;
        }

        let currentNode = this.root;
        while (true) {
            if (value < currentNode.value) {
                if (currentNode.left === null) {
                    currentNode.left = newNode;
                    return;
                }
                currentNode = currentNode.left;
            } else {
                if (currentNode.right === null) {
                    currentNode.right = newNode;
                    return;
                }
                currentNode = currentNode.right;
            }
        }
    }

    contains(value: number): boolean {
        let currentNode = this.root;

        while (currentNode !== null) {
            if (value === currentNode.value) return true;
            currentNode = value < currentNode.value ? currentNode.left : currentNode.right;
        }

        return false;
    }

    // In-order Traversal: Left -> Root -> Right
    inOrderTraversal(node: Node | null = this.root): void {
        if (node !== null) {
            this.inOrderTraversal(node.left);
            console.log(node.value);
            this.inOrderTraversal(node.right);
        }
    }
}

// Usage
const bst = new BinarySearchTree();
bst.insert(47);
bst.insert(21);
bst.insert(76);
bst.insert(18);
bst.insert(52);
bst.insert(82);

console.log("Contains 21:", bst.contains(21)); // true
console.log("Contains 99:", bst.contains(99)); // false

console.log("In-order Traversal:");
bst.inOrderTraversal();

ログイン後にコピー

BSTの図表現

47、21、76、18、52、82 を挿入した後の二分探索ツリーは次のようになります。

:

Understanding Binary Search Trees (BST)


仕組み
  1. 挿入:

    新しい値は比較に基づいて配置されます。小さい値は左に、大きい値は右に移動します。
  2. 検索 (含む):

    ノードが見つかるまで、または走査が null ノードで終了するまで、値に応じて左または右に走査します。
  3. トラバーサル: インオーダートラバーサルは、ソートされた順序でノードを訪問します (左 ->ルート ->右

    )。

二分探索木を使用する理由
  1. 効率的な検索:

    ツリーのバランスが取れている場合、BST での検索は非常に効率的になります。
  2. 動的サイズ:

    配列のサイズを変更したり要素を移動したりすることなく、要素を追加または削除できます。
  3. ソートされたデータ:

    トラバーサルはソートされた順序でデータを提供し、優先キューやメモリ内データベースなどのシナリオで役立ちます。

留意すべきエッジケース
  1. 重複:

    標準 BST は、デフォルトでは重複値を処理しません。各ノードにカウントを保存したり、重複挿入をスキップしたりするなど、重複を許可または拒否するロジックを実装する必要がある場合があります。
  2. アンバランス ツリー: 値がソートされた順序 (例: 1、2、3、4、...

    ) で挿入されると、BST が歪んで劣化します。演算時間 O(n) のリンク リストに変換します。自己バランス BST (AVL ツリー、赤黒ツリーなど) を使用すると、この問題を軽減できます。
  3. 空のツリー: コンテナーやトラバーサルなどの操作中の実行時エラーを防ぐために、ツリーが空である場合 (つまり、this.root === null) を常に確認します。

  4. エッジ ノード: ノードの削除などのシナリオでは、子が 1 つだけあるノード、子がないノード、またはルート ノードであるノードなどのエッジ ケースを考慮します。

  5. パフォーマンス: データセットが大きい場合、またはソートされたチャンクに分かれている場合は、効率的な検索のためにバランスを調整するか、より適切なデータ構造を使用することを検討してください。

効率を確保するには、BST のバランスを維持する必要があります。バランスの取れていないツリーでは、パフォーマンスが O(n) まで低下する可能性があります。一貫して最適化されたパフォーマンスを得るには、AVL や Red-Black Tree などの自己バランス ツリーの使用を検討してください。他の木については、後ほど別の記事で説明します。


ソフトウェア アプリケーションにおける BST の使用例

二分探索木 (BST) は、教科書で出てくる単なるデータ構造ではありません。実際の応用例がたくさんあります。 BST がコンピューター サイエンスで使用される実際的な方法をいくつか紹介します。

  • データベースとインデックス作成: バランス BST (AVL や Red-Black Tree など) は、データベースのインデックス作成の舞台裏で行われることがよくあります。範囲クエリとルックアップが非常に効率的になります。

  • メモリ内でソートされたデータ: 動的に追加および検索する際にデータをソートしたままにする必要がありますか? BST は頼りになります。リアルタイム分析や監視システムを思い浮かべてください。

  • コンパイラーのシンボル テーブル: コンパイラーは、BST に依存して、識別子とその属性を保存し、迅速にアクセスするためのシンボル テーブルを実装します。

  • オートコンプリートとスペル チェッカー: オートコンプリートがどのように機能するか考えたことはありますか?三分探索ツリーなどの BST バリエーションは、単語の辞書を効率的に編成するために使用されます。

  • 優先順位スケジューリング: ヒープの方が一般的ですが、BST は優先順位が常に変化する動的スケジューリング システムでも使用できます。

  • 地理データ (GIS): BST は、近くの場所の検索や範囲によるフィルター処理など、空間データの保存と取得によって GIS システムに役立ちます。

  • データ圧縮: データ圧縮アルゴリズムの重要な部分であるハフマン エンコードでは、特別な種類のバイナリ ツリーを使用して可変長コードをデータ シンボルに割り当てます。

  • ゲーム システム: BST は、スコアを並べ替えてリアルタイムでランキングを取得することにより、動的なリーダーボードとスコアボードを可能にします。

  • ネットワーキングとルーティング: ルーティング テーブルは、データ転送の効率的なパスを決定するために BST のような構造に依存することがあります。

  • バージョン管理システム: Git のようなシステムは、ツリー状の構造 (BST からインスピレーションを得た) を使用して、有向非巡回グラフ (DAG) 内でコミットとバージョンを効率的に管理します。

BST は、私たちが日常的に使用するツールの強化から複雑な計算問題の解決に至るまで、あらゆる場所に存在します。かなりクールですね?

しかし、その制限と特殊なケースに留意することが不可欠です。これらのニュアンスを理解すると、より効率的で信頼性の高いシステムを設計するのに役立ちます。

BST と協力しているときに、興味深い課題や解決策に遭遇したことがありますか?以下で話し合いましょう! ?

以上が二分探索木 (BST) について理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

JavaScriptは学ぶのが難しいですか? JavaScriptは学ぶのが難しいですか? Apr 03, 2025 am 12:20 AM

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

JavaScriptの進化:現在の傾向と将来の見通し JavaScriptの進化:現在の傾向と将来の見通し Apr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? Apr 04, 2025 pm 02:06 PM

フロントエンドのVSCodeと同様に、パネルドラッグアンドドロップ調整機能の実装を調べます。フロントエンド開発では、VSCODEと同様のVSCODEを実装する方法...

See all articles