美文网首页数据结构与算法
数据结构第二季 Day10 图 Kruskal算法

数据结构第二季 Day10 图 Kruskal算法

作者: 望穿秋水小作坊 | 来源:发表于2021-10-13 15:38 被阅读0次

    1、在 java 中如何优雅一些从 set 或者 map 中随机获取一个元素?

    Iterator<Vertex<V, E>> it = vertices.values().iterator();
    if (!it.hasNext()) return null;
    Vertex<V, E> vertex = it.next();
    

    2、从一堆数据中选最大值、最小值第一反应是什么???在 java 中自带二叉堆的数据结构是什么?

    • 二叉堆、大顶堆、小顶堆
    • java 中自带实现二叉堆功能的是优先级队列 PriorityQueue

    3、Java 中一个要实现一个 interface 用什么关键字?一个类要继承一个 abstract class 用什么关键字?

    • implement xxxInterface 实现接口
    • extends xxxClass 继承类

    4、Kruskal 算法 - 执行过程(能口述即可)?

    • ①从剩余边(一开始是所有边)中选择权重最小的边
    • ②如果取得的边,加入最小生成树数组中,如果不会构成环,就加入。否则就废弃
    • ③重复①②操作,直到选出 n-1 条边
    image.png
    image.png

    5、为什么会想到使用并查集解决这个问题?

    • 有孤岛、连通、查是否同一集合等概念
    • 所以就有点并查集的意思了

    6、为什么会想到使用最小堆呢?

    • 因为从一个不断剩余的数据中,拿出最小值的过程
    • 是二叉堆最擅长的事情

    7、自己尝试分析下两个算法的时间复杂度

    • 最终分析时间复杂度都是 O(ElogE)

    8、Kruskal 算法的代码实现

        private Set<EdgeInfo<V, E>> kruskal() {
            int vertexCount = verticesSize() - 1;
            if (vertexCount < 1) return null;
            Set<EdgeInfo<V, E>> edgeInfos = new HashSet<>();
            MinHeap<Edge<V, E>> heap = new MinHeap<>(edges, edgeComparator);
            UnionFind<Vertex<V, E>> unionFind = new UnionFind<>();
            vertices.forEach((V v, Vertex<V, E> vertex) -> {
                unionFind.makeSet(vertex);
            });
            while (!heap.isEmpty() && edgeInfos.size() < vertexCount) {
                Edge<V, E> edge = heap.remove();
                if (unionFind.isSame(edge.from, edge.to)) continue;
                unionFind.union(edge.from, edge.to);
                edgeInfos.add(edge.info());
            }
    
            return edgeInfos;
        }
    

    相关文章

      网友评论

        本文标题:数据结构第二季 Day10 图 Kruskal算法

        本文链接:https://www.haomeiwen.com/subject/jateoltx.html