当前位置: 首页 > 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 图数据挖掘与分析的多领域应用…...

2026年数字人拍摄新方式:一条视频能省多少时间

2026年数字人拍摄新方式&#xff1a;一条视频能省多少时间 【导语】 做视频最耗时间的是什么&#xff1f;不是拍摄那几分钟&#xff0c;而是前期的准备工作。但现在有一种新方式&#xff0c;可以让你完全不用拍摄真人&#xff0c;一条视频从准备到成片&#xff0c;最快只要7分钟…...

国内开通 GPT 会员的自助充值流程记录

国内用户开通 GPT Plus / Pro&#xff0c;比较常见的卡点是支付方式、流程步骤和账号安全。我看了下 cdk.hohy6.com 这个页面&#xff0c;它的流程比较直接&#xff1a;选择套餐&#xff0c;填写 Session Token&#xff0c;支付宝付款&#xff0c;然后系统为自己的 ChatGPT 账号…...

时间序列预测损失函数全解析:从MSE到分位数损失的选择指南

1. 项目概述&#xff1a;为什么时间序列预测的损失函数值得深究&#xff1f;做时间序列预测&#xff0c;无论是金融市场的股价波动、电商平台的销量起伏&#xff0c;还是工业设备的传感器读数&#xff0c;我们最终都要面对一个核心问题&#xff1a;如何衡量模型预测得好不好&am…...

4种颠覆性组合:重构Pixelle-Video的模块化潜能

4种颠覆性组合&#xff1a;重构Pixelle-Video的模块化潜能 【免费下载链接】Pixelle-Video &#x1f680; AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video 想象一下&#xff1a;输入&qu…...

零成本获取全球股票数据:AKShare开源金融数据接口完整指南

零成本获取全球股票数据&#xff1a;AKShare开源金融数据接口完整指南 【免费下载链接】akshare AKShare is an elegant and simple financial data interface library for Python, built for human beings! 开源财经数据接口库 项目地址: https://gitcode.com/gh_mirrors/ak…...

对抗攻击下SGD收敛性分析与量子计算优化

1. 对抗攻击下的随机梯度下降收敛性解析随机梯度下降&#xff08;Stochastic Gradient Descent, SGD&#xff09;作为机器学习优化的核心算法&#xff0c;其鲁棒性在对抗环境下显得尤为重要。当梯度估计被恶意扰动时&#xff0c;传统收敛理论需要重新审视。我们通过引入攻击误差…...

从沙子到车辙(3.3):数据通路与控制器的“双人舞“

3.3 数据通路与控制器的"双人舞" &#x1f4da; 本文内容摘自本人的开源书《从沙子到车辙 - 一个工程师的理解》 &#x1f517; 在线阅读/下载&#xff1a;from-sand-to-ruts git clone https://github.com/Lularible/from-sand-to-ruts⭐ 如果对您有帮助&#xf…...

CANN/catlass精度分析基础

精度分析基础 【免费下载链接】catlass 本项目是CANN的算子模板库&#xff0c;提供NPU上高性能矩阵乘及其相关融合类算子模板样例。 项目地址: https://gitcode.com/cann/catlass 写在前面 该文档主要说明CATLASS样例开发中精度分析的基础知识&#xff0c;包括样例精度…...

从C++代码到机器指令:用OD和IDA手把手拆解一个简单的main函数(附寄存器图解)

从C代码到机器指令&#xff1a;用OD和IDA手把手拆解一个简单的main函数&#xff08;附寄存器图解&#xff09; 在逆向工程的世界里&#xff0c;理解高级语言如何转化为底层机器指令是一项基础而关键的技能。本文将以一个最简单的C main 函数为例&#xff0c;带你一步步追踪其从…...

树莓派3B上跑通Apriltag识别:老设备配置Python环境(OpenCV+pupil_apriltags)的血泪史与终极方案

树莓派3B上跑通Apriltag识别&#xff1a;老设备配置Python环境&#xff08;OpenCVpupil_apriltags&#xff09;的血泪史与终极方案 当你在二手市场淘到一台树莓派3B&#xff0c;满心欢喜地想用它搭建一个视觉导航机器人时&#xff0c;现实往往会给你当头一棒。这款2016年发布的…...