• jav实现有向无环图拓扑排序


    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Graph {
        private Set<String> nodes;
        private List<Pair<String, String>> table;
    
        public void remove(String node) {
            this.nodes.remove(node);
            table.removeIf(pair -> pair.getFrom().equals(node) || pair.getTo().equals(node));
    
    
        }
    
        public static void main(String[] args) {
            Set<String> nodes = Sets.newHashSet("A", "B", "C", "D", "E", "F", "G");
            List<String> edges = Lists.newArrayList("G->E", "G->F", "E->D", "F->C","C->B", "C->A","B->A");
    
            List<Pair<String, String>> pairList = edges.stream().map(edge -> {
                String[] split = edge.split("->");
                String start = split[0];
                String end = split[1];
                return new Pair<>(start, end);
            }).collect(Collectors.toList());
    
            Graph graph = new Graph(nodes, pairList);
            Map<String, Integer> inDegree = getInDegree(graph);
            System.out.println(inDegree);
            List<String> priority = findPriority(graph);
            System.out.println(priority);
    
    
        }
    
    
        /**
         * 获取图中节点的入度
         * @param graph
         * @return
         */
        public static Map<String, Integer> getInDegree(Graph graph) {
            Set<String> nodes = graph.getNodes();
            List<Pair<String, String>> connectTable = graph.getTable();
            Map<String, Integer> map = new ConcurrentHashMap<>();
            for (String node : nodes) {
                map.put(node,0);
            }
    
            for (Pair<String, String> pair : connectTable) {
                map.computeIfPresent(pair.getTo(), (k, v) -> v + 1);
            }
            return map;
        }
    
        /**
         * 始终寻找入度为0的点,直到所有节点加入结果队列
         * @param graph
         * @return
         */
        public static List<String> findPriority(Graph graph) {
            List<String> list = new ArrayList<>();
            Set<String> nodes = graph.getNodes();
            Map<String, Integer> inDegree = getInDegree(graph);
            int size = nodes.size();
            int count=0;
            while (count<size&&inDegree.keySet().size()!=0) {
                System.out.println(inDegree);
                for (Map.Entry<String, Integer> entry : inDegree.entrySet()) {
                    String key = entry.getKey();
                    if (entry.getValue() == 0) {
                        list.add(key);
                        count++;
                        graph.remove(key);
                        inDegree = getInDegree(graph);
                    }
                }
    
            }
            return list;
        }
    }
  • 相关阅读:
    欠拟合、过拟合、偏差、方差
    softmax详解
    解决Windows 10笔记本接显示器分屏后没有声音的问题
    图像的表示与通道数问题
    从梯度下降到反向传播(附计算例子)
    NuGet的简单使用
    深度神经网络(DNN)是否模拟了人类大脑皮层结构?
    范数(norm) 几种范数的简单介绍
    js 页码分页的前端写法
    前端使用注意事项
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15363604.html
Copyright © 2020-2023  润新知