电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

詳解Java實現拓撲排序算法

瀏覽:95日期:2022-08-10 14:27:20
目錄一、介紹二、拓撲排序算法分析三、拓撲排序代碼實現一、介紹

百科上這么定義的:

對一個有向無環圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊<u,v>∈E(G),則u在線性序列中出現在v之前。通常,這樣的線性序列稱為滿足拓撲次序(Topological Order)的序列,簡稱拓撲序列。簡單的說,由某個集合上的一個偏序得到該集合上的一個全序,這個操作稱之為拓撲排序。

為什么會有拓撲排序?拓撲排序有何作用?

舉個例子,學習java系列的教程

代號 科目 學前需掌握 A1 javaSEA2 htmlA3 Jsp A1,A2 A4 servlet A1 A5 ssm A3,A4 A6 springboot A5

就比如學習java系類(部分)從java基礎,到jsp/servlet,到ssm,到springboot,springcloud等是個循序漸進且有依賴的過程。在jsp學習要首先掌握java基礎和html基礎。學習框架要掌握jsp/servlet和jdbc之類才行。那么,這個學習過程即構成一個拓撲序列。當然這個序列也不唯一,你可以對不關聯的學科隨意選擇順序(比如html和java可以隨便先開始哪一個。)

那上述序列可以簡單表示為:

詳解Java實現拓撲排序算法

其中五種均為可以選擇的學習方案,對課程安排可以有參考作用,當然,五個都是拓撲序列。只是選擇的策略不同!

一些其他注意:

DGA:有向無環圖AOV網:數據在頂點 可以理解為面向對象AOE網:數據在邊上,可以理解為面向過程!

而我們通俗一點的說法,就是按照某種規則將這個圖的頂點取出來,這些頂點能夠表示什么或者有什么聯系。

規則:

圖中每個頂點只出現一次。 A在B前面,則不存在B在A前面的路徑。(不能成環!?。?!) 頂點的順序是保證所有指向它的下個節點在被指節點前面!(例如A—>B—>C那么A一定在B前面,B一定在C前面)。所以,這個核心規則下只要滿足即可,所以拓撲排序序列不一定唯一!二、拓撲排序算法分析

詳解Java實現拓撲排序算法

正常步驟為(方法不一定唯一):

從DGA圖中找到一個沒有前驅的頂點輸出。(可以遍歷,也可以用優先隊列維護) 刪除以這個點為起點的邊。(它的指向的邊刪除,為了找到下個沒有前驅的頂點) 重復上述,直到最后一個頂點被輸出。如果還有頂點未被輸出,則說明有環!

對于上圖的簡單序列,可以簡單描述步驟為:

1:刪除1或2輸出

詳解Java實現拓撲排序算法

2:刪除2或3以及對應邊

詳解Java實現拓撲排序算法

3:刪除3或者4以及對應邊

詳解Java實現拓撲排序算法

4:重復以上規則步驟

詳解Java實現拓撲排序算法

這樣就完成一次拓撲排序,得到一個拓撲序列,但是這個序列并不唯一!從過程中也看到有很多選擇方案,具體得到結果看你算法的設計了。但只要滿足即是拓撲排序序列。

另外觀察 1 2 4 3 6 5 7 9這個序列滿足我們所說的有關系的節點指向的在前面,被指向的在后面。如果完全沒關系那不一定前后(例如1,2)

三、拓撲排序代碼實現

對于拓撲排序,如何用代碼實現呢?對于拓撲排序,雖然在上面詳細介紹了思路和流程,也很通俗易懂。但是實際上代碼的實現還是很需要斟酌的,如何在空間和時間上能夠得到較好的平衡且取得較好的效率?

首先要考慮存儲。對于節點,首先他有聯通點這么多屬性。遇到稀疏矩陣還是用鄰接表比較好。因為一個節點的指向節點較少,用鄰接矩陣較浪費資源。

另外,如果是1,2,3,4,5,6這樣的序列求拓撲排序,我們可以考慮用數組,但是如果遇到1,2,88,9999類似數據,可以考慮用map中轉一下。

我們具體的代碼思想為:

新建node類,包含節點數值和它的指向(這里直接用list集合替代鏈表了) 一個數組包含node(這里默認編號較集中)。初始化,添加每個節點指向的時候同時被指的節點入度+1!(A—>C)那么C的入度+1; 掃描一遍所有node。將所有入度為0的點加入一個棧(隊列)。 當棧(隊列)不空的時候,拋出其中任意一個node(棧就是尾,隊就是頭,順序無所謂,上面分析了只要同時入度為零可以隨便選擇順序)。將node輸出,并且node指向的所有元素入度減一。如果某個點的入度被減為0,那么就將它加入棧(隊列)。 重復上述操作,直到棧為空。

這里主要是利用棧或者隊列儲存入度只為0的節點,只需要初次掃描表將入度為0的放入棧(隊列)中。

這里你或許會問為什么。 因為節點之間是有相關性的,一個節點若想入度為零,那么它的父節點(指向節點)肯定在它為0前入度為0,拆除關聯箭頭。從父節點角度,它的這次拆除聯系,可能導致被指向的入讀為0,也可能不為0(還有其他節點指向兒子)

至于具體demo:

package 圖論;import java.util.ArrayDeque;import java.util.ArrayList;import java.util.List;import java.util.Queue;import java.util.Stack;public class tuopu {static class node{int value;List<Integer> next;public node(int value) {this.value=value;next=new ArrayList<Integer>();}public void setnext(List<Integer>list) {this.next=list;}}public static void main(String[] args) {// TODO Auto-generated method stubnode []nodes=new node[9];//儲存節點int a[]=new int[9];//儲存入度List<Integer>list[]=new ArrayList[10];//臨時空間,為了存儲指向的集合for(int i=1;i<9;i++){nodes[i]=new node(i);list[i]=new ArrayList<Integer>();}initmap(nodes,list,a);//主要流程//Queue<node>q1=new ArrayDeque<node>();Stack<node>s1=new Stack<node>();for(int i=1;i<9;i++){//System.out.print(nodes[i].next.size()+' 55 ');//System.out.println(a[i]);if(a[i]==0) {s1.add(nodes[i]);}}while(!s1.isEmpty()){node n1=s1.pop();//拋出輸出 System.out.print(n1.value+' ');List<Integer>next=n1.next;for(int i=0;i<next.size();i++){a[next.get(i)]--;//入度減一if(a[next.get(i)]==0)//如果入度為0{s1.add(nodes[next.get(i)]);}}}}private static void initmap(node[] nodes, List<Integer>[] list, int[] a) {list[1].add(3);nodes[1].setnext(list[1]);a[3]++;list[2].add(4);list[2].add(6);nodes[2].setnext(list[2]);a[4]++;a[6]++;list[3].add(5);nodes[3].setnext(list[3]);a[5]++;list[4].add(5);list[4].add(6);nodes[4].setnext(list[4]);a[5]++;a[6]++;list[5].add(7);nodes[5].setnext(list[5]);a[7]++;list[6].add(8);nodes[6].setnext(list[6]);a[8]++;list[7].add(8);nodes[7].setnext(list[7]);a[8]++;}}

輸出結果

2 4 6 1 3 5 7 8

詳解Java實現拓撲排序算法

當然,上面說過用棧和隊列都可以!如果使用隊列就會得到1 2 3 4 5 6 7 8 的拓撲序列

以上就是詳解Java實現拓撲排序算法的詳細內容,更多關于Java實現拓撲排序算法的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 卓能JOINTLEAN端子连接器厂家-专业提供PCB接线端子|轨道式端子|重载连接器|欧式连接器等电气连接产品和服务 | 废气处理设备-工业除尘器-RTO-RCO-蓄热式焚烧炉厂家-江苏天达环保设备有限公司 | 全温度恒温培养摇床-大容量-立式-远红外二氧化碳培养箱|南荣百科 | 短信通106短信接口验证码接口群发平台_国际短信接口验证码接口群发平台-速度网络有限公司 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | 比士亚-专业恒温恒湿酒窖,酒柜,雪茄柜的设计定制 | 冷藏车-东风吸污车-纯电动环卫车-污水净化车-应急特勤保障车-程力专汽厂家-程力专用汽车股份有限公司销售二十一分公司 | 蓄电池在线监测系统|SF6在线监控泄露报警系统-武汉中电通电力设备有限公司 | 咖啡加盟,咖啡店加盟连锁品牌-卡小逗 | 胶泥瓷砖胶,轻质粉刷石膏,嵌缝石膏厂家,腻子粉批发,永康家德兴,永康市家德兴建材厂 | 聚合氯化铝价格_聚合氯化铝厂家_pac絮凝剂-唐达净水官网 | 14米地磅厂家价价格,150吨地磅厂家价格-百科 | 期货软件-专业期货分析软件下载-云智赢 | 吸音板,隔音板,吸音材料,吸音板价格,声学材料 - 佛山诺声吸音板厂家 | 南昌旅行社_南昌国际旅行社_南昌国旅在线 | 河南橡胶接头厂家,河南波纹补偿器厂家,河南可曲挠橡胶软连接,河南套筒补偿器厂家-河南正大阀门 | 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | 不锈钢监控杆_监控立杆厂家-廊坊耀星光电科技有限公司 | 国际船舶网 - 船厂、船舶、造船、船舶设备、航运及海洋工程等相关行业综合信息平台 | 高低温试验房-深圳高低温湿热箱-小型高低温冲击试验箱-爱佩试验设备 | 数控走心机-双主轴走心机厂家-南京建克 | 青州搬家公司电话_青州搬家公司哪家好「鸿喜」青州搬家 | 防火卷帘门价格-聊城一维工贸特级防火卷帘门厂家▲ | 代理记账_免费注册公司_营业执照代办_资质代办-【乐财汇】 | 上海电子秤厂家,电子秤厂家价格,上海吊秤厂家,吊秤供应价格-上海佳宜电子科技有限公司 | 熔体泵|换网器|熔体齿轮泵|熔体计量泵厂家-郑州巴特熔体泵有限公司 | 冲锋衣滑雪服厂家-冲锋衣定制工厂-滑雪服加工厂-广东睿牛户外(S-GERT) | bng防爆挠性连接管-定做金属防爆挠性管-依客思防爆科技 | 泰来华顿液氮罐,美国MVE液氮罐,自增压液氮罐,定制液氮生物容器,进口杜瓦瓶-上海京灿精密机械有限公司 | 蔬菜清洗机_环速洗菜机_异物去除清洗机_蔬菜清洗机_商用洗菜机 - 环速科技有限公司 | 六维力传感器_六分量力传感器_模腔压力传感器-南京数智微传感科技有限公司 | 山西3A认证|太原AAA信用认证|投标AAA信用证书-山西AAA企业信用评级网 | 基本型顶空进样器-全自动热脱附解吸仪价格-AutoHS全模式-成都科林分析技术有限公司 | lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | 考勤系统_人事考勤管理系统_本地部署BS考勤系统_考勤软件_天时考勤管理专家 | 医用酒精_84消毒液_碘伏消毒液等医用消毒液-漓峰消毒官网 | 武汉画册印刷厂家-企业画册印刷-画册设计印刷制作-宣传画册印刷公司 - 武汉泽雅印刷厂 | 有源电力滤波装置-电力有源滤波器-低压穿排电流互感器|安科瑞 | 台式核磁共振仪,玻璃软化点测定仪,旋转高温粘度计,测温锥和测温块-上海麟文仪器 | 济南保安公司加盟挂靠-亮剑国际安保服务集团总部-山东保安公司|济南保安培训学校 | 整合营销推广|营销网络推广公司|石家庄网站优化推广公司|智营销 好物生环保网、环保论坛 - 环保人的学习交流平台 |