十、深度优先 && 广度优先
原文地址 一、什么是“搜索”算法? 算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。 因为图这种数据结构的表达能力很强,大部分涉及搜索的场景都可以抽象成“图”。 图上的搜索算法,最直接的理解就是,在图中找出从一个顶点出发,到另一个顶点的路径。 具体方法有很多,两种最简单、最“暴力”的方法为深度优先、广度优先搜索,还有A 、 IDA 等启发式搜索算法。 图有两种主要存储方法,邻接表和邻接矩阵。 以无向图,采用邻接表存储为例: public class Graph { // 顶点的个数 private int v; // 每个顶点后面有个链表 private LinkedList<Integer>[] adj; public Graph(int v) { this.v = v; adj = new LinkedList[v]; for (int i = 0; i < v; i++) { adj[i] = new LinkedList<>(); } } /** * 添加边 * @param s 顶点 * @param t 顶点 */ public void addEdge(int s,int t){ // 无向图一条边存两次(联想微信好友) adj[s].add(t); adj[t].add(s); } } 二、广度优先搜索(BFS)