# Android程序员会遇到的算法(part 7 拓扑排序)

1字数 2248阅读 310

Screen Shot 2019-04-06 at 12.12.31 PM.png

### 1.怎么定义数据结构

``````//节点的后继节点
HashMap<String, HashSet<String>>  courses = new HashMap();

``````

``````//记录每个点的前驱节点数量
HashMap<String,Integer> preCount = new HashMap<String,Integer>
``````

### 2.拓扑排序

Screen Shot 2019-04-06 at 1.10.59 PM.png

``````//课程调度队列
//最后课程的顺序
List<String> sequence = new ArrayList<>();
while (!queue.isEmpty()) {
//获取当前队列中的第一个课程，将其加入到最后的课程顺序列表中
String currentCourse = queue.poll();

//每当一个课程结束学习之后，找到它的后继课程
for (String course : courses.get(currentCourse)) {
//加入后继课程的前驱节点数量还是大于0 的，说明该课程还没被学习
if (preCount.get(course) > 0) {
//减少该后继课程的前驱节点数量
preCount.put(course, preCount.get(course) - 1);
//如果前去梳理减到0，说明我们已经可以开始学习该课程了，
//加到队列里面
if (preCount.get(course) == 0) {
}
}
}

}
return sequence;
``````

### 3.和广度优先的不同

`````` if (preCount.get(course) == 0) {
}

``````

#### 4.有环？

Screen Shot 2019-04-06 at 1.26.07 PM.png

Screen Shot 2019-04-06 at 1.32.26 PM.png

``````  while (!queue.isEmpty()) {
//获取到A
String currentCourse = queue.poll();

``````

``````HashMap<String, HashSet<String>>  courses = new HashMap();
//假如最后我们能学习完所有课程
if(result.size() == course.keySet().size()){
return true;
}else{
return false;
}

``````

### 6.题目代码

Leetcode 里面的Course Schedule, 大家可以自己练习一下。

``````public int[] findOrder(int numCourses, int[][] prerequisites) {
// record dependecy counts
HashMap<Integer, Integer> dependeciesCount = new HashMap<>();
HashMap<Integer, HashSet<Integer>> dependeciesRelation = new HashMap<>();
for (int i = 0; i < numCourses; i++) {
dependeciesCount.put(i, 0);
dependeciesRelation.put(i, new HashSet<>());
}
for (int i = 0; i < prerequisites.length; i++) {
int pre = prerequisites[i][1];
int suf = prerequisites[i][0];
dependeciesCount.put(suf, dependeciesCount.get(suf) + 1);
}
for (Map.Entry<Integer, Integer> entry : dependeciesCount.entrySet()) {
if (entry.getValue() == 0) {
}
}

int[] index = new int[numCourses];
int currentIndex = 0;
while (!queue.isEmpty()) {
Integer currentCourse = queue.poll();
index[currentIndex] = currentCourse;
currentIndex++;

for (Integer nei : dependeciesRelation.get(currentCourse)) {
if (dependeciesCount.get(nei) > 0) {
dependeciesCount.put(nei, dependeciesCount.get(nei) - 1);
if (dependeciesCount.get(nei) == 0) {
}
}
}

}

int[] empty = {};
return currentIndex == numCourses ? index : empty;
}
``````

## 后记

2019年对我来说是一个新的起点，我也要不停的督促自己好好工作，多反思多学习，以后争取能分享更多高质量的文章和知识。希望自己永远不要忘掉当初雄心壮志面试硅谷公司的那颗赤子之心。