数据结构与算法

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

2021-10-13  本文已影响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 中自带二叉堆的数据结构是什么?

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

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

image.png
image.png

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

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

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

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;
    }
上一篇下一篇

猜你喜欢

热点阅读