matlab bfs函数,matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)
如此经典的算法竟一直没有单独的实现过,真是遗憾啊。
广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过。
这次单独的将两个算法实现出来,因为算法本身和图像没什么关系,所以更纯粹些。
广度优先搜索是从某一节点开始,搜索与其线连接的所有节点,按照广度方向像外扩展,直到不重复遍历所有节点。
深度优先搜索是从某一节点开始,沿着其搜索到的第一个节点不断深入下去,当无法再深入的时候,回溯节点,然后再在回溯中的某一节点开始沿另一个方向深度搜索,直到不重复的遍历所有节点。
广度优先搜索用的是队列作为临时节点存放处;深度优先搜索可以递归实现(算法导论就是用递归实现的伪代码),不过我这里是用栈作为临时节点存放处。
感觉也没什么好介绍的了,抄算法导论上的介绍也没什么意思,所有的内容都是书上的,真正学东西还是要看书。
下面是运行结果:
原连通图:
广度优先搜索:
深度优先搜索:
matlab代码如下,其中的画图函数netplot.m。
BFS.m
clear all;close all;clc
%初始化邻接压缩表
b=[1 2;1 3;1 4;2 4;2 5;3 6;4 6;4 7];
m=max(b(:)); %压缩表中最大值就是邻接矩阵的宽与高
A=compresstable2matrix(b); %从邻接压缩表构造图的矩阵表示
netplot(A,1) %形象表示
head=1; %队列头
tail=1; %队列尾,开始队列为空,tail==head
queue(head)=1; %向头中加入图第一个节点
head=head+1; %队列扩展
flag=1; %标记某个节点是否访问过了
re=[]; %最终结果while tail~=head %判断队列是否为空
i=queue(tail); %取队尾节点for j=1:mif A(i,j)==1 && isempty(find(flag==j,1)) %如果节点相连并且没有访问过
queue(head)=j; %新节点入列
head=head+1; %扩展队列
flag=[flag j]; %对新节点进行标记
re=[re;i j]; %将边存入结果end
endtail=tail+1;endA=compresstable2matrix(re);
figure;
netplot(A,1)
DFS.m
clear all;close all;clc
%初始化邻接压缩表
b=[1 2;1 3;1 4;2 4;2 5;3 6;4 6;4 7];
m=max(b(:)); %压缩表中最大值就是邻接矩阵的宽与高
A=compresstable2matrix(b); %从邻接压缩表构造图的矩阵表示
netplot(A,1) %形象表示
top=1; %堆栈顶
stack(top)=1; %将第一个节点入栈
flag=1; %标记某个节点是否访问过了
re=[]; %最终结果while top~=0%判断堆栈是否为空
pre_len=length(stack); %搜寻下一个节点前的堆栈长度
i=stack(top); %取堆栈顶节点for j=1:mif A(i,j)==1 && isempty(find(flag==j,1)) %如果节点相连并且没有访问过
top=top+1; %扩展堆栈
stack(top)=j; %新节点入栈
flag=[flag j]; %对新节点进行标记
re=[re;i j]; %将边存入结果break;end
end
if length(stack)==pre_len %如果堆栈长度没有增加,则节点开始出栈
stack(top)=[];
top=top-1;end
endA=compresstable2matrix(re);
figure;
netplot(A,1)
compresstable2matrix.m
function A=compresstable2matrix(b)
[n ~]=size(b);
m=max(b(:));
A=zeros(m,m);for i=1:n
A(b(i,1),b(i,2))=1;
A(b(i,2),b(i,1))=1;end
end
matlab bfs函数,matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)相关推荐
- matlab 定义函数 调用,matlab 定义函数,matlab定义函数并调用
matlab 定义函数,matlab定义函数并调用,Matlab自定义函数详解 很久以前写的一篇Matlab自定义函数访问量很大,可惜没有点赞的,我感觉是我没讲清楚,这里又写了一篇笔记 Matlab函 ...
- 用matlab定义位移函数,matlab 定义函数(Matlab怎么调用函数 自定义函数使用方法)...
matlab 定义函数(Matlab怎么调用函数 自定义函数使用方法),哪吒游戏网给大家带来详细的matlab 定义函数(Matlab怎么调用函数 自定义函数使用方法)介绍,大家可以阅读一下,希望这篇 ...
- 算法导论--广度优先搜索和深度优先搜索
广度优先搜索 在给定图G=(V,E)和一个特定的源顶点s的情况下,广度优先搜索系统地探索G中的边,以期"发现"可从s 到达的所有顶点,并计算s 到所有这些可达顶点之间的距离(即最少 ...
- matlab私有函数,MATLAB 嵌套函数,子函数,私有函数,重载函数
MATLAB函数嵌套 MATLAB中M文件有两种类型,脚本M文件和函数M文件.脚本M文件是将可执行程序语句放入M文件中,就像在命令窗口那样,按其语句顺序及逻辑关系执行,可以理解为一般的顺序执行程序语句 ...
- matlab引擎函数,Matlab引擎库函数
Matlab引擎库包含了一系列从外部应用程序调用和控制Matlab引擎的函数.下表列举了C语言的引擎库函数,这些函数后使用了eng前缀名 表 1 C语言引擎函数库 引擎函数 功能描述 engOpen ...
- matlab randi 函数,MATLAB中的randi函数
randi Pseudorandom integers from a uniform discrete distribution.来自一个均匀离散分布的伪随机整数 R = randi(IMAX,N) ...
- matlab aviread函数,matlab 未定义函数或变量 aviread.
matlab 画图l函数的变量问题 将程序改成下面的就行了!fori=1:8t0=0:0.1:10;u=ut(1,:);u=subs(u,t,t0);figure(i);plot(t0,u);xlab ...
- matlab doc函数,matlab常用函数.doc
matlab常用函数.doc MatLab 常用函数 1. 特殊变量与常数 ans 计算结果的变量名 computer 确定运行的计算机 eps 浮点相对精度 Inf 无穷大 I 虚数单位 name ...
- matlab swt函数,matlab swt 函数出错
matlab swt 函数出错 我在用matlab swt 函数分解信号时总是出现以下错误,麻烦各位高手告知该怎么修改,swt函数如何ERROR ... ----------------------- ...
最新文章
- Go 语言编程 — 并发 — Goroutine 协程
- ASP.NET Web Services Tutorial
- 华为与各国政府签订无间谍无后门协议
- HDU - 4990 Reading comprehension(矩阵快速幂,水题)
- Android之MediaProjectionManager实现手机截屏总结
- Servlet+JSP
- 【声学基础】概述——吸收
- 接口怎么获取数组底下的数组_3分钟短文 | PHP数组获取最后一个元素,10个方式中哪个有错?...
- 接口测试及常用接口测试工具
- 云计算决策指南:解析医疗的7大解决方案
- 人工智能标记语言AIML聊天机器人:产生、种类、应用、实例、AIML概述、知识库、公司、业界(20k字经典收藏版)
- codec engine代码阅读四---CE_DIR/examples/ti/sdo/ce/examles/codecs/videnc_copy
- python助教_助教工作:关于如何使用python+excel快捷生成千帆竞发图
- Volatility内存取证使用
- C语言基础和语法知识
- 绿色石化高质量发展 茂名天源石化碳三碳四资源利用项目开工
- iterator 的遍历 循环输出数字,页码
- C语言中创建自己函数库文件流程
- 【MD5】校验下载文件完整性
- src // 的意思/src相对协议/src为//开头的图片怎么加载