当前位置:首页 > 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 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 <…

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searchT…

php 实现评论

php 实现评论

实现 PHP 评论功能 数据库设计 创建数据库表存储评论数据,通常包含以下字段: id:评论唯一标识 user_id:用户ID content:评论内容 created_at:评论时间 parent…

php https实现

php https实现

PHP 中实现 HTTPS 的方法 在 PHP 中实现 HTTPS 主要通过配置服务器和编写代码来确保通信的安全性。以下是几种常见的方法: 配置服务器支持 HTTPS 确保服务器已安装 SSL/T…

php 实现 java md5加密

php 实现 java md5加密

PHP 实现 Java MD5 加密 Java 和 PHP 的 MD5 加密结果可能存在差异,主要由于字符编码和输出格式的不同。以下是确保 PHP 与 Java MD5 加密结果一致的方法。 确保字…

php实现投票

php实现投票

PHP实现投票功能 数据库设计 创建数据库表存储投票数据,例如: CREATE TABLE `votes` ( `id` int(11) NOT NULL AUTO_INCREMENT,…