一文带你学会最小生成树,不要等到面试再临时抱佛脚了

你好,我是小黄,一名独角兽企业的Java开发工程师。 感谢茫茫人海中咱们能够相遇, 俗话说:当你的才华和才能,不足以支撑你的梦想的时分,请静下心来学习, 希望优秀的环路复杂度你能够和我一同学习,一同尽力,软件复杂度完成属于自己的梦想。

一、算法导论导言

大家有没有在生活中遇到这种工作

你们java面试题县城需求在几个小区之间进ja算法的时间复杂度取决于va源码网站培训行筑路,因为政府资金紧张,不可能一切的小区之间都进行筑路,而源码精灵永久兑换码是使用最少的资金修源码之家一条能够衔接一切小区的路

如同下图所示:

一文带你学会最小生成树,不要比及面试再临时抱佛脚了

当然,上述仅仅一个抽象化的例子,而咱们实面试技巧和注意事项际生活中,每个小区间的间隔也是不一样的,咱们怎样使用最小的资金去衔接一切的小区呢?

这就牵扯到咱们今天的老大哥们:Kruskal 算法Prim 算法

这两种算法分别从边和点产生最小生成树,确保了资金的最小性

本篇文章,源码网站咱们一同走近 Prim 算法,探究一下该算源码编辑器下载法是怎样经过点来算法的特征确认算法导论最小生成树的算法导论

PS:Kruskal 算法链接:最小生成树——Kruskal 算法

二、Prim 算法是算法剖析的目的是什么

普里姆算法(Prim算法),图论中的一种算法,经过 点去找边源码精灵永久兑换码行为,可在加权复杂度连通图里搜索最小生成树。

该算法于1930年由捷克数学家 沃伊捷赫亚尔尼克 发现;并在1957算法的算法的时间复杂度取决于特征年由美国计算机科学家 罗伯特普里算法的时复杂度怎么计算的刻复杂度取决于 独立发现

咱们以下面的小区为例,经过 Prim 算法会给咱们一条衔接一切小区的最短路径

一文带你学会最小生成树,不要比及面试再临时抱佛脚了

三、Prim 算法本质

对于 Prim 算法来说,整体使用了 贪心 的思维复杂度怎么计算的

一文带你学会最小生成树,不要比及面试再临时抱佛脚了

简单的来说,咱们需求从上述图中随机选择一个点,找到最小的边,然后开释其衔接的点,再去找到最小的边,循环往复……

PS:每个边只入队一次

  • 咱们随机选中 A小区 这个节点,将其一切的边 2、3、6 开释出来,咱们的边集合为 2、3、6,找到最小的边 2 用掉,源码编辑器开释 E小区面试

一文带你学会最小生成树,不要比及面试再临时抱佛脚了

  • 咱们选中 E小区 这个节点,将其一切的边 7、12 开释源码编辑器出来,咱们的边集合为 3java是什么意思、6、7、12,找到最小的边 3 用掉,开释 B小算法工程师

一文带你学会最小生成树,不要比及面试再临时抱佛脚了

  • 咱们选中 B小区 这个节点Java,将算法是指什么其一切的边 10 开释出来,咱们的边集合为 6源码编程器、7源码网站、10、12,找到最小的边 6 用掉,开释 D源码小区

一文带你学会最小生成树,不要比及面试再临时抱佛脚了

  • 咱们选中 D小区 这个节点,将其一切的边 1源码年代 开释出来,咱们的边集合为 1、7、10、12,找到最小的边 1 用掉,开释 C小区

一文带你学会最小生成树,不要比及面试再临时抱佛脚了

这样,咱们一切的点现已算法工程师找出来了源码编程器

能够看到咱们的最小生成树为:12

咱们对比一下源码上期讲到的javascrip圈复杂度t Kru算法设计与剖析skal 算法:Kruskal 算法

一文带你学会最小生成树,不要比及面试再临时抱佛脚了
咱们可源码之家算法以看java模拟器到,得到的算法设计与分析路径都是一样的,源码中的图片证明 Kruskal Prim 算法求出的最小生成java培训树相源码交易平台

四、Prim 算法完成

对于 Pri源码中的图片m源码交易平台 算法,面试技巧首要使用贪心的思维,由点去寻觅边,解锁点的循环…..

4.1 比较器的完成(算法的空间面试技巧和话术大全复杂度是指依照边的权重排序)

public static class MyEdgeComparator implements Comparator<Edge> {
        @Override
        public int compare(Edge o1, Edge o2) {
            return o1.weight - o2.weight;
        }
    }

4.2 Prim 算法

	public Set<Edge> prim(Graph graph) {
        // 解锁的边
        PriorityQueue<Edge> priorityQueue = new PriorityQueue<>(new MyEdgeComparator());
        // 该点是否走过
        Set<Node> setNodeVis = new HashSet<>();
        // 选择的边
        Set<Edge> setEdge = new HashSet<>();
        for (Node node : graph.nodes.values()) {
            // 该点没有被走过
            if (!setNodeVis.contains(node)) {
                // 将该点标记为现已被走过
                setNodeVis.add(node);
                // 参加该点解锁的边
                for (Edge edge : node.edges) {
                    priorityQueue.add(edge);
                }
				// 由边找点
                while (!priorityQueue.isEmpty()) {
                    Edge edge = priorityQueue.poll();
                    Node to = edge.to;
                    // 看当时点是否被拜访过
                    if (!setNodeVis.contains(to)) {
                    	// 终究的结果
                        setEdge.add(edge);
                        // 没有拜访的话,参加拜访标记,并且将其一切的边给放进去
                        setNodeVis.add(to);
                        for (Edge edge1 : to.edges) {
                            priorityQueue.add(edge1);
                        }
                    }
                }
            }
            // 大家能够考虑一下这儿的 break 存在的意义是什么
            break;
        }
        return setEdge;
    }

以上图的描绘均使用源码编辑器下载图的形象化描绘:图的形象化描绘

五、总结

经过以算法的五个特性上的描绘源码网站,咱们能够解决咱们最初java是什么意思说的那面试技巧和注意事项个问题:你们县城需求在几个小区之间进行筑路,因为政府资金紧张,不可能一切的小区之间都进行筑路,而是使用源码精灵永久兑换码最少的资金修一条能够衔接java培训一切小区的路

同时,对于 Pri劳动复杂度m 的源码1688代码也需求多写几遍,多想想 Krusjava模拟器kalPrim 的区别

  • 15java是什么意思84. 衔接一切点的最小费用【模板标题】

对源代码有java模拟器爱好的小伙伴,能够重视 爱敲代码的小黄 公众号,回复:算法源码 即可取得算法java编译器源码

一文带你学会最小生成树,不要比及面试再临时抱佛脚了

回答一下 break 的问题:避免森林现象的存在

面试自我介绍期的内容就到这儿,下期会叙述最短路径 Dijkstra

java模拟器是一名独角兽企业的Java开发工程师,希望能够点个重视呀面试技巧,有问题能够留言或者私信加我java怎样读微信:hls17939源码中的图片29520,咱们下期再会!

发表评论

提供最优质的资源集合

立即查看 了解详情