Java的KruskaI知识点(含面试大厂题和源码)

Kruskal算法是用于在加权无向图中找到最小生成树的一种算法。与Prim算法不同,Kruskal算法是一种基于边的贪心算法,它在构建最小生成树的过程中逐步添加边。以下是Kruskal算法的一些关键知识点:

1. 算法概述

Kruskal算法从考虑所有边的集合开始,按照边的权重从小到大排序。然后,依次添加权重最小的边,同时确保添加的边不会与已添加的边形成环。这个过程一直持续到所有顶点都被连接起来,或者所有的边都被考虑过。

2. 算法步骤

  1. 将图中所有的边按权重从小到大排序。
  2. 初始化森林,森林中每个顶点自成一个单独的树。
  3. 遍历排序后的边,对于每条边:
    a. 检查当前边的两个顶点是否属于同一棵树(即是否已经在同一个连通分量中)。
    b. 如果不属于同一棵树,则添加这条边,即将两个顶点所在的树合并。
    c. 如果属于同一棵树,则忽略这条边,以避免形成环。
  4. 当所有顶点都连接在一起时,算法结束。

3. 数据结构

Kruskal算法通常使用并查集数据结构来高效地检测环和合并树。并查集可以在接近O(1)的时间复杂度内确定两个顶点是否在同一个集合中,并且可以将两个集合合并为一个。

4. 时间复杂度

Kruskal算法的时间复杂度主要由排序步骤和并查集操作决定。排序边的时间复杂度为O(E log E),其中E是边的数量。并查集的合并和查找操作的时间复杂度接近O(α(n)),其中α(n)是阿克曼函数的反函数,对于大多数实际输入,可以认为α(n)接近于O(1)。因此,算法的总体时间复杂度接近O(E log E)。

5. 空间复杂度

Kruskal算法的空间复杂度主要由存储边和并查集的数据结构决定。存储边的空间复杂度为O(E),而并查集的空间复杂度为O(V),其中V是顶点的数量。

6. 算法适用性

Kruskal算法适用于稀疏图,即边的数量远小于顶点数量的平方的图。这是因为在稀疏图中,边的数量较少,排序边的步骤不会成为算法的瓶颈。

7. 实现示例

以下是使用Java实现Kruskal算法的一个简单示例:

import java.util.*;public class KruskalMST {private class Edge implements Comparable<Edge> {int src, dest, weight;public Edge(int src, int dest, int weight) {this.src = src;this.dest = dest;this.weight = weight;}@Overridepublic int compareTo(Edge compareEdge) {return this.weight - compareEdge.weight;}}public List<Edge> findMST(int V, int E, int[][] graph) {List<Edge> mst = new ArrayList<>();PriorityQueue<Edge> edgeList = new PriorityQueue<>();int[] parent = new int[V];for (int i = 0; i < V; i++) {parent[i] = i;}for (int i = 0; i < E; i++) {edgeList.add(new Edge(graph[i][0], graph[i][1], graph[i][2]));}while (!edgeList.isEmpty() && mst.size() < V - 1) {Edge nextEdge = edgeList.poll();int x = find(parent, nextEdge.src);int y = find(parent, nextEdge.dest);if (x != y) {mst.add(new Edge(nextEdge.src, nextEdge.dest, nextEdge.weight));union(parent, x, y);}}return mst;}private int find(int[] parent, int i) {if (parent[i] != i) {parent[i] = find(parent, parent[i]);}return parent[i];}private void union(int[] parent, int x, int y) {int xroot = find(parent, x);int yroot = find(parent, y);parent[xroot] = yroot;}
}

通过掌握这些知识点,你可以更好地理解和实现Kruskal算法,从而在面试中解决相关的图论问题。

题目 1:合并两个有序数组

问题描述:给定两个有序整数数组 nums1nums2,请你将 nums2 合并到 nums1 中,使得最终数组仍然是有序的。初始化 nums1nums2 的元素个数分别为 mn。你可以假设 nums1 的空间足够容纳另外 n 个元素,即如果 nums1 的长度为 m,那么你可以假设 nums1 的长度至少为 m + n

解决方案:从两个数组的末尾开始比较元素大小,将较大的元素放到 nums1 的末尾,直到 nums2 被完全合并。

Java 源码

public class MergeSortedArray {public void merge(int[] nums1, int m, int[] nums2, int n) {int i = m - 1; // nums1 的最后一个元素的索引int j = n - 1; // nums2 的最后一个元素的索引int k = m + n - 1; // 合并后数组的最后一个元素的索引while (i >= 0 && j >= 0) {if (nums1[i] > nums2[j]) {nums1[k--] = nums1[i--];} else {nums1[k--] = nums2[j--];}}while (j >= 0) {nums1[k--] = nums2[j--];}}
}

题目 2:最长公共前缀

问题描述:编写一个函数来查找字符串数组中的最长公共前缀。

解决方案:如果不存在公共前缀,返回空字符串。可以先按字典序排序这个数组,然后比较第一个和最后一个字符串。

Java 源码

public class LongestCommonPrefix {public String longestCommonPrefix(String[] strs) {if (strs == null || strs.length == 0) {return "";}Arrays.sort(strs);return longestCommonPrefix(strs[0], strs[strs.length - 1]);}private String longestCommonPrefix(String s1, String s2) {int minLength = Math.min(s1.length(), s2.length());StringBuilder sb = new StringBuilder();for (int i = 0; i < minLength; i++) {if (s1.charAt(i) != s2.charAt(i)) {return sb.toString();}sb.append(s1.charAt(i));}return sb.toString();}
}

题目 3:有效的括号

问题描述:给定一个只包括 '('')''{''}''['']' 的字符串 s,判断字符串是否有效。

解决方案:使用栈数据结构,遇到左括号就入栈,遇到右括号就出栈,如果栈为空或者最后栈中还有元素,则字符串无效。

Java 源码

import java.util.Stack;public class ValidParentheses {public boolean isValid(String s) {Stack<Character> stack = new Stack<>();for (char c : s.toCharArray()) {if (c == '(' || c == '{' || c == '[') {stack.push(c);} else if (c == ')' || c == '}' || c == ']') {if (stack.isEmpty()) {return false;}char top = stack.pop();if ((c == ')' && top == '(') || (c == '}' && top == '{') || (c == ']' && top == '[')) {continue;} else {return false;}}}return stack.isEmpty();}
}

这些题目涵盖了数组操作、字符串处理和栈等常见的数据结构和算法知识点,是面试中常见的问题类型。在准备面试时,理解和掌握这些问题的解决方法对于成功通过技术面试至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python plotly库介绍】从视觉到洞见:桑基图在业务分析中的应用【保姆级教程过于详细珍藏版】

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 本文结构&#xff1a;工具介绍python实现库 - 案例 - 分析思路与过程 实战专栏&#xff1a;https://blog.csdn.net/cciehl/category_12615648.html 备注说明&#xff1a; 企业…

2024软件设计师备考讲义——(7)

数据库技术 一、数据库基础 1.数据库系统 DB、DBS、DBA、DBMS 2.三级模式两级映像 内模式 物理存储 概念模式 基本表 外模式 用户使用应用程序&#xff0c;视图级别 外模式-概念模式的映像 表和视图之间的映射若表中数据变化&#xff0c;只要修改映射&#xff0c;不用改程序…

vue使用el-upload上传,上传错误文件,名称还会显示

vue使用el-upload上传&#xff0c;上传错误文件&#xff0c;名称还会显示 背景&#xff1a;上传不符合后缀的文件&#xff0c;但是还是在页面中显示&#xff0c;使用的是http-request方法 代码&#xff1a; <el-upload multiple class"avatar-uploader" action…

【八股03.29】

【八股03.29】 1.内存泄漏&#xff1f;野指针&#xff1f;悬挂指针&#xff1f; 什么是内存泄漏&#xff1f; 内存泄漏是指程序运行过程中申请的动态分配的堆内存没有被释放&#xff0c;造成系统内存浪费&#xff0c;运行速度减慢甚至崩溃等严重后果。 如何避免&#xff1f;…

DARTS-PT: RETHINKING ARCHITECTURE SELECTION IN DIFFERENTIABLE NAS

Rethinking Architecture Selection in Differentiable NAS 论文链接&#xff1a;https://arxiv.org/abs/2108.04392v1 项目链接&#xff1a;https://github.com/ruocwang/darts-pt ABSTRACT 可微架构搜索(Differentiable Neural Architecture Search, NAS)是目前最流行的网…

光耦合器电路基本概述

在当今快速发展的技术环境中&#xff0c;光耦合器电路在确保电信号跨隔离电路的无缝传输方面发挥着关键作用。这些半导体器件通常被称为光电隔离器&#xff0c;具有许多优点&#xff0c;包括电路隔离、信号传输和精确的电路控制。然而&#xff0c;如果不全面了解市场上各种光耦…

Python批量提取pdf首页并合并为一个文件

前情提要&#xff1a;python安装pypdf2包 pip install pypdf2 第一种&#xff1a;既需要每一个单独的首页&#xff0c;也需要将首页合并。 整体操作思路&#xff0c;将文件夹下面原本的每一个pdf获取第一页&#xff0c;然后再写出&#xff0c;将其放在FirstPage文件夹下。再…

Verilog语法之always语句学习

always语法是Verilog_HDL中最常用的一种语法。 always过程语句和语句块组成的&#xff0c;语法格式如下所示。 always(敏感信号1 or 敏感信号2.....) always实现组合逻辑和时序逻辑。用always实现组合逻辑要将所有的敏感信号加入敏感列表中&#xff1b;用always实现时序逻辑时…

vue 窗口内容滚动到底部

onMounted(() > {scrollToBottom() }) // 滚动到底部方法 const scrollToBottom () > {// 获取聊天窗口容器let chatRoom: any document.querySelector(".chat-content");// 滚动到容器底部chatRoom.scrollTop chatRoom.scrollHeight; } 效果 聊天窗口代码…

aeon,一个好用的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个好用的 Python 库 - aeon Github地址&#xff1a;https://github.com/aeon-toolkit/aeon 在现代计算机科学和人工智能领域&#xff0c;处理时间序列数据是一个重要而复杂的任务。Python aeon库…

npm install 报错ERESOLVE unable to resolve dependency tree

描述&#xff1a;npm install 报错ERESOLVE unable to resolve dependency tree 解决方案&#xff1a; npm install --legacy-peer-deps

深入MNN:开源深度学习框架的介绍、安装与编译指南

引言 在人工智能的世界里&#xff0c;深度学习框架的选择对于研究和应用的进展至关重要。MNN&#xff0c;作为一个轻量级、高效率的深度学习框架&#xff0c;近年来受到了众多开发者和研究人员的青睐。它由阿里巴巴集团开源&#xff0c;专为移动端设备设计&#xff0c;支持跨平…

gateway 分发时若两个服务的路由地址一样,怎么指定访问想要的服务下的地址

1.思路 在使用Spring Cloud Gateway时&#xff0c;如果两个服务的路由地址相同&#xff0c;可以通过Predicate&#xff08;断言&#xff09;和Filter&#xff08;过滤器&#xff09;的组合来实现根据请求的不同条件将请求分发到不同的服务下的地址。 使用Predicate进行路由条件…

sync包常用并发安全数据结构

sync.WaitGroup 使用 sync.WaitGroup用于等待一组goroutine完成。Add方法设置计数器&#xff0c;Done方法减少计数器&#xff0c;Wait方法阻塞直到计数器为0。 package mainimport ("fmt""sync""time" )func worker(id int, wg *sync.WaitGroup…

Hive窗口函数笔试题(面试题)

Hive笔试题实战 短视频 题目一&#xff1a;计算各个视频的平均未完播率 有用户-视频互动表tb_user_video_log&#xff1a; id uid video_id start_time end_time if_follow if_like if_retweet comment_id 1 101 2001 2021-10-01 10:00:00 2021-10-01 10:00:30…

使用mysql官网软件包安装mysql

确定你的操作系统&#xff0c;我的是Centos myqsl 所有安装包的地址&#xff1a;https://repo.mysql.com/yum/ 如果你是使用rpm安装你可以到对应的版本里面找到对应的包。 mysql 发行包的地址&#xff1a;http://repo.mysql.com/ 在这里你可以找到对应的发布包安装。 这里使用y…

TCP/IP 网络模型有哪几层?(计算机网络)

应用层 为用户提供应用功能 传输层 负责为应用层提供网络支持 使用TCP和UDP 当传输层的数据包大小超过 MSS&#xff08;TCP 最大报文段长度&#xff09; &#xff0c;就要将数据包分块&#xff0c;这样即使中途有一个分块丢失或损坏了&#xff0c;只需要重新发送这一个分块…

【2】单链表

【2】单链表 1、单链表2、单链表的设计3、接口设计4、SingleLinkedList5、node(int index) 返回索引位置的节点6、clear()7、添加8、删除9、indexOf(E element) 1、单链表 &#x1f4d5;动态数组有个明显的缺点 &#x1f58a; 可能会造成内存空间的大量浪费 &#x1f4d5; 能否…

基于pear-admin-flask 的 flask 使用教程

我最近接触到了一个极为出色的Flask后台库——pear-admin-flask&#xff0c;这个库具有很高的二次开发价值。借此机会学习并吸收其中Flask开发的一些高级技巧。 1. flask 自定义命令 pear-admin-flask/applications/common/script/admin.py from flask.cli import AppGroup …

CUDA从入门到放弃(十四):CUDA Thrust库

CUDA从入门到放弃&#xff08;十四&#xff09;&#xff1a;CUDA Thrust库 Thrust 是一个基于标准模板库&#xff08;STL&#xff09;的 C 模板库&#xff0c;专为 CUDA 设计&#xff0c;旨在简化高性能并行应用的开发。它提供了一系列数据并行原语&#xff0c;如扫描、排序和…