検索

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

二分探索木 (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  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 までご連絡ください。
Webサイトからアプリまで:JavaScriptの多様なアプリケーションWebサイトからアプリまで:JavaScriptの多様なアプリケーションApr 22, 2025 am 12:02 AM

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。

Python vs. JavaScript:ユースケースとアプリケーションと比較されますPython vs. JavaScript:ユースケースとアプリケーションと比較されますApr 21, 2025 am 12:01 AM

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

JavaScript通訳者とコンパイラにおけるC/Cの役割JavaScript通訳者とコンパイラにおけるC/Cの役割Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

JavaScript in Action:実際の例とプロジェクトJavaScript in Action:実際の例とプロジェクトApr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptとWeb:コア機能とユースケースJavaScriptとWeb:コア機能とユースケースApr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScriptエンジンの理解:実装の詳細JavaScriptエンジンの理解:実装の詳細Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:学習曲線と使いやすさPython vs. JavaScript:学習曲線と使いやすさApr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

Python vs. JavaScript:コミュニティ、ライブラリ、リソースPython vs. JavaScript:コミュニティ、ライブラリ、リソースApr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

See all articles

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

メモ帳++7.3.1

メモ帳++7.3.1

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