ホームページ バックエンド開発 PHPチュートリアル PHP の最小ヒープ アルゴリズムの原理と適用シナリオは何ですか?

PHP の最小ヒープ アルゴリズムの原理と適用シナリオは何ですか?

Sep 19, 2023 pm 12:53 PM
アプリケーションシナリオ 原理 最小ヒープアルゴリズム

PHP の最小ヒープ アルゴリズムの原理と適用シナリオは何ですか?

PHP の最小ヒープ アルゴリズムの原理と適用シナリオは何ですか?

最小ヒープ (最小ヒープ) は、各ノードの値がその子ノードの値以下である特殊なバイナリ ツリー構造です。その主な原則は、ヒープのルート ノードが常に最小になるように特定の順序を維持することです。 PHP で配列を使用して最小ヒープを実装できます。

最小ヒープの原則は、挿入と削除という 2 つの基本操作を通じてその特性を維持することです。挿入操作では、新しい要素がヒープに追加され、その値のサイズに応じて調整され、ヒープの特性が破壊されないようにします。削除操作では、ヒープ内の最小の要素が削除され、最小ヒープの特性を満たすようにヒープのサイズが変更されます。

以下は、PHP を使用して最小ヒープ アルゴリズムを実装する方法を示すサンプル コードです:

class MinHeap {
    protected $heap;
    protected $size;
    
    public function __construct() {
        $this->heap = [];
        $this->size = 0;
    }
    
    public function insert($value) {
        $this->heap[$this->size] = $value;
        $this->size++;
        
        $this->heapifyUp($this->size - 1);
    }
    
    public function removeMin() {
        if ($this->isEmpty()) {
            return null;
        }
        
        $min = $this->heap[0];
        
        // 将最后一个元素移到根节点位置
        $this->heap[0] = $this->heap[$this->size - 1];
        
        $this->size--;
        
        // 调整堆,保持最小堆的特性
        $this->heapifyDown(0);
        
        return $min;
    }
    
    public function isEmpty() {
        return $this->size === 0;
    }
    
    protected function getParentIndex($index) {
        return ($index - 1) / 2;
    }
    
    protected function getLeftChildIndex($index) {
        return 2 * $index + 1;
    }
    
    protected function getRightChildIndex($index) {
        return 2 * $index + 2;
    }
    
    protected function heapifyUp($index) {
        $parentIndex = $this->getParentIndex($index);
        
        while ($index > 0 && $this->heap[$parentIndex] > $this->heap[$index]) {
            // 交换节点位置
            list($this->heap[$parentIndex], $this->heap[$index]) = [$this->heap[$index], $this->heap[$parentIndex]];
            
            $index = $parentIndex;
            $parentIndex = $this->getParentIndex($index);
        }
    }
    
    protected function heapifyDown($index) {
        $leftChildIndex = $this->getLeftChildIndex($index);
        $rightChildIndex = $this->getRightChildIndex($index);
        
        $minIndex = $index;
        
        if ($leftChildIndex < $this->size && $this->heap[$leftChildIndex] < $this->heap[$minIndex]) {
            $minIndex = $leftChildIndex;
        }
        
        if ($rightChildIndex < $this->size && $this->heap[$rightChildIndex] < $this->heap[$minIndex]) {
            $minIndex = $rightChildIndex;
        }
        
        if ($minIndex !== $index) {
            // 交换节点位置
            list($this->heap[$minIndex], $this->heap[$index]) = [$this->heap[$index], $this->heap[$minIndex]];
            
            $this->heapifyDown($minIndex);
        }
    }
}

// 使用最小堆进行排序
function heapSort($arr) {
    $heap = new MinHeap();
    foreach ($arr as $value) {
        $heap->insert($value);
    }
    
    $sorted = [];
    while (!$heap->isEmpty()) {
        $sorted[] = $heap->removeMin();
    }
    
    return $sorted;
}

// 测试用例
$arr = [5, 2, 9, 1, 7];
$sorted = heapSort($arr);
echo implode(', ', $sorted); // 输出:1, 2, 5, 7, 9
ログイン後にコピー

最小ヒープ アルゴリズムには多くのアプリケーション シナリオがあり、最も一般的なのは優先度です。列。優先キューは、要素が優先順位に基づいてデキューされる順序を決定できる特別なキューです。最小ヒープは優先キューを簡単に実装でき、挿入および削除操作の時間計算量は O(log n) であり、非常に効率的です。

プライオリティ キューに加えて、最小ヒープは次のシナリオにも適用できます:

  1. セット内の最小または最大の要素の検索;
  2. 最小スパニング ツリー アルゴリズム (Prim アルゴリズムなど)、
  3. ヒープ ソート (上記のサンプル コードなど)、
  4. ハフマン コーディング (ハフマン コーディング) など。

要約すると、PHP の最小ヒープ アルゴリズムは、多くの問題を解決する上で大きな役割を果たすことができる一般的に使用されるデータ構造です。優先キュー操作の実行、最小/最大要素の検索、または他のアルゴリズムでの使用のいずれの場合でも、min-heap は効率的なソリューションを提供できます。 min-heap の原理とコード実装を理解することで、このアルゴリズムをより適切に適用し、最適化することができます。

以上がPHP の最小ヒープ アルゴリズムの原理と適用シナリオは何ですか?の詳細内容です。詳細については、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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

nohupの機能と原理の解析 nohupの機能と原理の解析 Mar 25, 2024 pm 03:24 PM

nohup の役割と原理の分析 Unix および Unix 系オペレーティング システムでは、nohup はバックグラウンドでコマンドを実行するためによく使用されるコマンドです。ユーザーが現在のセッションを終了したり、ターミナル ウィンドウを閉じたりしても、コマンドはまだ実行され続けています。この記事では、nohup コマンドの機能と原理を詳しく分析します。 1. nohup の役割: バックグラウンドでのコマンドの実行: nohup コマンドを使用すると、ターミナル セッションを終了するユーザーの影響を受けることなく、長時間実行されるコマンドをバックグラウンドで実行し続けることができます。これは実行する必要があります

Struts フレームワークの原則と実践についての深い議論 Struts フレームワークの原則と実践についての深い議論 Feb 18, 2024 pm 06:10 PM

Struts フレームワークの原理分析と実践的な調査 JavaWeb 開発で一般的に使用される MVC フレームワークとして、Struts フレームワークは優れた設計パターンとスケーラビリティを備えており、エンタープライズ レベルのアプリケーション開発で広く使用されています。この記事では、Struts フレームワークの原理を分析し、読者がフレームワークをよりよく理解して適用できるように、実際のコード例を使用してそれを検討します。 1. Struts フレームワークの原理の分析 1. MVC アーキテクチャ Struts フレームワークは MVC (Model-View-Con) に基づいています。

Javaのvolatileキーワードの使用シナリオと機能の詳細な説明 Javaのvolatileキーワードの使用シナリオと機能の詳細な説明 Jan 30, 2024 am 10:01 AM

Java における volatile キーワードの役割と適用シナリオの詳細説明 1. volatile キーワードの役割 Java では、volatile キーワードは、複数のスレッド間で参照できる変数を識別する、つまり可視性を確保するために使用されます。具体的には、変数が volatile と宣言されると、その変数への変更は他のスレッドに即座に知られます。 2. Volatile キーワード ステータス フラグのアプリケーション シナリオ volatile キーワードは、次のようないくつかのステータス フラグ シナリオに適しています。

OracleとSQLの違いとアプリケーションシナリオの分析 OracleとSQLの違いとアプリケーションシナリオの分析 Mar 08, 2024 pm 09:39 PM

Oracle と SQL の違いとアプリケーション シナリオの分析 データベース分野では、Oracle と SQL は頻繁に言及される 2 つの用語です。 Oracle はリレーショナル データベース管理システム (RDBMS) であり、SQL (StructuredQueryLanguage) はリレーショナル データベースを管理するための標準化された言語です。これらはある程度関連していますが、いくつかの大きな違いもあります。まず、定義上、Oracle は特定のデータベース管理システムであり、以下で構成されます。

MyBatis のバッチ挿入実装原理の深い理解 MyBatis のバッチ挿入実装原理の深い理解 Feb 21, 2024 pm 04:42 PM

MyBatis は、さまざまな Java プロジェクトで広く使用されている人気のある Java 永続層フレームワークです。その中でも、バッチ挿入は、データベース操作のパフォーマンスを効果的に向上させることができる一般的な操作です。この記事では、MyBatis でのバッチ挿入の実装原理を深く調査し、特定のコード例を使用して詳細に分析します。 MyBatis でのバッチ挿入 MyBatis では、通常、バッチ挿入操作は動的 SQL を使用して実装されます。複数の挿入値を含む S を構築することによって

Javaフレームワークにおけるファクトリパターンの適用シナリオは何ですか? Javaフレームワークにおけるファクトリパターンの適用シナリオは何ですか? Jun 01, 2024 pm 04:06 PM

ファクトリ パターンは、オブジェクトの作成プロセスを分離し、それらをファクトリ クラスにカプセル化して具象クラスから分離するために使用されます。 Java フレームワークでは、ファクトリ パターンは次の目的で使用されます。 複雑なオブジェクト (Spring の Bean など) を作成する オブジェクトの分離を提供し、テスト容易性と保守性を強化する 拡張機能をサポートし、新しいファクトリ クラスを追加することで新しいオブジェクト タイプのサポートを強化する

Linuxのchageコマンドの機能と動作原理の詳細な分析 Linuxのchageコマンドの機能と動作原理の詳細な分析 Feb 24, 2024 pm 03:48 PM

Linuxシステムのchageコマンドは、ユーザーアカウントのパスワード有効期限を変更するコマンドであり、アカウントの最長使用日と最短使用可能日を変更することもできます。このコマンドはユーザー アカウントのセキュリティ管理において非常に重要な役割を果たし、ユーザー パスワードの使用期間を効果的に制御し、システムのセキュリティを強化します。 CHAGE コマンドの使用方法: CHAGE コマンドの基本構文は次のとおりです: chage [オプション] ユーザー名 たとえば、ユーザー「testuser」のパスワードの有効期限を変更するには、次のコマンドを使用できます。

MyBatis ページングプラグインの原理の詳細な説明 MyBatis ページングプラグインの原理の詳細な説明 Feb 22, 2024 pm 03:42 PM

MyBatis は優れた永続層フレームワークであり、XML とアノテーションに基づいたデータベース操作をサポートし、シンプルで使いやすく、豊富なプラグイン メカニズムも提供します。その中でも、ページング プラグインは、よく使用されるプラグインの 1 つです。この記事では、MyBatis ページング プラグインの原理を詳しく説明し、具体的なコード例で説明します。 1. ページング プラグインの原理 MyBatis 自体はネイティブ ページング機能を提供しませんが、プラグインを使用してページング クエリを実装できます。ページング プラグインの原理は主に MyBatis を傍受することです

See all articles