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 :
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!