算法图解5 - 图和广度优先搜索
Posted Android开发中文站
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法图解5 - 图和广度优先搜索相关的知识,希望对你有一定的参考价值。
一、图是什么?
图模拟一组连接。
-
图由节点 node 和边 edge 组成。 -
一个节点可能与众多节点直接相连,这些节点被称为邻居。
在前面的欠钱图中,Rama 是 Alex 的邻居。Adit 不是 Alex 的邻居,因为他们不直接相连。但 Adit 既是 Rama 的邻居,又是 Tom 的邻居。 -
图用于模拟不同的东西是如何相连的。
二、图的表示
let graph = new Map();
graph. set( 'jartto', [ 'alice', 'bob', 'claire']);
graph. set( 'alice', []);
graph. set( 'bob', []);
graph. set( 'claire', []);
graph. get( 'jartto'); // ["alice", "bob", "claire"]
-
图中的每个节点都需要表示; -
键值对的添加顺序对结果没有影响,因为散列表是无序的;
三、有向图和无向图
有向图:有指向邻居的箭头,其中的关系是单向的。
无向图:undirected graph 没有箭头,直接相连的节点互为邻居。
无向图中的边不带箭头,其中的关系是双向的。
四、图的实现
// 定义散列表
let graph = new Map();
graph. set( 'jartto', [ 'alice', 'bob', 'claire']);
graph. set( 'bob', [ 'anuj', 'peggy']);
graph. set( 'alice', [ 'peggy']);
graph. set( 'claire', [ 'thom', 'jonny']);
graph. set( 'anuj', []);
graph. set( 'peggy', []);
graph. set( 'thom', []);
graph. set( 'jonny', []);
// 查询函数
function search(name) {
let queue = [];
let searched = [];
queue = queue.concat(graph. get(name));
while (queue.length > 0) {
person = queue.shift();
if (!searched.includes(person)) {
if (isSeller(person)) {
console.log(`${person} is a mango seller`);
return true;
} else {
queue = queue.concat(graph. get(person));
searched.push(person);
}
}
}
return false;
}
// 检查人的姓名是否以m结尾:如果是,他就是芒果销售商。
function isSeller(name) {
return name[name.length -1] == 'm';
}
search( 'jartto');
五、广度优先搜索
-
从节点 A 出发,有前往节点 B 的路径吗? -
从节点 A 出发,前往节点 B 的哪条路径最短?
解决最短路径问题的算法被称为广度优先搜索。
广度优先搜索不仅查找从A到B的路径,而且找到的是最短的路径。
六、广度优先搜索使用场景
-
编写国际跳棋 AI,计算最少走多少步就可获胜; -
编写拼写检查器,计算最少编辑多少个地方就可将错拼的单词改成正确的单词,如将 READED 改为 READER 需要编辑一个地方; -
根据你的人际关系网络找到关系最近的医生。
七、运行时间
八、扩展:拓扑排序
以上是关于算法图解5 - 图和广度优先搜索的主要内容,如果未能解决你的问题,请参考以下文章