如此经典的算法竟一直没有单独的实现过,真是遗憾啊。

广度优先搜索在过去实现的二值图像连通区域标记和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)相关推荐

  1. matlab 定义函数 调用,matlab 定义函数,matlab定义函数并调用

    matlab 定义函数,matlab定义函数并调用,Matlab自定义函数详解 很久以前写的一篇Matlab自定义函数访问量很大,可惜没有点赞的,我感觉是我没讲清楚,这里又写了一篇笔记 Matlab函 ...

  2. 用matlab定义位移函数,matlab 定义函数(Matlab怎么调用函数 自定义函数使用方法)...

    matlab 定义函数(Matlab怎么调用函数 自定义函数使用方法),哪吒游戏网给大家带来详细的matlab 定义函数(Matlab怎么调用函数 自定义函数使用方法)介绍,大家可以阅读一下,希望这篇 ...

  3. 算法导论--广度优先搜索和深度优先搜索

    广度优先搜索 在给定图G=(V,E)和一个特定的源顶点s的情况下,广度优先搜索系统地探索G中的边,以期"发现"可从s 到达的所有顶点,并计算s 到所有这些可达顶点之间的距离(即最少 ...

  4. matlab私有函数,MATLAB 嵌套函数,子函数,私有函数,重载函数

    MATLAB函数嵌套 MATLAB中M文件有两种类型,脚本M文件和函数M文件.脚本M文件是将可执行程序语句放入M文件中,就像在命令窗口那样,按其语句顺序及逻辑关系执行,可以理解为一般的顺序执行程序语句 ...

  5. matlab引擎函数,Matlab引擎库函数

    Matlab引擎库包含了一系列从外部应用程序调用和控制Matlab引擎的函数.下表列举了C语言的引擎库函数,这些函数后使用了eng前缀名 表 1 C语言引擎函数库 引擎函数 功能描述 engOpen ...

  6. matlab randi 函数,MATLAB中的randi函数

    randi Pseudorandom integers from a uniform discrete distribution.来自一个均匀离散分布的伪随机整数 R = randi(IMAX,N) ...

  7. 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 ...

  8. matlab doc函数,matlab常用函数.doc

    matlab常用函数.doc MatLab 常用函数 1. 特殊变量与常数 ans 计算结果的变量名 computer 确定运行的计算机 eps 浮点相对精度 Inf 无穷大 I 虚数单位 name ...

  9. matlab swt函数,matlab swt 函数出错

    matlab swt 函数出错 我在用matlab swt 函数分解信号时总是出现以下错误,麻烦各位高手告知该怎么修改,swt函数如何ERROR ... ----------------------- ...

最新文章

  1. Go 语言编程 — 并发 — Goroutine 协程
  2. ASP.NET Web Services Tutorial
  3. 华为与各国政府签订无间谍无后门协议
  4. HDU - 4990 Reading comprehension(矩阵快速幂,水题)
  5. Android之MediaProjectionManager实现手机截屏总结
  6. Servlet+JSP
  7. 【声学基础】概述——吸收
  8. 接口怎么获取数组底下的数组_3分钟短文 | PHP数组获取最后一个元素,10个方式中哪个有错?...
  9. 接口测试及常用接口测试工具
  10. 云计算决策指南:解析医疗的7大解决方案
  11. 人工智能标记语言AIML聊天机器人:产生、种类、应用、实例、AIML概述、知识库、公司、业界(20k字经典收藏版)
  12. codec engine代码阅读四---CE_DIR/examples/ti/sdo/ce/examles/codecs/videnc_copy
  13. python助教_助教工作:关于如何使用python+excel快捷生成千帆竞发图
  14. Volatility内存取证使用
  15. C语言基础和语法知识
  16. 绿色石化高质量发展 茂名天源石化碳三碳四资源利用项目开工
  17. iterator 的遍历 循环输出数字,页码
  18. C语言中创建自己函数库文件流程
  19. 【MD5】校验下载文件完整性
  20. src // 的意思/src相对协议/src为//开头的图片怎么加载

热门文章

  1. CentOS7修改时区,你会吗?
  2. locust压测工具:测试信息输出与分布式模式
  3. 装饰器的定义、语法糖用法及示例代码
  4. HTML基础部分(2)表格
  5. 计算机视觉方向简介 | 图像拼接
  6. 链表问题8——将单向链表按某值划分成左边小、中间相等、右边大的形式(进阶)
  7. HTML5 - Websocket
  8. 5 个用 Python 编写 web 爬虫的方法
  9. vuex 闲置状态重置方案
  10. 微信小程序长按事件触发点击事件的BUG处理