当前位置:首页 > PHP

php实现图算法

2026-02-16 08:51:35PHP

PHP实现图算法的基础方法

图算法在PHP中可以通过邻接表或邻接矩阵实现。邻接表适合稀疏图,内存占用较少;邻接矩阵适合稠密图,查询效率更高。

邻接表实现示例:

class Graph {
    private $adjList = [];

    public function addEdge($src, $dest) {
        if (!isset($this->adjList[$src])) {
            $this->adjList[$src] = [];
        }
        $this->adjList[$src][] = $dest;
    }

    public function getAdjList() {
        return $this->adjList;
    }
}

邻接矩阵实现示例:

php实现图算法

class GraphMatrix {
    private $matrix = [];
    private $size;

    public function __construct($size) {
        $this->size = $size;
        $this->matrix = array_fill(0, $size, array_fill(0, $size, 0));
    }

    public function addEdge($src, $dest) {
        $this->matrix[$src][$dest] = 1;
    }
}

广度优先搜索(BFS)实现

BFS适用于无权图的最短路径查找,使用队列数据结构:

function bfs($graph, $start) {
    $visited = [];
    $queue = new SplQueue();
    $queue->enqueue($start);
    $visited[$start] = true;

    while (!$queue->isEmpty()) {
        $vertex = $queue->dequeue();
        echo $vertex . " ";

        foreach ($graph[$vertex] as $neighbor) {
            if (!isset($visited[$neighbor])) {
                $visited[$neighbor] = true;
                $queue->enqueue($neighbor);
            }
        }
    }
}

深度优先搜索(DFS)实现

DFS适用于拓扑排序或连通分量检测,使用递归或栈:

php实现图算法

function dfs($graph, $vertex, &$visited) {
    $visited[$vertex] = true;
    echo $vertex . " ";

    foreach ($graph[$vertex] as $neighbor) {
        if (!isset($visited[$neighbor])) {
            $this->dfs($graph, $neighbor, $visited);
        }
    }
}

Dijkstra最短路径算法

适用于带权有向图的最短路径查找,需要优先队列:

function dijkstra($graph, $source) {
    $dist = [];
    $visited = [];
    $pq = new SplPriorityQueue();

    foreach ($graph as $v => $adj) {
        $dist[$v] = INF;
    }
    $dist[$source] = 0;
    $pq->insert($source, 0);

    while (!$pq->isEmpty()) {
        $u = $pq->extract();
        if (isset($visited[$u])) continue;
        $visited[$u] = true;

        foreach ($graph[$u] as $v => $weight) {
            if ($dist[$u] + $weight < $dist[$v]) {
                $dist[$v] = $dist[$u] + $weight;
                $pq->insert($v, -$dist[$v]);
            }
        }
    }
    return $dist;
}

图的拓扑排序

对有向无环图(DAG)进行线性排序:

function topologicalSort($graph) {
    $stack = [];
    $visited = [];

    foreach ($graph as $vertex => $adj) {
        if (!isset($visited[$vertex])) {
            topologicalSortUtil($vertex, $visited, $stack, $graph);
        }
    }

    return array_reverse($stack);
}

function topologicalSortUtil($v, &$visited, &$stack, $graph) {
    $visited[$v] = true;
    if (isset($graph[$v])) {
        foreach ($graph[$v] as $neighbor) {
            if (!isset($visited[$neighbor])) {
                topologicalSortUtil($neighbor, $visited, $stack, $graph);
            }
        }
    }
    array_push($stack, $v);
}

注意事项

  • PHP的SplPriorityQueue默认是最大堆,Dijkstra算法中需要取负数实现最小堆
  • 大规模图处理应考虑使用专门的图数据库如Neo4j
  • 性能敏感场景建议使用C扩展或预编译库

标签: 算法php
分享给朋友:

相关文章

php实现验证码

php实现验证码

PHP实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE ord…

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Session 是…

php 实现下载

php 实现下载

PHP 实现文件下载的方法 使用 PHP 实现文件下载可以通过设置 HTTP 头信息,强制浏览器将文件作为附件下载而非直接打开。 基本下载实现 $file_path = 'path/to/your/…

php 实现链表

php 实现链表

PHP 实现链表的方法 链表是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。PHP 中可以通过类和对象来实现链表。 定义链表节点类 创建一个 ListNode 类,用于表示链…

php array实现

php array实现

PHP 数组实现 PHP 数组是一种灵活的数据结构,可以存储多个值。以下是几种常见的实现方式: 索引数组 索引数组使用数字作为键名,默认从0开始递增。 $fruits = array("Apple…