图,这个玩意儿竟然还可以用来排序!
【摘要】 之前我写过一篇深度技术文:我敢说,这图绝对跟你想象中的不太一样!在这篇文章里我详细分析了图这种数据结构。本文是基于图这种数据结构,介绍一个排序算法:拓扑排序。准确的说,应该叫“有向图的拓扑排序”。所谓的有向图,就是 A -> B,但不能 B -> A。与无向图的区别是,它的边在邻接矩阵里只有一项(这些东西,我在上面的文章中都有详细的描述)。有向图的邻接矩阵如下:所以针对前面讨论的无向图,邻接...
之前我写过一篇深度技术文:我敢说,这图绝对跟你想象中的不太一样!在这篇文章里我详细分析了图这种数据结构。
有向图的邻接矩阵如下:
//有向图中,邻接矩阵中只有一项
public void addEdge(int start, int end) {
adjMat[start][end] = 1;
}
1.找到一个没有后继的顶点;
2.从图中删除这个顶点,在列表中插入顶点的标记。
public void poto() {
int orig_nVerts = nVerts; //记录有多少个顶点
while(nVerts > 0) {
//返回没有后继顶点的顶点
int currentVertex = noSuccessors(); //如果不存在这样的顶点,返回-1
if(currentVertex == -1) {
System.out.println("ERROR: Graph has cycles!");
return;
}
//sortedArray中存储排过序的顶点(从尾开始存)
sortedArray[nVerts-1] = vertexArray[currentVertex].label;
deleteVertex(currentVertex);//删除该顶点,便于下一次循环,寻找下一个没有后继顶点的顶点
}
System.out.println("Topologically sorted order:");
for(int i = 0; i < orig_nVerts; i++) {
System.out.print(sortedArray[i]);
}
System.out.println("");
}
1.调用 noSuccessors()
找到任意一个没有后继的顶点;
2.如果找到一个这样的顶点,把顶点放到 sortedArray 数组中,并且从图中删除这个顶点;
3.如果不存在这样的顶点,则图必然存在环。
noSuccessor()
方法和 deleteVertes()
方法://return vertex with no successors
private int noSuccessors() {
boolean isEdge;
for(int row = 0; row < nVerts; row++) {
isEdge = false;
for(int col = 0; col < nVerts; col++) {
if(adjMat[row][col] > 0) { //只要adjMat数组中存储了1,表示row->col
isEdge = true;
break;
}
}
if(!isEdge) {//只要有边,返回最后一个顶点
return row;
}
}
return -1;
}
private void deleteVertex(int delVertex) {
if(delVertex != nVerts -1) {
for(int i = delVertex; i < nVerts-1; i++) { //delete from vertexArray
vertexArray[i] = vertexArray[i+1];
}
//删除adjMat中相应的边
for(int row = delVertex; row < nVerts-1; row++) {//delete row from adjMat
moveRowUp(row, nVerts);
}
for(int col = delVertex; col < nVerts-1; col++) {//delete column from adjMat
moveColLeft(col, nVerts-1);
}
}
nVerts--;
}
private void moveRowUp(int row, int length) {
for(int col = 0; col < length; col++) {
adjMat[row][col] = adjMat[row+1][col];
}
}
private void moveColLeft(int col, int length) {
for(int row = 0; row < length; row++) {
adjMat[row][col] = adjMat[row][col+1];
}
}
转载声明:本文转载自公众号【程序员私房菜】。
原文链接:https://mp.weixin.qq.com/s/KqlBkH5C6zokR3CZexK-TQ
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)