Maison  >  Article  >  développement back-end  >  Quels sont les principes et scénarios d’application de l’algorithme du tas minimum en PHP ?

Quels sont les principes et scénarios d’application de l’algorithme du tas minimum en PHP ?

王林
王林original
2023-09-19 12:53:02686parcourir

Quels sont les principes et scénarios d’application de l’algorithme du tas minimum en PHP ?

Quels sont les principes et scénarios d'application de l'algorithme du tas minimum en PHP ?

Min Heap est une structure arborescente binaire spéciale dans laquelle la valeur de chaque nœud est inférieure ou égale à la valeur de ses nœuds enfants. Son principe principal est de maintenir un ordre spécifique afin que le nœud racine du tas soit toujours le plus petit. Les tableaux peuvent être utilisés en PHP pour implémenter min-heap.

Le principe du min-heap est de conserver ses caractéristiques à travers deux opérations de base : l'insertion et la suppression. L'opération d'insertion ajoute un nouvel élément au tas et l'ajuste en conséquence en fonction de la taille de sa valeur, garantissant ainsi que les caractéristiques du tas ne sont pas détruites. L'opération de suppression supprime le plus petit élément du tas et redimensionne le tas afin qu'il réponde toujours aux caractéristiques d'un tas min.

Ce qui suit est un exemple de code qui montre comment utiliser PHP pour implémenter l'algorithme du tas minimum :

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

L'algorithme du tas minimum a de nombreux scénarios d'application, dont le plus courant est la file d'attente prioritaire. Une file d'attente prioritaire est une file d'attente spéciale qui peut déterminer l'ordre dans lequel les éléments sont retirés de la file d'attente en fonction de leur priorité. Le tas minimum peut facilement implémenter des files d'attente prioritaires, et la complexité temporelle des opérations d'insertion et de suppression est O(log n), ce qui est très efficace.

En plus de la file d'attente prioritaire, min-heap peut également être appliqué aux scénarios suivants :

  1. Recherche du plus petit ou du plus grand élément dans un ensemble
  2. Algorithme d'arbre couvrant minimum (tel que l'algorithme de Prim) ; tri (comme l'exemple de code ci-dessus) ;
  3. Huffman Coding, etc.
  4. En résumé, l'algorithme du tas minimum en PHP est une structure de données couramment utilisée qui peut jouer un rôle énorme dans la résolution de nombreux problèmes. Qu'il s'agisse d'effectuer des opérations de file d'attente prioritaires, de rechercher des éléments minimum/maximum ou d'être utilisés dans d'autres algorithmes, les min-heaps peuvent fournir des solutions efficaces. En comprenant les principes et l'implémentation du code du min-heap, cet algorithme peut être mieux appliqué et optimisé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn