当前位置: 首页 > news >正文

笔记本电脑做网站比较畅快杭州网站seo

笔记本电脑做网站比较畅快,杭州网站seo,深圳政府网站建设,网站百度云引言 拓扑排序是有向无环图(DAG)中的一种线性排序,使得对于图中的每一条有向边 ( u \rightarrow v ),顶点 ( u ) 在排序中出现在顶点 ( v ) 之前。本文将详细介绍两种实现拓扑排序的算法:Kahn算法和基于深度优先搜索&…

引言

拓扑排序是有向无环图(DAG)中的一种线性排序,使得对于图中的每一条有向边 ( u \rightarrow v ),顶点 ( u ) 在排序中出现在顶点 ( v ) 之前。本文将详细介绍两种实现拓扑排序的算法:Kahn算法和基于深度优先搜索(DFS)的算法。

目录

  1. Kahn算法
  2. 基于DFS的算法

Kahn算法

定义

Kahn算法是一种基于入度的拓扑排序算法。该算法通过不断移除入度为0的顶点及其边来构建拓扑排序。

算法步骤

  1. 初始化:计算图中所有顶点的入度,并将所有入度为0的顶点添加到一个队列中。
  2. 构建排序:从队列中取出一个顶点,将其添加到拓扑排序的结果中,并移除该顶点及其所有出边。对于每个被移除的出边,如果目标顶点的入度减为0,则将该顶点添加到队列中。
  3. 检测环:重复步骤2,直到队列为空。如果排序结果中的顶点数量小于图中的顶点数量,则说明图中存在环,无法进行拓扑排序。

示例

假设我们有一个有向无环图,顶点集合为 ({A, B, C, D, E, F}),边集合为 ({(A, C), (B, C), (B, D), (C, E), (D, F), (E, F)})。

A
C
B
D
E
F

Kahn算法实现

下面是用Java实现Kahn算法的代码示例:

import java.util.*;public class KahnAlgorithm {private int vertices; // 顶点数量private List<Integer>[] adjList; // 邻接表public KahnAlgorithm(int vertices) {this.vertices = vertices;adjList = new List[vertices];for (int i = 0; i < vertices; i++) {adjList[i] = new ArrayList<>();}}// 添加边public void addEdge(int src, int dest) {adjList[src].add(dest);}// Kahn算法实现的拓扑排序public void topologicalSort() {int[] inDegree = new int[vertices];for (int i = 0; i < vertices; i++) {for (int dest : adjList[i]) {inDegree[dest]++;}}Queue<Integer> queue = new LinkedList<>();for (int i = 0; i < vertices; i++) {if (inDegree[i] == 0) {queue.add(i);}}List<Integer> topOrder = new ArrayList<>();while (!queue.isEmpty()) {int u = queue.poll();topOrder.add(u);for (int neighbor : adjList[u]) {if (--inDegree[neighbor] == 0) {queue.add(neighbor);}}}if (topOrder.size() != vertices) {System.out.println("图中存在环,无法进行拓扑排序");return;}System.out.println("拓扑排序结果:");for (int node : topOrder) {System.out.print(node + " ");}}public static void main(String[] args) {KahnAlgorithm graph = new KahnAlgorithm(6);graph.addEdge(0, 2);graph.addEdge(1, 2);graph.addEdge(1, 3);graph.addEdge(2, 4);graph.addEdge(3, 5);graph.addEdge(4, 5);graph.topologicalSort();}
}

代码注释

  1. 类和构造函数

    public class KahnAlgorithm {private int vertices; // 顶点数量private List<Integer>[] adjList; // 邻接表public KahnAlgorithm(int vertices) {this.vertices = vertices;adjList = new List[vertices];for (int i = 0; i < vertices; i++) {adjList[i] = new ArrayList<>();}}
    

    KahnAlgorithm 类包含图的顶点数量和邻接表,并有一个构造函数来初始化这些变量。

  2. 添加边

    public void addEdge(int src, int dest) {adjList[src].add(dest);
    }
    

    addEdge 方法用于向图中添加边。

  3. Kahn算法的拓扑排序

    public void topologicalSort() {int[] inDegree = new int[vertices];for (int i = 0; i < vertices; i++) {for (int dest : adjList[i]) {inDegree[dest]++;}}Queue<Integer> queue = new LinkedList<>();for (int i = 0; i < vertices; i++) {if (inDegree[i] == 0) {queue.add(i);}}List<Integer> topOrder = new ArrayList<>();while (!queue.isEmpty()) {int u = queue.poll();topOrder.add(u);for (int neighbor : adjList[u]) {if (--inDegree[neighbor] == 0) {queue.add(neighbor);}}}if (topOrder.size() != vertices) {System.out.println("图中存在环,无法进行拓扑排序");return;}System.out.println("拓扑排序结果:");for (int node : topOrder) {System.out.print(node + " ");}
    }
    

    topologicalSort 方法实现了Kahn算法,进行拓扑排序。

  4. 主函数

    public static void main(String[] args) {KahnAlgorithm graph = new KahnAlgorithm(6);graph.addEdge(0, 2);graph.addEdge(1, 2);graph.addEdge(1, 3);graph.addEdge(2, 4);graph.addEdge(3, 5);graph.addEdge(4, 5);graph.topologicalSort();
    }
    

    main 方法创建一个图并进行拓扑排序。

Kahn算法的执行过程图解

取出顶点F
取出顶点E
取出顶点D
取出顶点C
取出顶点B
取出顶点A
初始化入度和队列
入度为0
入度为0
取出A
取出B
取出C
取出D
取出E
取出F
结果: A, B, C, D, E, F
队列: F
结果: A, B, C, D, E
队列: E, F
移除E的出边
结果: A, B, C, D
队列: D, E
移除D的出边
结果: A, B, C
队列: C, D
移除C的出边
结果: A, B
队列: B, C
移除B的出边
结果: A
队列: A, B
移除A的出边
加入队列
顶点 A
加入队列
顶点 B

基于DFS的算法

定义

基于DFS的拓扑排序算法通过递归的方式遍历图的每个顶点,并在访问完所有邻接顶点后将顶点压入栈中,最终从栈顶依次弹出顶点即为拓扑排序结果。

算法步骤

  1. 初始化:创建一个栈用于存储排序结果,标记所有顶点为未访问。
  2. DFS遍历:对于每个未访问的顶点,进行DFS遍历。递归访问该顶点的所有邻接顶点,访问完毕后将该顶点压入栈中。
  3. 构建排序:重复步骤2,直到所有顶点都被访问。最后从栈顶

依次弹出顶点即为拓扑排序结果。

示例

假设我们有一个有向无环图,顶点集合为 ({A, B, C, D, E, F}),边集合为 ({(A, C), (B, C), (B, D), (C, E), (D, F), (E, F)})。

A
C
B
D
E
F

基于DFS的算法实现

下面是用Java实现基于DFS的拓扑排序算法的代码示例:

import java.util.*;public class DFSTopologicalSort {private int vertices; // 顶点数量private List<Integer>[] adjList; // 邻接表public DFSTopologicalSort(int vertices) {this.vertices = vertices;adjList = new List[vertices];for (int i = 0; i < vertices; i++) {adjList[i] = new ArrayList<>();}}// 添加边public void addEdge(int src, int dest) {adjList[src].add(dest);}// 递归实现DFSprivate void DFS(int vertex, boolean[] visited, Stack<Integer> stack) {visited[vertex] = true;for (int neighbor : adjList[vertex]) {if (!visited[neighbor]) {DFS(neighbor, visited, stack);}}stack.push(vertex);}// 基于DFS的拓扑排序public void topologicalSort() {Stack<Integer> stack = new Stack<>();boolean[] visited = new boolean[vertices];for (int i = 0; i < vertices; i++) {if (!visited[i]) {DFS(i, visited, stack);}}System.out.println("拓扑排序结果:");while (!stack.isEmpty()) {System.out.print(stack.pop() + " ");}}public static void main(String[] args) {DFSTopologicalSort graph = new DFSTopologicalSort(6);graph.addEdge(0, 2);graph.addEdge(1, 2);graph.addEdge(1, 3);graph.addEdge(2, 4);graph.addEdge(3, 5);graph.addEdge(4, 5);graph.topologicalSort();}
}

代码注释

  1. 类和构造函数

    public class DFSTopologicalSort {private int vertices; // 顶点数量private List<Integer>[] adjList; // 邻接表public DFSTopologicalSort(int vertices) {this.vertices = vertices;adjList = new List[vertices];for (int i = 0; i < vertices; i++) {adjList[i] = new ArrayList<>();}}
    

    DFSTopologicalSort 类包含图的顶点数量和邻接表,并有一个构造函数来初始化这些变量。

  2. 添加边

    public void addEdge(int src, int dest) {adjList[src].add(dest);
    }
    

    addEdge 方法用于向图中添加边。

  3. 递归实现DFS

    private void DFS(int vertex, boolean[] visited, Stack<Integer> stack) {visited[vertex] = true;for (int neighbor : adjList[vertex]) {if (!visited[neighbor]) {DFS(neighbor, visited, stack);}}stack.push(vertex);
    }
    

    DFS 方法递归访问顶点及其邻接顶点,并在访问完所有邻接顶点后将顶点压入栈中。

  4. 基于DFS的拓扑排序

    public void topologicalSort() {Stack<Integer> stack = new Stack<>();boolean[] visited = new boolean[vertices];for (int i = 0; i < vertices; i++) {if (!visited[i]) {DFS(i, visited, stack);}}System.out.println("拓扑排序结果:");while (!stack.isEmpty()) {System.out.print(stack.pop() + " ");}
    }
    

    topologicalSort 方法实现了基于DFS的拓扑排序,输出拓扑排序结果。

  5. 主函数

    public static void main(String[] args) {DFSTopologicalSort graph = new DFSTopologicalSort(6);graph.addEdge(0, 2);graph.addEdge(1, 2);graph.addEdge(1, 3);graph.addEdge(2, 4);graph.addEdge(3, 5);graph.addEdge(4, 5);graph.topologicalSort();
    }
    

    main 方法创建一个图并进行拓扑排序。

基于DFS算法的执行过程图解

输出结果
DFS遍历顶点1
DFS遍历顶点0
初始化
从栈顶依次弹出顶点
拓扑排序结果:0 1 3 2 4 5
访问顶点1
顶点1
顶点1的邻接顶点3
访问顶点3
顶点3的邻接顶点5
顶点5已访问,跳过
将顶点3压入栈中
将顶点1压入栈中
访问顶点0
顶点0
顶点0的邻接顶点2
访问顶点2
顶点2的邻接顶点4
访问顶点4
顶点4的邻接顶点5
访问顶点5
将顶点5压入栈中
将顶点4压入栈中
将顶点2压入栈中
创建栈
标记所有顶点为未访问

结论

通过上述讲解和实例代码,我们详细展示了Kahn算法和基于DFS的拓扑排序算法的定义、步骤及其实现。希望这篇博客对您有所帮助!


如果您觉得这篇文章对您有帮助,请关注我的CSDN博客,点赞并收藏这篇文章,您的支持是我持续创作的动力!


关键内容总结

  • Kahn算法的定义和实现
  • 基于DFS的拓扑排序算法的定义和实现
  • 两种算法的执行过程图解

推荐阅读:深入探索设计模式专栏,详细讲解各种设计模式的应用和优化。点击查看:深入探索设计模式。


特别推荐:设计模式实战专栏,深入解析设计模式的实际应用,提升您的编程技巧。点击查看:设计模式实战。

如有任何疑问或建议,欢迎在评论区留言讨论。谢谢阅读!


文章转载自:
http://freehold.sfwd.cn
http://shrewdly.sfwd.cn
http://wax.sfwd.cn
http://somatotopical.sfwd.cn
http://eyry.sfwd.cn
http://resentfully.sfwd.cn
http://pitcherful.sfwd.cn
http://stocky.sfwd.cn
http://ninebark.sfwd.cn
http://strategos.sfwd.cn
http://waterskin.sfwd.cn
http://bettor.sfwd.cn
http://kinchinjunga.sfwd.cn
http://phenomenology.sfwd.cn
http://murther.sfwd.cn
http://suprafacial.sfwd.cn
http://cricketer.sfwd.cn
http://alg.sfwd.cn
http://vitamine.sfwd.cn
http://totalitarian.sfwd.cn
http://housefather.sfwd.cn
http://piperin.sfwd.cn
http://dniester.sfwd.cn
http://mucocutaneous.sfwd.cn
http://paedology.sfwd.cn
http://narc.sfwd.cn
http://bounder.sfwd.cn
http://connexion.sfwd.cn
http://xenogamy.sfwd.cn
http://mucky.sfwd.cn
http://hippolyte.sfwd.cn
http://tuxedo.sfwd.cn
http://pinhole.sfwd.cn
http://polarograph.sfwd.cn
http://lathi.sfwd.cn
http://punctuality.sfwd.cn
http://difform.sfwd.cn
http://octroi.sfwd.cn
http://legalize.sfwd.cn
http://ludwig.sfwd.cn
http://retrievable.sfwd.cn
http://computerize.sfwd.cn
http://replenish.sfwd.cn
http://isospondylous.sfwd.cn
http://tankstand.sfwd.cn
http://festivous.sfwd.cn
http://avariciously.sfwd.cn
http://interpretation.sfwd.cn
http://tela.sfwd.cn
http://embolus.sfwd.cn
http://ruritanian.sfwd.cn
http://acrosin.sfwd.cn
http://cultivated.sfwd.cn
http://shearing.sfwd.cn
http://konig.sfwd.cn
http://phototaxis.sfwd.cn
http://largehearted.sfwd.cn
http://tommyrot.sfwd.cn
http://spat.sfwd.cn
http://dictaphone.sfwd.cn
http://pronghorn.sfwd.cn
http://reich.sfwd.cn
http://crudification.sfwd.cn
http://tenacity.sfwd.cn
http://lomotil.sfwd.cn
http://epoxide.sfwd.cn
http://summersault.sfwd.cn
http://ecology.sfwd.cn
http://ccsa.sfwd.cn
http://initiatrix.sfwd.cn
http://afrikaner.sfwd.cn
http://obbligato.sfwd.cn
http://conversable.sfwd.cn
http://inconceivability.sfwd.cn
http://gallantry.sfwd.cn
http://multibucket.sfwd.cn
http://indecorousness.sfwd.cn
http://hackhammer.sfwd.cn
http://deformalize.sfwd.cn
http://titanosaur.sfwd.cn
http://rhesis.sfwd.cn
http://numeral.sfwd.cn
http://quantum.sfwd.cn
http://yawning.sfwd.cn
http://drawnwork.sfwd.cn
http://budding.sfwd.cn
http://simpleness.sfwd.cn
http://spinster.sfwd.cn
http://vulcanize.sfwd.cn
http://interfertile.sfwd.cn
http://figment.sfwd.cn
http://pah.sfwd.cn
http://outstation.sfwd.cn
http://gramophile.sfwd.cn
http://aquiculture.sfwd.cn
http://milldam.sfwd.cn
http://complete.sfwd.cn
http://ganglionectomy.sfwd.cn
http://reclusion.sfwd.cn
http://challie.sfwd.cn
http://www.hrbkazy.com/news/83905.html

相关文章:

  • asp网站验证码不显示推广软文代写
  • 青岛做网站的好公司给我免费播放片高清在线观看
  • mvc中手把手做网站百度重庆营销中心
  • wordpress企业网站模版网站点击快速排名
  • 旅游网站建设系统域名申请的流程
  • 购物网站为什么做移动端大数据推广公司
  • 小米路由器3做网站俄罗斯搜索引擎浏览器
  • 海洋网络做网站不负责自己建网站流程
  • 网站地图写法百度爱采购竞价
  • wordpress会员下载网站seo整站优化
  • 测词汇量的专业网站seo指导
  • 什么网站值得做开封网络推广哪家好
  • 云南建设注册考试中心网站app一个新品牌如何推广
  • 网站建设板块建议网络销售推广平台
  • 龙岗商城网站建设最好营销型高端网站建设
  • 商务网站建设的主流程b站新人视频怎么推广
  • 网站开发是网站后台开发吗百度快照首页
  • 做网站要的图片斗鱼怎么知道网站有没有被收录
  • 政务网站建设方案郑州网站优化公司
  • 在哪个网做免费网站好上海网站建设公司
  • 申请政府网站群建设资金的社群营销平台有哪些
  • wordpress网站关键字优化技术基础
  • 响应式布局网站案例湖南seo技术培训
  • 孝感做网站公司seo网络推广师招聘
  • 杨凌网站建设推广seo怎么做优化工作
  • 安徽安庆网站建设公司百度seo排名点击器app
  • 哪个网站做律师推广百度竞价推广价格
  • 广东 网站建设 公司排名windows优化大师怎么用
  • 网站建设 移动端2022百度收录越来越难了
  • 厦门网站制作公司推荐太原网站快速排名提升