算法之分支定界
分支定界
- 分支定界
- 概述
- 核心思想与步骤
- 常见变体
- 复杂度分析
- 案例分析
- 1. 0-1背包问题
- 2. 最短路径问题(分支定界法)
- 3. 旅行商问题(TSP)
分支定界
概述
分支定界(Branch and Bound)是一种用于解决组合优化问题的算法设计范式。其核心思想是通过系统枚举所有可能解,并利用上下界策略剪枝,丢弃不可能产生最优解的子问题,从而有效减少搜索空间。
对于最小化问题(如最短路径、TSP),下界表示完成任务的最小可能代价;对于最大化问题(如0-1背包),上界表示可能获得的最大收益。通过比较这些界限与当前已知最优解,算法可以智能地剪枝,避免无谓的搜索。
分支定界法特别适用于NP难问题,如旅行商问题(TSP)、0-1背包问题、整数规划等。
核心思想与步骤
- 初始化:创建一个优先队列(或堆)存储待处理子问题,将初始问题加入队列。
- 迭代处理:每次从队列中取出一个最有希望的子问题(通常是下界最小或上界最大),进行如下操作:
- 界定:计算该子问题的上下界。上界代表该子问题可能达到的最优解,下界代表该子问题的最小代价。
- 可行性检查:若下界大于当前最优解,直接剪枝丢弃该子问题(对于最小化问题)。
- 完整性检查:若找到完整解,且优于当前最优解,则更新最优解。
- 分支:将子问题分解为更小子问题,加入队列。
- 终止条件:队列为空时,当前最优解即为全局最优解。
注:分支定界算法的效率高度依赖于上下界的定义和剪枝策略,合理设计可大幅减少搜索空间。
常见变体
- 最小优先队列(LC法):优先扩展下界最小的节点。
- 最佳优先搜索(Best-First):依据评估函数选择最有希望的节点。
- 深度优先分支定界(DFS B&B):结合深度优先策略,优先扩展深层节点。
- 宽度优先分支定界(BFS B&B):结合宽度优先策略,按层次扩展节点。
复杂度分析
- 时间复杂度:最坏情况下需枚举所有解,复杂度为O(2^n)或更高(对于n个决策变量的问题),但实际中通过有效的剪枝策略可大幅降低。
- 空间复杂度:主要取决于优先队列中节点数,最坏O(2^n),实际远小于此。
注:分支定界法可用于解决最大化问题(如0-1背包)和最小化问题(如最短路径、TSP)。对于最大化问题,上界表示可能达到的最大值;对于最小化问题,下界表示可能达到的最小值。剪枝策略也相应调整:最大化问题在上界≤当前最优解时剪枝,最小化问题在下界≥当前最优解时剪枝。
案例分析
1. 0-1背包问题
问题描述:有一个容量为W的背包,n种物品,每种物品有重量和价值。目标是在不超过背包容量的前提下,选择若干物品使总价值最大。每种物品只能选或不选(0-1选择)。
分支定界解法思路:
- 每个节点表示当前已选物品集合。
- 分支:选/不选当前物品。
- 上界:用贪心法估算当前节点能达到的最大价值(对于背包问题,我们求最大值,所以上界是可能达到的最大价值)。
- 剪枝:若上界不优于当前最优解则不再扩展(即上界≤当前最优解时剪枝)。
代码示例:
#include <stdio.h>// 物品结构体
struct Item {int weight; // 重量int value; // 价值
};int best_value = 0; // 当前最优解// 计算上界(贪心估计)
int calculate_bound(int n, int W, struct Item items[], int current_weight, int current_value, int index) {int bound = current_value;int remaining_weight = W - current_weight;// 贪心:尽量装满背包,若遇到装不下的物品则取部分价值// 这里计算的是上界,即该节点能达到的最大价值估计for (int i = index; i < n; i++) {if (items[i].weight <= remaining_weight) {bound += items[i].value;remaining_weight -= items[i].weight;} else {bound += (int)((double)items[i].value / items[i].weight * remaining_weight);break;}}return bound;
}// 分支定界主过程
void branch_and_bound(int n, int W, struct Item items[], int current_weight, int current_value, int index) {if (index == n) { // 所有物品已考虑if (current_value > best_value) {best_value = current_value;}return;}int upper_bound = calculate_bound(n, W, items, current_weight, current_value, index);if (upper_bound <= best_value) return; // 剪枝:如果上界不优于当前最优解,则不再扩展// 不选当前物品branch_and_bound(n, W, items, current_weight, current_value, index + 1);// 选当前物品(需判断容量)if (current_weight + items[index].weight <= W) {branch_and_bound(n, W, items, current_weight + items[index].weight,current_value + items[index].value, index + 1);}
}int main() {struct Item items[] = { {2, 40}, {3, 60}, {4, 80}, {5, 100} };int n = sizeof(items) / sizeof(items[0]);int W = 7;branch_and_bound(n, W, items, 0, 0, 0);printf("Maximum value obtainable: %d\n", best_value);return 0;
}
2. 最短路径问题(分支定界法)
问题描述:给定有向图,求从起点到终点的最短路径。
分支定界思路:
- 每个节点表示当前到达某顶点的路径。
- 分支:从当前顶点扩展到所有可达顶点。
- 下界:当前路径长度(对于最短路径问题,我们求最小值,所以下界是已经确定的路径长度)。
- 剪枝:若当前路径长度已大于已知最短路径则不再扩展。
注意:下面的代码实际上是Dijkstra算法的一种实现,它可以看作是分支定界法的一个特例,使用优先队列(最小堆)来选择下一个要扩展的节点。
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <stdbool.h>
#include <assert.h>#define NO 0xffffff
typedef struct Arc
{int index;int weight;
}Arc;bool compare(Arc one, Arc two)
{return one.weight < two.weight;
}typedef Arc DataType;
typedef struct Heap
{DataType* data;int maxSize;int curSize;
}Heap;//创建堆
Heap* create_heap(int maxSize)
{Heap* heap = (Heap*)malloc(sizeof(Heap));assert(heap);heap->curSize = 0;heap->maxSize = maxSize;heap->data = (DataType*)malloc(sizeof(int) * (heap->maxSize + 1));assert(heap->data);return heap;
}
int size_heap(Heap* heap)
{return heap->curSize;
}
bool empty_heap(Heap* heap)
{return heap->curSize == 0;
}
//调整位置
void move(Heap* heap, int curPos)
{while (curPos > 1){Arc max = heap->data[curPos];//完全二叉树的特点:父节点序号=孩子节点/2;int parentPos = curPos / 2;if (compare(max, heap->data[parentPos])){//和父节点值交换即可heap->data[curPos] = heap->data[parentPos];heap->data[parentPos] = max;//下标改变,继续向上渗透curPos = parentPos;}else{//插入元素小于父节点值,不需要调整break;}}
}
//入堆
void insert_heap(Heap* heap, DataType data)
{if (heap->curSize == heap->maxSize){return;}//heap->data[0] 不存数据,为了保持下表与完全二叉树的序号一致//heap->data[1]=第一个元素 curSize=1heap->data[++heap->curSize] = data;//向上渗透move(heap, heap->curSize);
}
Arc pop_heap(Heap* heap)
{Arc max = heap->data[1]; //最大值int curPos = 1;int childPos = curPos * 2;while (childPos <= heap->curSize){Arc temp = heap->data[childPos]; //左边//childPos childPos+1if (childPos + 1 <= heap->curSize && !compare(temp,heap->data[childPos + 1])){temp = heap->data[++childPos];//childPos = childPos + 1;}heap->data[curPos] = temp;curPos = childPos;childPos *= 2;}//最后一个元素覆盖删除元素heap->data[curPos] = heap->data[heap->curSize];//一定要调整堆move(heap, curPos);heap->curSize--;return max;
}
void init_graph(int(*graph)[11], int size)
{for (int i = 0; i < size; i++){for (int j = 0; j < size; j++){graph[i][j] = -1;}}graph[0][1] = 2;graph[0][2] = 3;graph[0][3] = 4;graph[1][2] = 3;graph[1][5] = 2;graph[1][4] = 7;graph[2][5] = 9;graph[2][6] = 2;graph[3][6] = 2;graph[4][7] = 3;graph[4][8] = 3;graph[5][8] = 3;graph[5][6] = 1;graph[6][8] = 5;graph[6][9] = 1;graph[7][10] = 3;graph[8][10] = 2;graph[9][8] = 2;graph[9][10] = 2;
}void get_short_path(int(*graph)[11],int size, int edge, int end)
{int shortpath = 0;Arc* path = (Arc*)malloc(sizeof(Arc) * size);int* pathIndex = (int*)malloc(sizeof(int) * size);assert(pathIndex);assert(path);for (int i = 0; i < size; i++) {(path + i)->index = 0;(path + i)->weight = NO;}Heap* minHeap = create_heap(size);insert_heap(minHeap, (Arc) { 0, 0 });while (true) {Arc top = pop_heap(minHeap);if (top.index == end) {break;}for (int i = 0; i < size; i++) {if(graph[top.index][i]!=edge&&top.weight+graph[top.index][i]<(path+i)->weight){insert_heap(minHeap, (Arc) { i, top.weight + graph[top.index][i] });(path + i)->index = top.index;(path + i)->weight = top.weight + graph[top.index][i];}}if (empty_heap(minHeap)) {break;}}shortpath = path[end].weight;int index = end;int count = 0;pathIndex[count++] = index;while (true){index = (path + index)->index;*(pathIndex+count) = index;count++;if (index == 0)break;}printf("最短路径:%d\n", shortpath);printf("最短路径:");for (int i = count-1; i >=0; i--) {printf("%d--->",*(pathIndex+i));}
}int main()
{int graph[11][11];int size = 11;init_graph(graph, size);get_short_path(graph, 11, -1, 10);return 0;
}
3. 旅行商问题(TSP)
旅行商问题是一个经典的组合优化问题:给定一组城市和每对城市之间的距离,求解访问每个城市恰好一次并返回起点城市的最短路径。
在分支定界算法中,可以通过以下方式解决TSP:
- 状态表示:使用部分路径表示当前状态,包括已访问的城市和当前所在城市。
- 分支策略:从当前城市出发,选择下一个未访问的城市。
- 界定函数:使用最小生成树或者最小匹配等方法计算下界(对于TSP问题,下界是完成旅行的最小可能距离)。这种下界估计可以有效剪枝,减少搜索空间。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <limits.h>#define MAX_CITIES 20// 城市间距离矩阵
int dist[MAX_CITIES][MAX_CITIES];
// 记录最优路径
int best_path[MAX_CITIES];
// 记录当前路径
int curr_path[MAX_CITIES];
// 记录城市是否已访问
bool visited[MAX_CITIES];
// 最优路径长度
int best_length = INT_MAX;// 计算下界函数
int calculate_bound(int n, int curr_length, int curr_city, int level) {// 计算下界:当前已走过的路径长度加上所有未访问城市到最近城市的最小距离// 这是一个乐观估计,实际完成旅行的距离一定不会小于这个值int bound = curr_length;// 如果已经访问了所有城市,加上返回起点的距离if (level == n) {bound += dist[curr_city][0];return bound;}// 对于每个未访问的城市,找到连接它的最小边for (int i = 0; i < n; i++) {if (!visited[i]) {int min_edge = INT_MAX;for (int j = 0; j < n; j++) {if (i != j && (visited[j] || j == 0)) {if (dist[i][j] < min_edge) {min_edge = dist[i][j];}}}bound += min_edge;}}return bound;
}// 分支定界算法解决TSP
void tsp_branch_and_bound(int n, int curr_length, int curr_city, int level) {// 如果访问了所有城市if (level == n) {// 加上返回起点的距离curr_length += dist[curr_city][0];// 更新最优解if (curr_length < best_length) {best_length = curr_length;for (int i = 0; i < n; i++) {best_path[i] = curr_path[i];}}return;}// 计算当前状态的下界int bound = calculate_bound(n, curr_length, curr_city, level);// 如果下界大于当前最优解,剪枝if (bound >= best_length) {return;}// 尝试访问每个未访问的城市for (int i = 0; i < n; i++) {if (!visited[i]) {// 标记为已访问visited[i] = true;curr_path[level] = i;// 递归处理下一个城市tsp_branch_and_bound(n, curr_length + dist[curr_city][i], i, level + 1);// 回溯visited[i] = false;}}
}int main() {int n = 4; // 城市数量// 初始化距离矩阵(示例)int distances[4][4] = {{0, 10, 15, 20},{10, 0, 35, 25},{15, 35, 0, 30},{20, 25, 30, 0}};// 复制距离矩阵for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {dist[i][j] = distances[i][j];}}// 初始化for (int i = 0; i < n; i++) {visited[i] = false;}// 从城市0开始curr_path[0] = 0;visited[0] = true;// 运行分支定界算法tsp_branch_and_bound(n, 0, 0, 1);// 输出结果printf("最短路径长度: %d\n", best_length);printf("最短路径: 0");for (int i = 1; i < n; i++) {printf(" -> %d", best_path[i]);}printf(" -> 0\n");return 0;
}
j] = distances[i][j];
}
}
// 初始化
for (int i = 0; i < n; i++) {visited[i] = false;
}// 从城市0开始
curr_path[0] = 0;
visited[0] = true;// 运行分支定界算法
tsp_branch_and_bound(n, 0, 0, 1);// 输出结果
printf("最短路径长度: %d\n", best_length);
printf("最短路径: 0");
for (int i = 1; i < n; i++) {printf(" -> %d", best_path[i]);
}
printf(" -> 0\n");return 0;
}
相关文章:
算法之分支定界
分支定界 分支定界概述核心思想与步骤常见变体复杂度分析案例分析1. 0-1背包问题2. 最短路径问题(分支定界法)3. 旅行商问题(TSP) 分支定界 概述 分支定界(Branch and Bound)是一种用于解决组合优化问题的…...
Hugging Face上面找开源的embedding模型
问题 想找一个支持中文的embedding模型(把一段文本转化成多维度的向量)。Hugging Face平台上面共享了很多开源模型,算是这年头(2025年),大家都把自己开源模式都往上放的地方了吧。现在去这个平台上面找一个…...
docker部署Jenkins工具
环境准备 1.当前安装在Windows系统下的Docker-Desktop 下载地址:Docker Desktop: The #1 Containerization Tool for Developers | Docker 2.下载后进行安装并进行配置启动docker 3.创建一个空的文件夹,用于后面的启动时做文件路径映射 下载镜像 d…...
Pgvector+R2R搭建RAG知识库
背景 R2R是一个采用Python编写的开源AI RAG框架项目,与PostgreSQL技术栈集成度高,运行需求资源少(主要是本人的Macbook air m1内存只有8G)的特点,对部署本地私有化化AI RAG应用友好。 Resource Recommendations Whe…...
Qt本地化 - installTranslator不生效
bool QCoreApplication::installTranslator(QTranslator *translationFile)注意这里输入的是QTranslator对象指针,如果QTranslator是局部变量,一旦离开其作用域就会导致翻译失效 错误代码示范: void ApplyTranslator(const QString& qmf…...
精益数据分析(19/126):走出数据误区,拥抱创业愿景
精益数据分析(19/126):走出数据误区,拥抱创业愿景 在创业与数据分析的探索之旅中,我们都渴望获取更多知识,少走弯路。今天,我依然带着和大家共同进步的想法,深入解读《精益数据分析…...
六、初始化与清理(Initialization cleanup)
六、初始化与清理(Initialization & cleanup) 本章内容主要介绍C中的 构造函数 和 析构函数 的作用与用法,以及默认构造、聚合初始化等相关特性 封装 和 *访问控制 *在提升库使用的便捷性方面迈出了重要的一步。在安全性方面࿰…...
Python - 爬虫-网页解析数据-库lxml(支持XPath)
lxml是 Python 的第三方解析库,完全使用 Python 语言编写,它对 Xpath 表达式提供了良好的支持,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高 XPath,全称XML Path Language,即XML…...
单片机 + 图像处理芯片 + TFT彩屏 触摸滑动条控件
触摸滑动条控件使用说明 一、项目概述 本项目基于单片机和RA8889/RA6809图形处理芯片的TFT触摸屏滑动条控件。该控件支持水平和垂直滑动条,可自定义外观和行为,并支持回调函数进行值变化通知。 硬件平台:51/ARM均可(测试时使用STC8H8K64U单…...
LeetCode每日一题4.24
2799. 统计完全子数组的数目 题目 问题分析 完全子数组 的定义:子数组中不同元素的数目等于整个数组不同元素的数目。 子数组 是数组中的一个连续非空序列。 思路 统计整个数组的不同元素数目: 使用 set 来获取整个数组的不同元素数目。 遍历所有子数…...
LeetCode238_除自身以外数组的乘积
LeetCode238_除自身以外数组的乘积 标签:#数组 #前缀和Ⅰ. 题目Ⅱ. 示例0. 个人方法一:暴力循环嵌套0. 个人方法二:前缀和后缀分别求积 标签:#数组 #前缀和 Ⅰ. 题目 给你一个整数数组 nums,返回 数组 answer &#…...
基于 Spring Boot 的银行柜台管理系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
LeetCode 2799.统计完全子数组的数目:滑动窗口(哈希表)
【LetMeFly】2799.统计完全子数组的数目:滑动窗口(哈希表) 力扣题目链接:https://leetcode.cn/problems/count-complete-subarrays-in-an-array/ 给你一个由 正 整数组成的数组 nums 。 如果数组中的某个子数组满足下述条件&am…...
卡尔曼滤波解释及示例
卡尔曼滤波的本质是用数学方法平衡预测与观测的可信度 ,通过不断迭代逼近真实状态。其高效性和鲁棒性,通常在导航定位中,需要融合GPS、加速度计、陀螺仪、激光雷达或摄像头数据,来提高位置精度。简单讲,卡尔曼滤波就是…...
在vue项目中实现svn日志打印
在vue项目中实现svn日志打印 实现svnlog创建svn-log脚本 convert-svn-log.js配置命令 package 实现svnlog 项目工程 类似于git的conventional-changelog 创建svn-log脚本 convert-svn-log.js 在项目根目录创建convert-svn-log.js const fs require(fs-extra); const xml2j…...
使用vue2开发一个医疗预约挂号平台-前端静态网站项目练习
对于后端开发的我,最近一直在学习前端开发,除了要学习一些前端的基础知识外,肯定少不了一些前端项目练习,就通过前端的编程知识 就简单做一个医疗预约挂号前端静态页面。这个网站主要是使用了vue2 的相关技术实现的。 主要实现了这…...
Redis的过期删除策略和内存淘汰策略
🤔 过期删除和内存淘汰乍一看很像,都是做删除操作的,这么分有什么意思? 首先,设置过期时间我们很熟悉,过期时间到了,我么的键就会被删除掉,这就是我们常认识的过期删除,…...
Langchain检索YouTube字幕
创建一个简单搜索引擎,将用户原始问题传递该搜索系统 本文重点:获取保存文档——保存向量数据库——加载向量数据库 专注于youtube的字幕,利用youtube的公开接口,获取元数据 pip install youtube-transscript-api pytube 初始化 …...
服务器上安装node
1.安装 下载安装包 https://nodejs.org/en/download 解压安装包 将安装包上传到/opt/software目录下 cd /opt/software tar -xzvf node-v16.14.2-linux-x64.tar.gz 将解压的文件夹移动到安装目录(/opt/nodejs)下 mv /opt/software/node-v16.14.2-linux-x64 /opt/nodejs …...
React:什么是Hook?通俗易懂的讲讲
什么是Hook 1.Hook 是什么?2.React 内置的 Hook3. 自定义 Hook4. 总结 1.Hook 是什么? 可以理解为:函数组件的工具/功能插件 Hook是 React 16.8 以后提供的一种新特性, 让你在函数组件里“钩入”React 的功能(比如状态…...
树莓派安装GStreamer ,opencv支持, 并在虚拟环境中使用的安装方法
首先是我在树莓派中 使用OpenCV 读取网络视频流, 如海康威视 通过rtsp协议地址读取 会发生延迟和丢包的情况 后来使用ffmpeg和OpenCV 读取视频流 丢报的问题减少了 但是长时间运行 还是会造成延迟和卡顿 最后直接卡死画面 后来试了一下GStreamer 管道流 是树莓派支持的 但是原生…...
从节点重排看React 与 Vue3 的 Diff 算法
一个有趣的问题 之前我写了一篇狗教我 React——原理篇之 Diff 算法 - 掘金 (juejin.cn)简单介绍了 diff 算法,收到了一个有意思的疑问: 大佬讲得非常易懂,我有个疑惑就是都说 diff 处理节点前移比较差,比如 a→b→c→d 更新为 d→a→b→c,如果第一遍循环到第一个就截止了…...
【FAQ】PCoIP 会话后物理工作站本地显示器黑屏
# 问题 工作人员从家里建立了到办公室工作站的 PCoIP 连接,该工作站安装了 HP Anyware Graphics Agent,并且还连接了本地显示器。然后,远程用户决定去办公室进行本地工作,工作站显示器显示黑屏(有时没有信号ÿ…...
springboot基于hadoop的酷狗音乐爬虫大数据分析可视化系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 本酷狗音乐爬虫大数据分析可视化系统采用B/S架构,数据库是MySQL,网站的搭建与开发采用了先进的Java语言、Hadoop、爬虫技术进行编写,使用了Spring Boot框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。前台主要…...
基于大模型的食管平滑肌瘤全周期预测与诊疗方案研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 国内外研究现状 二、大模型技术原理与应用概述 2.1 大模型介绍 2.2 在医疗领域的应用现状 2.3 用于食管平滑肌瘤预测的可行性分析 三、食管平滑肌瘤术前预测 3.1 预测指标选取 3.2 数据收集与预处理 3.2.1 数据…...
26考研 | 王道 | 数据结构 | 第七章 查找
第七章 查找 文章目录 第七章 查找7.1 查找概念7.2 顺序查找7.3 折半查找7.4 分块查找7.5 二叉排序树7.6 平衡二叉树平衡二叉树的插入平衡二叉树的删除 7.7 红黑树7.7.1 为什么要发明红黑树?7.7.2 红黑树的定义和性质7.7.3 红黑树的插入和删除插入删除 7.8 B树和B树…...
Docker 部署 Redis:快速搭建高效缓存服务
Docker 部署 Redis:快速搭建高效缓存服务 引言 Redis 是一个高性能的键值数据库,广泛应用于缓存、消息队列、实时分析等领域。而 Docker 作为容器化技术的代表,能够帮助我们快速部署和管理应用程序。结合两者,我们可以轻松实现 …...
【缓存与数据库结合最终方案】伪从技术
实现伪从技术:基于Binlog的Following表变更监听与缓存更新 技术方案概述 要实现一个专门消费者服务作为Following表的伪从,订阅binlog并在数据变更时更新缓存,可以采用以下技术方案: 主要组件 MySQL Binlog监听:使…...
如何规避矩阵运营中的限流风险及解决方案
在自媒体矩阵化运营中,系统性规避平台限流机制需建立在精准理解算法逻辑的基础上。根据行业实践数据统计,当前矩阵账号触发限流的核心诱因主要集中在两大维度: 首先需要明确的是设备与网络层面的合规性配置。当单台移动设备频繁切换多账号登…...
TensorFlow Keras“安全模式”真的安全吗?绕过 safe_mode 缓解措施,实现任意代码执行
机器学习框架通常依赖序列化和反序列化机制来存储和加载模型,然而模型中不恰当的代码隔离和可执行组件可能会导致严重的安全风险。 TensorFlow 中的 Keras v3 ML 模型结构 对于基于 TensorFlow 的 Keras 模型,存在一个严重的反序列化漏洞,编号为CVE-2024-3660。攻击者可利…...
PostgreSQL-日志管理介绍
概述 1、日志管理器: 日志模块包括事务提交日志CLOG和数据日志XLOG。其中CLOG是系统为整个事务管理流程所建立的日志,主要用于记录事务的状态,同时通过SUBTRANS日志记录事务的嵌套关系。XLOG日志是数据库日志的主体,记录数据库中…...
【Java 数据结构】泛型
目录 一. 什么是泛型 二. 引出泛型 三. 泛型语法 四. 泛型的使用 五. 泛型是如何编译的 5.1 擦除机制 六. 泛型的继承 6.1 泛型类继承非泛型类 6.2 泛型类继承泛型类 6.2.1 父类的同名传递 6.2 2 父类的异名传递 6.2.3 父类固定类型传递 6.2.4 子类添加参数 七. 泛…...
鲲鹏麒麟搭建Docker仓库
Docker Registry简介 Docker Registry是一个开源的镜像仓库工具,用于存储和分发Docker镜像。它是Docker生态系统中的核心组件之一,提供了镜像的推送(push)、拉取(pull)和管理功能。 主要特性: 1、开源免费:Apache 2.0许可证 2、轻…...
Java快速上手之实验4(接口回调)
1.编写接口程序RunTest.java,通过接口回调实现多态性。解释【代码4】和【代码6】的执行结果为何不同? interface Runable{ void run(); } class Cat implements Runable{ public void run(){ System.out.println("猫急上树.."…...
【前端】【业务场景】【面试】在前端开发中,如何实现实时数据更新,比如实时显示服务器推送的消息,并且保证在不同网络环境下的稳定性和性能?
问题:在前端开发中,如何实现实时数据更新,比如实时显示服务器推送的消息,并且保证在不同网络环境下的稳定性和性能? 一、实现实时数据更新的方法 WebSocket: 原理:WebSocket 是一种在单个 TCP …...
redis相关问题整理
Redis 支持多种数据类型: 字符串 示例:存储用户信息 // 假设我们使用 redis-plus-plus 客户端库 auto redis Redis("tcp://127.0.0.1:6379"); redis.set("user:1000", "{name: John Doe, email: john.doeexample.com}"…...
某城乡老旧房屋试点自动化监测服务项目
1. 项目简介 我国是房屋建设增长量最高的国家或地区,但上个世纪末建造的房屋多为砖混结构,使用寿命短且缺乏维护。这些房屋在使用过程中受到地质活动、自然环境和人为改造的影响,其结构强度逐年下降,部分房屋甚至出现墙体裂缝、倾…...
企业为何要求禁用缺省口令?安全风险及应对措施分析
在当今数字化时代,企业网络安全面临着前所未有的挑战。缺省口令的使用是网络安全中的一个重要隐患,许多企业在制定网络安全红线时,明确要求禁用缺省口令。本文将探讨这一要求的原因及其对企业安全的重要性。 引言:一个真实的入侵场…...
在 MySQL 中,索引前缀长度为什么选择为 191
在 MySQL 中,索引前缀长度选择为 191 的常见原因主要与 字符集编码 和 索引长度限制 相关,具体解释如下: 1. 字符集编码的影响 utf8mb4 字符集: MySQL 的 utf8mb4 字符集每个字符最多占用 4 个字节(相比 utf8 的 3 字…...
【Python语言基础】24、并发编程
文章目录 1. 多线程(threading模块)1.1 多线程的实现(threading 模块)1.2 多线程的优缺点1.3 线程同步与锁 2. 多进程(multiprocessing模块)2.1 多进程实现(multiprocessing模块)2.2 多进程的优缺点2.3 进程…...
MySQL-自定义函数
自定义函数 函数的作用 mysql数据库中已经提供了内置的函数,比如:sum,avg,concat等等,方便我们日常的使用,当需要时mysql支持定义自定义的函数,方便与我们对于需用复用的功能进行封装。 基本…...
实时操作系统在服务型机器人中的关键作用
一、服务型机器人的发展现状与需求 近年来,服务型机器人市场呈现出蓬勃发展的态势。据国际机器人联合会(IFR)2024 年度报告显示,全球人形机器人市场规模预计在 2025 年达到 38.7 亿美元,年复合增长率达 19.2%。服务型机…...
智能电网第5期 | 老旧电力设备智能化改造:协议转换与边缘计算
随着电力行业数字化转型加速,大量在役老旧设备面临智能化升级需求。在配电自动化改造过程中,企业面临三大核心挑战: 协议兼容难题:传统设备采用Modbus等老旧协议,无法接入智能电网系统 数据处理瓶颈:设备本…...
【UML建模】starUML工具
一.概述 StarUML是一款UML工具,允许用户创建和管理UML(统一建模语言)模型,广泛应用于软件工程领域。它的主要功能包括创建各种UML图:如用例图、类图、序列图等,支持代码生成与反向工程,以及提供…...
【技术笔记】Cadence实现Orcad与Allegro软件交互式布局设置
【技术笔记】Cadence实现Orcad与Allegro软件交互式布局设置 更多内容见专栏:【硬件设计遇到了不少问题】、【Cadence从原理图到PCB设计】 在做硬件pcb设计的时候,原理图选中一个元器件,希望可以再PCB中可以直接选中。 为了达到原理图和PCB两两…...
第十七届山东省职业院校技能大赛 中职组网络建设与运维赛项
第十七届山东省职业院校技能大赛 中职组网络建设与运维赛项 赛题 B 卷 第十七届山东省职业院校技能大赛中职组网络建设与运维赛项 1 赛题说明 一、竞赛项目简介 “网络建设与运维”竞赛共分为以下三个模块: 网络理论测试; 网络建设与调试…...
深入详解人工智能数学基础——概率论中的KL散度在变分自编码器中的应用
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...
Docker配置DNS方法详解及快速下载image方法
根据错误信息,Docker 在拉取镜像时遇到网络连接超时(Client.Timeout exceeded),通常与 代理配置错误、DNS 解析失败、镜像源访问受限 或 网络防火墙限制 有关。以下是详细解决方案: 1. 检查并修复代理配置 如果你使用了 HTTP 代理: 确认代理地址是否有效(替换 speed.ip…...
Rundeck 介绍及安装:自动化调度与执行工具
Rundeck介绍 概述:Rundeck 是什么? Rundeck 是一款开源的自动化调度和任务执行工具,专为运维场景设计,帮助工程师通过统一的平台管理和执行跨系统、跨节点的任务。它由 PagerDuty 维护(2016 年收购)&#…...
济南国网数字化培训班学习笔记-第二组-6-输电线路现场教学
输电线路现场教学 杆塔组装 角钢塔 角钢-连扳-螺栓 螺栓(M): 脚钉-螺栓(螺栓头-无扣长-螺纹-螺帽)-垫片-螺帽/防盗帽/防松帽M20*45 表示直径20mm,长度45mm螺栓级别由一个类似浮点数表示,如…...