当前位置:首页 > PHP

php实现堆

2026-01-29 18:12:32PHP

堆的基本概念

堆是一种特殊的完全二叉树,分为最大堆和最小堆。最大堆的每个父节点值大于或等于其子节点值,最小堆则相反。堆常用于优先队列和堆排序算法。

PHP实现最大堆

以下代码展示如何用PHP实现最大堆的基本操作:

class MaxHeap {
    private $heap;

    public function __construct() {
        $this->heap = array();
    }

    private function parent($i) {
        return floor(($i - 1) / 2);
    }

    private function leftChild($i) {
        return 2 * $i + 1;
    }

    private function rightChild($i) {
        return 2 * $i + 2;
    }

    private function swap(&$x, &$y) {
        $temp = $x;
        $x = $y;
        $y = $temp;
    }

    public function insert($key) {
        array_push($this->heap, $key);
        $this->heapifyUp(count($this->heap) - 1);
    }

    private function heapifyUp($i) {
        while ($i > 0 && $this->heap[$this->parent($i)] < $this->heap[$i]) {
            $this->swap($this->heap[$i], $this->heap[$this->parent($i)]);
            $i = $this->parent($i);
        }
    }

    public function extractMax() {
        if (empty($this->heap)) {
            return null;
        }
        $max = $this->heap[0];
        $this->heap[0] = array_pop($this->heap);
        $this->heapifyDown(0);
        return $max;
    }

    private function heapifyDown($i) {
        $maxIndex = $i;
        $left = $this->leftChild($i);
        $right = $this->rightChild($i);
        $size = count($this->heap);

        if ($left < $size && $this->heap[$left] > $this->heap[$maxIndex]) {
            $maxIndex = $left;
        }

        if ($right < $size && $this->heap[$right] > $this->heap[$maxIndex]) {
            $maxIndex = $right;
        }

        if ($i != $maxIndex) {
            $this->swap($this->heap[$i], $this->heap[$maxIndex]);
            $this->heapifyDown($maxIndex);
        }
    }

    public function getMax() {
        return empty($this->heap) ? null : $this->heap[0];
    }

    public function size() {
        return count($this->heap);
    }
}

使用示例

$heap = new MaxHeap();
$heap->insert(3);
$heap->insert(9);
$heap->insert(2);
$heap->insert(1);
$heap->insert(7);

echo $heap->extractMax(); // 输出9
echo $heap->extractMax(); // 输出7

实现最小堆

将比较符号反转即可实现最小堆。修改heapifyUpheapifyDown中的比较符号:

php实现堆

private function heapifyUp($i) {
    while ($i > 0 && $this->heap[$this->parent($i)] > $this->heap[$i]) {
        // 改为大于号
        $this->swap($this->heap[$i], $this->heap[$this->parent($i)]);
        $i = $this->parent($i);
    }
}

private function heapifyDown($i) {
    $minIndex = $i;
    // 改为小于号比较
    if ($left < $size && $this->heap[$left] < $this->heap[$minIndex]) {
        $minIndex = $left;
    }
    // 改为小于号比较
    if ($right < $size && $this->heap[$right] < $this->heap[$minIndex]) {
        $minIndex = $right;
    }
}

性能分析

堆的插入和删除操作时间复杂度均为O(log n),获取最大/最小值操作时间复杂度为O(1)。这使得堆适合需要频繁访问极值元素的场景。

标签: php
分享给朋友:

相关文章

php 实现队列

php 实现队列

PHP 实现队列的方法 PHP 可以通过多种方式实现队列功能,以下是几种常见的实现方法: 使用数组实现队列 PHP 数组可以通过 array_push 和 array_shift 函数模拟队列的先进…

php实现域名

php实现域名

PHP实现域名操作的方法 获取当前域名 使用$_SERVER['HTTP_HOST']可以获取当前访问的域名: $currentDomain = $_SERVER['HTTP_HOST']; ech…

php 实现md5

php 实现md5

使用 PHP 内置函数实现 MD5 PHP 提供了 md5() 函数,可以直接计算字符串的 MD5 哈希值。该函数接受一个字符串参数,返回 32 字符的十六进制哈希值。 $string = "H…

php 实现锁

php 实现锁

PHP 实现锁的常见方法 文件锁(flock) 利用 flock 函数对文件进行独占锁定,适用于单机环境。 $fp = fopen("lockfile.lock", "w+"); if (f…

php 实现聊天功能

php 实现聊天功能

PHP 实现聊天功能的方法 使用 WebSocket 和 Ratchet 库 WebSocket 是实现实时聊天的理想选择。Ratchet 是一个 PHP 库,用于处理 WebSocket 连接。…

php实现异步图片上传

php实现异步图片上传

异步图片上传的实现方法 在PHP中实现异步图片上传通常需要结合前端JavaScript和后端PHP代码。以下是几种常见的方法: 使用XMLHttpRequest或Fetch API 前端使用Java…