当前位置: 首页 > news >正文

算法-16-并查集

并查集简介 

并查集:一开始,把a,b,c放入并查集,a自己一个集合,b自己一个,c自己一个

提供的方法        1.boolean isSameSet(a,b),判断ab是否在同一个集合

                          2.void union(a,b),把a所在集合的全部,和b所在集合的全部,两个大集合合并

怎么实现的方法一

对于每个元素,都有一个指针指向自己

 查询a,b是否在同一个集合,对于a,a往上到不能再往上的节点就是他的代表节点,也就是a

b同理,代表节点不同,所以ab所在的集合不同

我们把一个节点往上找,找到不能再往上的那个节点叫集合的代表节点

那如何实现union合并呢

并查集有自己的机制,记录每一个集合大小是多少

然后union(a,e)时,把b的指针直接挂到a后面,union(a,c)时,小的挂到大的上,c挂到a后面

如果再union(b,d)然后union(d,e)怎么union,先顺着d往上找找到b,然后顺着e往上找找到a,小的挂大的,只需改代表节点b->a,欧了

import java.util.HashMap;
import java.util.List;
import java.util.Stack;public class Code05_UnionFind {public static class Node<V> {V value;public Node(V v) {value = v;}}public static class UnionFind<V> {//搞三张表public HashMap<V, Node<V>> nodes;public HashMap<Node<V>, Node<V>> parents;//parent表,key是儿子,value是父亲,儿子父亲一一对应public HashMap<Node<V>, Integer> sizeMap;//代表节点和大小size对应public UnionFind(List<V> values) {//初始化nodes = new HashMap<>();parents = new HashMap<>();sizeMap = new HashMap<>();for (V cur : values) {Node<V> node = new Node<>(cur);nodes.put(cur, node);parents.put(node, node);sizeMap.put(node, 1);}}// 给你一个节点,请你往上到不能再往上,把代表返回//找代表节点要用很多次,所以把一次找一个爹优化成直接找祖宗,沿一条链压入栈,//一个一个弹出,只要不是栈顶就挂到祖宗后面public Node<V> findFather(Node<V> cur) {Stack<Node<V>> path = new Stack<>();while (cur != parents.get(cur)) {path.push(cur);cur = parents.get(cur);}//推出的时候cur = parents.get(cur)while (!path.isEmpty()) {parents.put(path.pop(), cur);}return cur;}public boolean isSameSet(V a, V b) {return findFather(nodes.get(a)) == findFather(nodes.get(b));}public void union(V a, V b) {Node<V> aHead = findFather(nodes.get(a));Node<V> bHead = findFather(nodes.get(b));if (aHead != bHead) {int aSetSize = sizeMap.get(aHead);int bSetSize = sizeMap.get(bHead);Node<V> big = aSetSize >= bSetSize ? aHead : bHead;//就是if(a>b),big=a,small=bNode<V> small = big == aHead ? bHead : aHead;parents.put(small, big);//小集合的头部(父亲)设成大集合sizeMap.put(big, aSetSize + bSetSize);//大集合变大sizeMap.remove(small);}}public int sets() {return sizeMap.size();}}
}

并查集应用

1.表示任务关系,1代表认识,0代表不认识

一定是正方形N*N,且m[i][j]=1,那么m[j][i]=1,大正方形是对称的

求有多少个联通区(朋友圈,互相认识的域)

用并查集,从0开始,0认识2认识4,一合并【0.2.4】,从1开始【1.3】一共两个朋友圈

// 本题为leetcode原题
// 测试链接:https://leetcode.com/problems/friend-circles/
// 可以直接通过
public class Code01_FriendCircles {public static int findCircleNum(int[][] M) {int N = M.length;// 初始化{0} {1} {2} {N-1}每个数据单独成一个集合UnionFind unionFind = new UnionFind(N);for (int i = 0; i < N; i++) {	//行for (int j = i + 1; j < N; j++) {//列,for循环只用便利右上部分,因为1认识2,2就认识1if (M[i][j] == 1) { // i和j互相认识unionFind.union(i, j);//i,j合并}}}return unionFind.sets();}public static class UnionFind {//用数组代替哈希表,更快// parent[i] = k : i的父亲是kprivate int[] parent;// size[i] = k : 如果i是代表节点,size[i]才有意义,否则无意义// i所在的集合大小是多少private int[] size;// 辅助结构,作栈用private int[] help;// 一共有多少个集合private int sets;//初始化public UnionFind(int N) {parent = new int[N];size = new int[N];help = new int[N];sets = N;for (int i = 0; i < N; i++) {parent[i] = i;	//i的父亲节点就是自己size[i] = 1;	//i自己就是代表节点,大小为1}}// 从i开始一直往上,往上到不能再往上,代表节点,返回// 这个过程要做路径压缩private int find(int i) {int hi = 0;while (i != parent[i]) {//i不等于自己的父亲,i往上 help[hi++] = i;//help作栈i = parent[i];}//直到i=parent[i]也就是代表节点了for (hi--; hi >= 0; hi--) {parent[help[hi]] = i;}return i;}public void union(int i, int j) {int f1 = find(i);int f2 = find(j);if (f1 != f2) {if (size[f1] >= size[f2]) {size[f1] += size[f2];parent[f2] = f1;} else {size[f2] += size[f1];parent[f1] = f2;}sets--;}}public int sets() {return sets;}}}

岛问题

给定一个二维数组matrix,里面的值不是1就是0

上或下或左或右相邻的1认为是一片岛

返回matrix中岛的数量,求几片1

思路,从左往右依次遍历,不是1就跳过,是一就调用infection函数,把与这个一相邻的1全部变成2,然后往后走不是1就跳

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Stack;// 本题为leetcode原题
// 测试链接:https://leetcode.com/problems/number-of-islands/
// 所有方法都可以直接通过
public class Code02_NumberOfIslands {public static int numIslands3(char[][] board) {int islands = 0;for (int i = 0; i < board.length; i++) {for (int j = 0; j < board[0].length; j++) {if (board[i][j] == '1') {//遍历,是1岛的数量++然后调用感染函数islands++;infect(board, i, j);}}}return islands;}// 从(i,j)这个位置出发,把所有练成一片的'1'字符,变成0,不是0字符而是0阿斯克码值public static void infect(char[][] board, int i, int j) {if (i < 0 || i == board.length || j < 0 || j == board[0].length || board[i][j] != '1') {return;}board[i][j] = 0;//一定要改,否则无限递归infect(board, i - 1, j);infect(board, i + 1, j);infect(board, i, j - 1);infect(board, i, j + 1);}public static int numIslands1(char[][] board) {int row = board.length;int col = board[0].length;Dot[][] dots = new Dot[row][col];List<Dot> dotList = new ArrayList<>();for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {if (board[i][j] == '1') {dots[i][j] = new Dot();dotList.add(dots[i][j]);}}}UnionFind1<Dot> uf = new UnionFind1<>(dotList);for (int j = 1; j < col; j++) {//第零行没有上,单独拿出来// (0,j)  (0,0)跳过了  (0,1) (0,2) (0,3)if (board[0][j - 1] == '1' && board[0][j] == '1') {//自己是1,右边也是1就合并uf.union(dots[0][j - 1], dots[0][j]);}}for (int i = 1; i < row; i++) {{//第零列没有左,单独拿出来if (board[i - 1][0] == '1' && board[i][0] == '1') {uf.union(dots[i - 1][0], dots[i][0]);}}for (int i = 1; i < row; i++) {//既有左又有上for (int j = 1; j < col; j++) {if (board[i][j] == '1') {if (board[i][j - 1] == '1') {uf.union(dots[i][j - 1], dots[i][j]);}if (board[i - 1][j] == '1') {uf.union(dots[i - 1][j], dots[i][j]);}}}}return uf.sets();}public static class Dot {}public static class Node<V> {V value;public Node(V v) {value = v;}}public static class UnionFind1<V> {public HashMap<V, Node<V>> nodes;public HashMap<Node<V>, Node<V>> parents;public HashMap<Node<V>, Integer> sizeMap;public UnionFind1(List<V> values) {nodes = new HashMap<>();parents = new HashMap<>();sizeMap = new HashMap<>();for (V cur : values) {Node<V> node = new Node<>(cur);nodes.put(cur, node);parents.put(node, node);sizeMap.put(node, 1);}}public Node<V> findFather(Node<V> cur) {Stack<Node<V>> path = new Stack<>();while (cur != parents.get(cur)) {path.push(cur);cur = parents.get(cur);}while (!path.isEmpty()) {parents.put(path.pop(), cur);}return cur;}public void union(V a, V b) {Node<V> aHead = findFather(nodes.get(a));Node<V> bHead = findFather(nodes.get(b));if (aHead != bHead) {int aSetSize = sizeMap.get(aHead);int bSetSize = sizeMap.get(bHead);Node<V> big = aSetSize >= bSetSize ? aHead : bHead;Node<V> small = big == aHead ? bHead : aHead;parents.put(small, big);sizeMap.put(big, aSetSize + bSetSize);sizeMap.remove(small);}}public int sets() {return sizeMap.size();}}public static int numIslands2(char[][] board) {int row = board.length;int col = board[0].length;UnionFind2 uf = new UnionFind2(board);for (int j = 1; j < col; j++) {if (board[0][j - 1] == '1' && board[0][j] == '1') {uf.union(0, j - 1, 0, j);}}for (int i = 1; i < row; i++) {if (board[i - 1][0] == '1' && board[i][0] == '1') {uf.union(i - 1, 0, i, 0);}}for (int i = 1; i < row; i++) {for (int j = 1; j < col; j++) {if (board[i][j] == '1') {if (board[i][j - 1] == '1') {uf.union(i, j - 1, i, j);}if (board[i - 1][j] == '1') {uf.union(i - 1, j, i, j);}}}}return uf.sets();}public static class UnionFind2 {//把二维数组转成一维,对二维数组(i,j)->i*列+jprivate int[] parent;private int[] size;private int[] help;private int col;//列private int sets;//集合数量public UnionFind2(char[][] board) {col = board[0].length;sets = 0;int row = board.length;int len = row * col;//一共有几个数parent = new int[len];size = new int[len];help = new int[len];for (int r = 0; r < row; r++) {//初始化for (int c = 0; c < col; c++) {if (board[r][c] == '1') {int i = index(r, c);parent[i] = i;size[i] = 1;sets++;}}}}// (r,c) -> i,用i代替(r,c)private int index(int r, int c) {//r行c列对应的下标return r * col + c;}// 原始位置 -> 下标private int find(int i) {int hi = 0;while (i != parent[i]) {help[hi++] = i;i = parent[i];}for (hi--; hi >= 0; hi--) {parent[help[hi]] = i;}return i;}public void union(int r1, int c1, int r2, int c2) {int i1 = index(r1, c1);int i2 = index(r2, c2);int f1 = find(i1);int f2 = find(i2);if (f1 != f2) {if (size[f1] >= size[f2]) {size[f1] += size[f2];parent[f2] = f1;} else {size[f2] += size[f1];parent[f1] = f2;}sets--;}}public int sets() {return sets;}}// 为了测试public static char[][] generateRandomMatrix(int row, int col) {char[][] board = new char[row][col];for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {board[i][j] = Math.random() < 0.5 ? '1' : '0';}}return board;}// 为了测试public static char[][] copy(char[][] board) {int row = board.length;int col = board[0].length;char[][] ans = new char[row][col];for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {ans[i][j] = board[i][j];}}return ans;}// 为了测试public static void main(String[] args) {int row = 0;int col = 0;char[][] board1 = null;char[][] board2 = null;char[][] board3 = null;long start = 0;long end = 0;row = 1000;col = 1000;board1 = generateRandomMatrix(row, col);board2 = copy(board1);board3 = copy(board1);System.out.println("感染方法、并查集(map实现)、并查集(数组实现)的运行结果和运行时间");System.out.println("随机生成的二维矩阵规模 : " + row + " * " + col);start = System.currentTimeMillis();System.out.println("感染方法的运行结果: " + numIslands3(board1));end = System.currentTimeMillis();System.out.println("感染方法的运行时间: " + (end - start) + " ms");start = System.currentTimeMillis();System.out.println("并查集(map实现)的运行结果: " + numIslands1(board2));end = System.currentTimeMillis();System.out.println("并查集(map实现)的运行时间: " + (end - start) + " ms");start = System.currentTimeMillis();System.out.println("并查集(数组实现)的运行结果: " + numIslands2(board3));end = System.currentTimeMillis();System.out.println("并查集(数组实现)的运行时间: " + (end - start) + " ms");System.out.println();row = 10000;col = 10000;board1 = generateRandomMatrix(row, col);board3 = copy(board1);System.out.println("感染方法、并查集(数组实现)的运行结果和运行时间");System.out.println("随机生成的二维矩阵规模 : " + row + " * " + col);start = System.currentTimeMillis();System.out.println("感染方法的运行结果: " + numIslands3(board1));end = System.currentTimeMillis();System.out.println("感染方法的运行时间: " + (end - start) + " ms");start = System.currentTimeMillis();System.out.println("并查集(数组实现)的运行结果: " + numIslands2(board3));end = System.currentTimeMillis();System.out.println("并查集(数组实现)的运行时间: " + (end - start) + " ms");}}

拓展:如果matrix极大 设计一种可行的并行方案

空降问题 

 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;// 本题为leetcode原题
// 测试链接:https://leetcode.com/problems/number-of-islands-ii/
// 所有方法都可以直接通过
public class Code03_NumberOfIslandsII {public static List<Integer> numIslands21(int m, int n, int[][] positions) {UnionFind1 uf = new UnionFind1(m, n);List<Integer> ans = new ArrayList<>();for (int[] position : positions) {ans.add(uf.connect(position[0], position[1]));}return ans;}public static class UnionFind1 {private int[] parent;private int[] size;//区别,变化之后不在抹去size,因为要用size做标记//size=0代表没有初始化过,没有空降过1private int[] help;private final int row;private final int col;private int sets;public UnionFind1(int m, int n) {row = m;col = n;sets = 0;int len = row * col;parent = new int[len];size = new int[len];help = new int[len];}private int index(int r, int c) {return r * col + c;}private int find(int i) {int hi = 0;while (i != parent[i]) {help[hi++] = i;i = parent[i];}for (hi--; hi >= 0; hi--) {parent[help[hi]] = i;}return i;}private void union(int r1, int c1, int r2, int c2) {if (r1 < 0 || r1 == row || r2 < 0 || r2 == row || c1 < 0 || c1 == col || c2 < 0 || c2 == col) {return;//检查越界}int i1 = index(r1, c1);int i2 = index(r2, c2);if (size[i1] == 0 || size[i2] == 0) {return;}int f1 = find(i1);int f2 = find(i2);if (f1 != f2) {if (size[f1] >= size[f2]) {size[f1] += size[f2];parent[f2] = f1;} else {size[f2] += size[f1];parent[f1] = f2;}sets--; }public int connect(int r, int c) {int index = index(r, c);if (size[index] == 0) {//为零代表第一次来到这个位置 parent[index] = index;size[index] = 1;sets++;union(r - 1, c, r, c);union(r + 1, c, r, c);union(r, c - 1, r, c);union(r, c + 1, r, c);}return sets;}}// 课上讲的如果m*n比较大,会经历很重的初始化,而k比较小,怎么优化的方法public static List<Integer> numIslands22(int m, int n, int[][] positions) {UnionFind2 uf = new UnionFind2();List<Integer> ans = new ArrayList<>();for (int[] position : positions) {ans.add(uf.connect(position[0], position[1]));}return ans;}public static class UnionFind2 {//m*n很大,key相对不大private HashMap<String, String> parent;//字符串他爹private HashMap<String, Integer> size;private ArrayList<String> help;private int sets;public UnionFind2() {parent = new HashMap<>();size = new HashMap<>();help = new ArrayList<>();sets = 0;}private String find(String cur) {while (!cur.equals(parent.get(cur))) {help.add(cur);cur = parent.get(cur);}for (String str : help) {parent.put(str, cur);}help.clear();return cur;}private void union(String s1, String s2) {if (parent.containsKey(s1) && parent.containsKey(s2)) {String f1 = find(s1);String f2 = find(s2);if (!f1.equals(f2)) {int size1 = size.get(f1);int size2 = size.get(f2);String big = size1 >= size2 ? f1 : f2;String small = big == f1 ? f2 : f1;parent.put(small, big);size.put(big, size1 + size2);sets--;}}}public int connect(int r, int c) {String key = String.valueOf(r) + "_" + String.valueOf(c);if (!parent.containsKey(key)) {//之前没空降过的parent.put(key, key);size.put(key, 1);sets++;String up = String.valueOf(r - 1) + "_" + String.valueOf(c);String down = String.valueOf(r + 1) + "_" + String.valueOf(c);String left = String.valueOf(r) + "_" + String.valueOf(c - 1);String right = String.valueOf(r) + "_" + String.valueOf(c + 1);union(up, key);union(down, key);union(left, key);union(right, key);}return sets;}}}

 

相关文章:

算法-16-并查集

并查集简介 并查集&#xff1a;一开始&#xff0c;把a&#xff0c;b&#xff0c;c放入并查集&#xff0c;a自己一个集合&#xff0c;b自己一个&#xff0c;c自己一个 提供的方法 1.boolean isSameSet(a,b)&#xff0c;判断ab是否在同一个集合 2.void union(a,b),把a所…...

【C/C++】2024春晚刘谦春晚魔术步骤模拟+暴力破解

在这个特别的除夕夜&#xff0c;我们不仅享受了与家人的温馨团聚&#xff0c;还被电视机前的春节联欢晚会深深吸引。特别是&#xff0c;魔术师刘谦的精彩表演&#xff0c;为我们带来了一场视觉和心灵的盛宴。在我的博客“【C/C】2024春晚刘谦春晚魔术步骤模拟暴力破解”中&…...

Java运算符和表达式

Java运算符和表达式 和C语言一样&#xff0c;java也有基础的运算符和表达式&#xff0c;用来完成一些基础的数学计算&#xff0c;以及逻辑运算&#xff0c;我们一起来学习一下吧。 算数运算符 首先&#xff0c;这个算数运算符与数学中即C语言的运算符的功能一样&#xff0c;利…...

波奇学Linux:软硬链接

ln指令建立链接 软链接 硬链接 所属者的前的数字表示硬链接数&#xff0c;引用计数&#xff0c;file.txt和soft_link是软链接所以都为2 软链接有独立inode&#xff0c;硬链接没有&#xff0c;所以硬链接不是独立文件&#xff0c;软链接是独立文件&#xff0c;且硬链接的属性会…...

HTTP网络通信协议基础

目录 前言&#xff1a; 1.HTTP协议理论 1.1协议概念 1.2工作原理 1.3工作场景 2.HTTP抓包工具 2.1Fiddler工具 2.2抓包原理 2.3抓包结果 3.HTTP协议格式 3.1HTTP请求 3.2HTTP响应 3.3格式总结 前言&#xff1a; 在了解完网络编程的传输层UDP和TCP通信协议后&#…...

Java实现河南软件客服系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、系统展示四、核心代码4.1 查询客户4.2 新增客户跟进情况4.3 查询客户历史4.4 新增服务派单4.5 新增客户服务费 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的河…...

【小沐学GIS】基于C++QT绘制三维数字地球Earth(OpenGL)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第二期3【小沐…...

如何生成生成一个修仙世界的狗血短剧剧本

如何生成生成一个修仙世界的狗血短剧剧本 生成一个修仙世界的狗血短剧剧本将上述剧本转为对话 生成一个修仙世界的狗血短剧剧本 剧本名称&#xff1a;《仙途情缘》 角色&#xff1a; 易天行&#xff1a;男主角&#xff0c;天赋异禀的修仙者&#xff0c;性格坚毅&#xff0c;正…...

【MIMO】

MIMO技术入门 1.简介 MIMO(多入多出):多天线技术。 注意&#xff1a;此处的多天线&#xff0c;并不是有多个天线板&#xff0c;对基站来讲指天线有多套振子&#xff08;每一套振子都可以看成一个独立的天线&#xff09;。 4G 8天线&#xff1b;5G 64T64R&#xff1b;不仅基站…...

ZooKeeper分布式锁

ZooKeeper是一个开源的分布式协调服务&#xff0c;它主要用于维护配置信息、提供分布式同步、命名服务等。ZooKeeper的数据模型类似于文件系统&#xff0c;它的数据结构中的每个数据节点称为znode&#xff0c;可以用它来实现分布式锁。 ZooKeeper分布式锁的原理&#xff1a; …...

WPF是不是垂垂老矣啦?平替它的框架还有哪些

WPF&#xff08;Windows Presentation Foundation&#xff09;是微软推出的一种用于创建 Windows 应用程序的用户界面框架。WPF最初是在2006年11月推出的&#xff0c;它是.NET Framework 3.0的一部分&#xff0c;为开发人员提供了一种基于 XAML 的方式来构建丰富的用户界面。 W…...

浅析Linux追踪技术之ftrace:Tracepoint

文章目录 概述Tracepoint使用定义Tracepoint添加Tracepoint调用 Tracepoint数据结构TRACE_EVENT实现DECLARE_TRACE__DECLARE_TRACE trace_xxx函数相关参考 概述 Tracepoint&#xff08;跟踪点&#xff09;是添加到代码流程中的调用点&#xff0c;并且允许开发者注册自定义的回…...

python ftp文件断点续传 并判断ftp文件下载完成

在Python中实现FTP文件的断点续传&#xff0c;通常涉及到以下步骤&#xff1a; 连接到FTP服务器。获取远程文件的大小。检查本地文件是否存在以及它的大小。如果本地文件不存在或大小小于远程文件&#xff0c;从上次中断的位置开始下载。下载完成后&#xff0c;检查文件大小以…...

SpringBoot+Vue3 完成小红书项目

简介 该项目采用微服务架构&#xff0c;实现了前后端分离的系统设计。在前端&#xff0c;我们选择了 Vue3 配合 TypeScript 和 ElementUi 框架&#xff0c;以提升开发效率和用户体验。而在后端&#xff0c;则是运用 SpringBoot 和 Mybatis-plus 进行开发&#xff0c;保证了系统…...

springboot集成Sa-Token及Redis的redisson客户端

文章目录 什么是Sa-Token?为什么集成Redis的redisson客户端?如何集成?maven依赖application.yml配置过滤器配置验证参考什么是Sa-Token? Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权…...

SQL世界之命令语句Ⅴ

目录 一、SQL CREATE INDEX 语句 1.SQL CREATE INDEX 语句 2.SQL CREATE INDEX 语法 3.SQL CREATE UNIQUE INDEX 语法 4.SQL CREATE INDEX 实例 二、SQL 撤销索引、表以及数据库 1.SQL DROP INDEX 语句 2.SQL DROP TABLE 语句 3.SQL DROP DATABASE 语句 4.SQL TRUNCA…...

Springboot拦截器中跨域失效的问题、同一个接口传入参数不同,一个成功,一个有跨域问题、拦截器和@CrossOrigin和@Controller

Springboot拦截器中跨域失效的问题 一、概述 1、具体场景 起因&#xff1a; 同一个接口&#xff0c;传入不同参数进行值的修改时&#xff0c;一个成功&#xff0c;另一个竟然失败&#xff0c;而且是跨域问题拦截器内的request参数调用getHeader方法时&#xff0c;获取不到前端…...

WordPress如何自建txt文本经典语录并随机显示一句话经典语录?

前面跟大家分享的『WordPress集成一言&#xff08;Hitokoto&#xff09;API经典语句功能』一文中就提供有自创API&#xff0c;其中懿古今顶部左上角显示的经典语录用的就是自建一个txt文本文件&#xff0c;然后再在前端网页指定位置随机显示语录。具体操作方法如下&#xff1a;…...

Java中JVM常用参数配置(提供配置示例)

目录 前言一、内存参数配置二、垃圾收集器配置三、GC策略配置3.1、基础通用配置3.2、Parallel 和 Parallel Old 常用参数配置3.3、CMS 常用参数配置3.4、G1 常用参数配置 四、GC日志配置五、dump 日志参数配置5.1、OutOfMemory异常时生成dump文件5.2、发生Full GC时生成dump文件…...

图论与图数据应用综述:从基础概念到知识图谱与图智能

目录 前言1 图论基础概念1.1 节点度1.2 度分布1.3 邻接矩阵 2 探索图的高级概念2.1 最短路径的关键性2.2 图的直径与平均路径的意义2.3 循环与路径类型的多样性 3 深入探讨图的广泛应用领域3.1 知识图谱的知识管理3.2 图智能在复杂决策中的应用3.3 图数据挖掘与分析的多领域应用…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...