狄克斯特拉(Dijkstra) 算法 php实现

《算法图解》中提到的狄克斯特拉算法,用php实现。

一 原理及解释

根据示例图求出起点到终点的最小耗费路径。

因为涉及每条路径的权重,所以这种算法仅适合有向路径。

所谓有向路径,指仅从起点指向终点的路径。

相对的无向路径,指起点和终点互相指向的路径,一般这样的路径不带箭头。

该算法设定每条路径没有权重为负的路径,且没有不可指向终点的路径,所以所有节点都有效。

起点“O”,终点“C”,实例图如下

根据图示,路径0到A耗费1总耗费1记作A<-O:1:1,以此类推B<-O:2:1,选取耗费最小的路径A<-O:1:1,此时O节点遍历完成。

从节点A再次开始C->A:4,总耗费需要加上之前路径的耗费所以C->A:4:5,A节点遍历完成。

剩余B节点未处理,选取B节点开始C->B:1:3,B节点遍历完成。因为总消耗3小于总消耗5,所以选择C->B路径。

因为C节点是终点,不用便利。所以其余节点遍历完成,则C节点处理完成。

最终选择路径O->B->C,总消耗3。

二 处理流程

1、初始化

节点总耗费父节点遍历完成
OFALSEFALSEFALSE
AFALSEFALSEFALSE
BFALSEFALSEFALSE
CFALSEFALSEFALSE

2、选取起点节点O

节点总耗费父节点遍历完成
OFALSEFALSETRUE
A1OFALSE
B2OFALSE
CFALSEFALSEFALSE

下一步,选取耗费最少且未遍历完成的节点,但是要注意耗费的值不能是FALSE。可将耗费中FALSE视为最大。

某些语言中有无穷大的常量关键字,可以直接用大小对比排除未设置耗费数量的节点。

3、选取节点A

节点总耗费父节点遍历完成
OFALSEFALSETRUE
A1OTRUE
B2OFALSE
C4AFALSE

B->A:3:4,原有节点总耗费为2,小于4。所以不采用B->A,即B->A的数据不更新到表中。

下一步,选取耗费最少且未遍历完成的节点

4、选取节点B

节点总耗费父节点遍历完成
OFALSEFALSETRUE
A1OTRUE
B2OTRUE
C3BTRUE

B->C:1:3,原有节点总耗费为4,大于3。所以采用C->B,即C->B的数据更新到表中。

此时除去终点的节点都处理完,代表终点处理完成,即节点C处理完成。

5、处理流程总结

1、初始化表

2、选取起点节点

3、开始首次处理,即是用节点数据更新表数据

4、设置节点处理完成

5、选取耗费最少且未遍历完成的节点

6、重复4、5步操作。当节点为终点节点时推出循环

7、生成结果

三 php实现

//狄克斯特拉(Dijkstra) 算法 实现
class Test
{/*** $tableitem =['node'=>'','cost'=>'','prev'=>'']*/private $table = []; //计算开销数据private $result = []; //结算表private $data = [];private $start;private $end;public function __construct($data, $start, $end){$this->data = $data;$this->start = $start;$this->end = $end;}private function insert_tables($data){foreach ($data as $key => $value) {$this->insert_table($key);if (is_array($value)) {$this->insert_tables($value);}}}/*** 向table加数据** @param  [type] $node* @return void* @author wj* @date 2023-10-18*/private function insert_table($node){if (!isset($this->table[$node])) {$this->table[$node] = ['node' => $node,'cost' => false,'prev' => false,'isChecked' => false,];}}/*** 改table数据** @param  [type] $node* @param  [type] $cost* @param  [type] $prev* @return void* @author wj* @date 2023-10-18*/private function update_table($node, $cost, $prev){$info = $this->table[$node];if ($cost < $info['cost'] || false == $info['cost']) {$this->table[$node]['cost'] = $cost;$this->table[$node]['prev'] = $prev;}}/*** 处理节点** @param  boolean $node* @return void* @author wj* @date 2023-10-18*/private function deal_node($node = false){if (empty($node)) {$node = $this->get_need_deal_node();}if (empty($node) || !isset($this->data[$node])) {return false;}$usedata = $this->data[$node];$prev = $node;$table_cost = $this->table[$prev]['cost'];foreach ($usedata as $key => $cost) {$totalcost = $cost + (int) $table_cost;$this->update_table($key, $totalcost, $prev);}$this->table[$node]['isChecked'] = true;return true;}/*** 取得最小未处理节点** @param  [type] $node* @return void* @author wj* @date 2023-10-18*/private function get_need_deal_node(){$table = $this->table;$min_node = false;$cost = false;foreach ($table as $key => $value) {if ($value['isChecked'] || false === $value['cost']) {continue;}if ($value['cost'] < $cost || false === $cost) {$cost = $value['cost']; //最小开销$min_node = $key;}}return $min_node;}/*** 设定data 无没用分支 没有负权** @param  [type] $data* @param  [type] $start* @param  [type] $end* @return void* @author wj* @date 2023-10-18*/public function dotest(){//初始化table;$this->insert_tables($this->data);$node = $this->start;//处理节点while ($node) {$result = $this->deal_node($node);$node = $this->get_need_deal_node();if ($node == $this->end) {$this->table[$this->end]['isChecked'] = true;break;}}}public function getresult(){$end = $this->end;$result = [];$node = $end;while ($node) {$nodeinfo = $this->table[$node];$result[$nodeinfo['node']] = $nodeinfo;$node = $nodeinfo['prev'];}$result = array_reverse($result);$path = implode("->", array_keys($result));$lastnode = end($result);$cost = $lastnode['cost'];$data = ['result' => $result,'path' => $path,'cost' => $cost,];return $data;}
}
$data = ["O" => ["A" => 0,"B" => 1,],"A" => ["C" => 1,"B" => 2,],"B" => ["D" => 2,],"C" => ["D" => 3,],
];
$t = new Test($data, "O", "D");
$t->dotest();
$data = $t->getresult();
var_dump($data);
#执行结果
array(3) {'result' =>array(3) {'O' =>array(4) {'node' =>string(1) "O"'cost' =>bool(false)'prev' =>bool(false)'isChecked' =>bool(true)}'B' =>array(4) {'node' =>string(1) "B"'cost' =>int(1)'prev' =>string(1) "O"'isChecked' =>bool(true)}'D' =>array(4) {'node' =>string(1) "D"'cost' =>int(3)'prev' =>string(1) "B"'isChecked' =>bool(true)}}'path' =>string(7) "O->B->D"'cost' =>int(3)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/112296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试题笔记】C++继承和多态常见高频经典面试题

1.继承相关习题 1.1 什么是菱形继承&#xff1f;菱形继承的问题是什么&#xff1f; 菱形继承&#xff1a;菱形继承是多继承的一种特殊情况。两个中间类继承父类&#xff0c;而派生类继承了两个中间类&#xff0c;从而在继承关系上呈现出一种菱形。如下图所示&#xff1a; **…

ZKP3.2 Programming ZKPs (Arkworks Zokrates)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 3: Programming ZKPs (Guest Lecturers: Pratyush Mishra and Alex Ozdemir) 3.3 Using a library ( tutorial) R1CS Libraries A library in a host language (Eg: Rust, OCaml, C, Go, …)Key type: constraint system Mai…

光伏三相并网逆变器的控制策略与性能分析(Simulink仿真实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

24、Flink 的table api与sql之Catalogs(java api操作分区与函数、表)-4

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

基于Java的师生交流答疑管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

攻防世界web篇-Training-WWW-Robots

直接点击给出的地址&#xff0c;然后会转到另一个网页界面&#xff0c;在这个界面&#xff0c;已经给出了提示&#xff0c;robots.txt 在浏览器中&#xff0c;直接在地址的后面加上robots.txt&#xff0c;会进到下面这个界面 因为对php语言一窍不通&#xff0c;所以这里纯粹就…

【数据结构】队列(C语言实现)

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 队列 1. 队列的概念及结构…

搜维尔科技:Varjo-探讨汽车工业使用虚拟现实/XR的可能性

新的 奇亚EV9 被定位为起亚有史以来最豪华的车型。在一次活动中,起亚通过向芬兰媒体、利益相关者和经销商网络推出新的汽车车型(起亚EV9&#xff0c;EV9是一款高度超过5米的全电动车,拥有100千瓦的电池、快速充电能力、2500公斤的拖曳能力和7公斤的座位--这在市场上是一个独特的…

常见问题-找不到vcruntime140.dll无法继续执行代码解决方案

本文将介绍五种不同的解决方案&#xff0c;帮助大家解决这个问题。 首先&#xff0c;我们需要了解为什么会出现找不到vcruntime140.dll的情况。这种情况通常是由于以下几个原因导致的&#xff1a; 1. 系统环境变量设置不正确&#xff1a;系统环境变量中可能没有包含vcruntime…

jvm的jshell,学生的工具

jshell 在我眼里&#xff0c;只能作为学校教学的一个玩具&#xff0c;事实上官方也做了解释&#xff0c;以下是官方的解释&#xff1a; 在学习编程语言时&#xff0c;即时反馈很重要&#xff0c;并且 它的 API。学校引用远离Java的首要原因 教学语言是其他语言有一个“REPL”…

轻量级导出 Excel 标准格式

一般业务系统中都有导出到 Excel 功能&#xff0c;其实质就是把数据库里面一条条记录转换到 Excel 文件上。Java 常用的第三方类库有 Apache POI 和阿里巴巴开源的 EasyExcel 等。另外也有通过 Web 模板技术渲染 Excel 文件导出&#xff0c;这实质是 MVC 模式的延伸&#xff0c…

nfs+rpcbind实现服务器之间的文件共享

NFS简介 NFS服务及Network File System&#xff0c;用于在网络上共享存储&#xff0c;分为2,3,4三个版本&#xff0c;最新为4.1版本。NFS基于RPC协议&#xff0c;RPC为Remote Procedure Call的简写。 应用场景&#xff1a;用于A,B,C三台机器上需要保证被访问到的文件是一样…

2023阿里云双十一到底有没有活动?去年就没有

2023阿里云双十一到底有没有活动&#xff1f;根据以往经验&#xff0c;阿里云双11是一次大型促销活动&#xff0c;但是去年好像就没有&#xff0c;印象里去年阿里云没推出双十一活动&#xff0c;因为阿里云一直都活动&#xff0c;没有单独推出双11优惠&#xff0c;阿里云百科给…

发现一不错的编程助手 Amazon CodeWhisperer

Amazon CodeWhisperer 是一款 AI 编程助手&#xff0c;旨在为开发人员提供智能化的编程辅助工具。作为一款基于人工智能的编程助手&#xff0c;CodeWhisperer 的目标是提高开发人员的生产效率、降低开发成本&#xff0c;并提供高质量的编程解决方案。 1.安装过程参考官网 htt…

驱动实现LED点灯

demo.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include "head.h" //定义三个指针指向映射后的虚拟内存 unsigned int *vir_moder; unsigned …

YOLOv8改进实战 | 更换主干网络Backbone(四)之轻量化模型MobileNetV3

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…

【Qt之布局】QVBoxLayout、QHBoxLayout、QGridLayout、QFormLayout介绍及使用

在Qt中&#xff0c;布局管理器&#xff08;Layout&#xff09;用于管理窗口中的控件的位置和大小&#xff0c;以适应不同大小的窗口。 常用的布局管理器包括QVBoxLayout、QHBoxLayout、QGridLayout和QFormLayout。 先放张布局UI&#xff1a; 1. QVBoxLayout&#xff08;垂直布…

百分点科技受邀参加“一带一路”国际合作高峰论坛

10月17-18日&#xff0c;第三届“一带一路”国际合作高峰论坛在北京成功举行。作为新一代信息技术出海企业代表&#xff0c;百分点科技董事长兼CEO苏萌受邀出席高峰论坛开场活动——“一带一路”企业家大会&#xff0c;与来自82个国家和地区的企业或机构、有关国际组织、经济机…

【IBIS 模型与仿真 - IBISWriter and Write_IBIS】

本文将介绍如何从用户设计中编写自定义IBIS模型。 本文是 SelectIO 解决方案中心&#xff08;Xilinx 答复 50924&#xff09;的设计助手部分&#xff08;Xilinx 答复 50926&#xff09;的一部分。 原文链接&#xff1a;https://support.xilinx.com/s/article/50957?languagee…

2022年亚太杯APMCM数学建模大赛E题有多少核弹可以摧毁地球求解全过程文档及程序

2022年亚太杯APMCM数学建模大赛 E题 有多少核弹可以摧毁地球 原题再现 1945年8月6日&#xff0c;第二次世界大战即将结束。为了尽快结束战争&#xff0c;美国在日本广岛投下了下一颗名为“小男孩”的原子弹。这样一颗原子弹在广岛炸死了20万人&#xff0c;广岛的所有建筑物都…