当前位置:首页 > PHP

php堆实现

2026-02-14 11:16:01PHP

PHP 堆实现

在 PHP 中,堆(Heap)是一种特殊的树形数据结构,通常用于实现优先队列。堆可以分为最大堆和最小堆,最大堆的父节点值大于或等于子节点值,最小堆的父节点值小于或等于子节点值。

php堆实现

使用 SplHeap 类

PHP 提供了内置的 SplHeap 类来实现堆数据结构。SplHeap 是一个抽象类,需要继承并实现 compare 方法来定义堆的类型(最大堆或最小堆)。

php堆实现

class MaxHeap extends SplHeap {
    protected function compare($value1, $value2) {
        return $value1 - $value2;
    }
}

class MinHeap extends SplHeap {
    protected function compare($value1, $value2) {
        return $value2 - $value1;
    }
}

示例代码

以下是一个使用 MaxHeap 的示例:

$heap = new MaxHeap();
$heap->insert(10);
$heap->insert(5);
$heap->insert(15);

echo $heap->extract(); // 输出 15
echo $heap->extract(); // 输出 10
echo $heap->extract(); // 输出 5

手动实现堆

如果需要手动实现堆,可以使用数组来模拟堆结构。以下是一个最小堆的手动实现示例:

class MinHeapManual {
    private $heap = [];

    public function insert($value) {
        $this->heap[] = $value;
        $this->heapifyUp(count($this->heap) - 1);
    }

    public function extractMin() {
        if (count($this->heap) === 0) {
            return null;
        }
        $min = $this->heap[0];
        $last = array_pop($this->heap);
        if (count($this->heap) > 0) {
            $this->heap[0] = $last;
            $this->heapifyDown(0);
        }
        return $min;
    }

    private function heapifyUp($index) {
        $parent = floor(($index - 1) / 2);
        if ($index > 0 && $this->heap[$index] < $this->heap[$parent]) {
            $this->swap($index, $parent);
            $this->heapifyUp($parent);
        }
    }

    private function heapifyDown($index) {
        $left = 2 * $index + 1;
        $right = 2 * $index + 2;
        $smallest = $index;

        if ($left < count($this->heap) && $this->heap[$left] < $this->heap[$smallest]) {
            $smallest = $left;
        }
        if ($right < count($this->heap) && $this->heap[$right] < $this->heap[$smallest]) {
            $smallest = $right;
        }
        if ($smallest !== $index) {
            $this->swap($index, $smallest);
            $this->heapifyDown($smallest);
        }
    }

    private function swap($i, $j) {
        $temp = $this->heap[$i];
        $this->heap[$i] = $this->heap[$j];
        $this->heap[$j] = $temp;
    }
}

使用示例

$heap = new MinHeapManual();
$heap->insert(10);
$heap->insert(5);
$heap->insert(15);

echo $heap->extractMin(); // 输出 5
echo $heap->extractMin(); // 输出 10
echo $heap->extractMin(); // 输出 15

性能考虑

  • SplHeap 是 PHP 内置的堆实现,性能较高,适合大多数场景。
  • 手动实现堆可以更灵活地定制功能,但性能可能不如内置实现。

通过以上方法,可以在 PHP 中高效地实现堆数据结构。

标签: php
分享给朋友:

相关文章

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php数组实现

php数组实现

PHP 数组的基本实现 PHP 数组是一种非常灵活的数据结构,可以存储多个值,并且支持多种类型的键(整数或字符串)。PHP 数组实际上是有序映射(ordered map),可以看作是列表(vector…

php 实现无限分类

php 实现无限分类

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、菜单管理等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 这是最简单的实现方式,每个分类记录存储其父…

php实现域名

php实现域名

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

php实现apk下载

php实现apk下载

实现APK下载的PHP代码 创建一个简单的PHP脚本来处理APK文件的下载请求,确保文件传输正确且安全。 <?php $file = 'path/to/your/app.apk'; if (f…

php实现进度条

php实现进度条

PHP 实现进度条的方法 使用 HTML 和 CSS 结合 PHP 实现进度条 在 PHP 中,进度条通常通过 HTML 和 CSS 实现,PHP 负责计算进度并更新前端显示。 <di…