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

邻接矩阵实现示例:

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适用于拓扑排序或连通分量检测,使用递归或栈:

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)进行线性排序:

php实现图算法

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中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

php 实现购物车

php 实现购物车

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

php搜索功能实现

php搜索功能实现

实现基本的PHP搜索功能 使用MySQL数据库和PHP实现简单的关键词搜索功能。需要确保数据库中有可供搜索的表和数据。 // 连接数据库 $conn = new mysqli('localhost'…

php 实现队列

php 实现队列

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

php实现https

php实现https

PHP 实现 HTTPS 请求 在 PHP 中实现 HTTPS 请求,可以通过多种方式完成,包括使用内置函数、cURL 扩展或第三方库。以下是几种常见的方法: 使用 file_get_content…

php变量的实现

php变量的实现

PHP变量的实现机制 PHP变量的实现基于Zend引擎的底层数据结构。核心结构体zval用于存储变量类型和值,其设计允许动态类型转换和高效内存管理。 zval结构体 PHP变量通过zval结构体实现…