当前位置:首页 > 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…

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_shi…

php验证码实现

php验证码实现

验证码实现方法 在PHP中实现验证码功能通常涉及生成随机字符串或数字,将其转换为图像,并通过会话(Session)进行验证。以下是几种常见的实现方式: 使用GD库生成图像验证码 GD库是PHP内置…

php 实现接口

php 实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体的实现。类可以实现(implement)接口,并必须实现接口中定义的所有方法。 定义接口 接口通…

php实现聊天

php实现聊天

实现 PHP 聊天功能的方法 使用 WebSocket 和 PHP 实现实时聊天 WebSocket 是一种全双工通信协议,适合实现实时聊天功能。PHP 可以通过 Ratchet 库实现 WebS…