算法之贪心算法
贪心算法
- 贪心算法
- 核心思想
- 常见应用场景
- 典型案例
- 案例一:找零问题
- 案例二:活动选择问题
- 案例三:货仓选址问题
- 贪心算法的应用详解
- 霍夫曼编码
- 最小生成树
- Dijkstra最短路径算法
- 总结
贪心算法
核心思想
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最优的选择,从而希望以这种方式能够达到全局最优解的一种算法思想。贪心算法并不总是能得到全局最优解,但在一些问题中,它能产生出足够好的解,而且相对简单高效。
贪心算法的基本思想是通过一系列局部最优的选择,希望最终达到全局最优。在每一步,贪心算法会选择当前状态下的最优解,而不考虑当前选择对以后的影响。这与动态规划的思想不同,动态规划考虑到每一步的选择对于整体解的影响,而做出相应的决策。
贪心算法通常适用于满足两个条件的问题:
- 最优子结构性质: 当一个问题的最优解包含其子问题的最优解时,称该问题具有最优子结构性质。
- 贪心选择性质: 通过局部最优选择,期望能够达到全局最优。
一旦一个问题可以通过贪心算法求解,那么贪心算法一般会比其他算法更加高效。然而,需要注意的是,并非所有问题都满足贪心选择性质和最优子结构性质。
常见应用场景
- 霍夫曼编码:用于数据压缩,为高频字符分配短编码、低频字符分配长编码,减少整体数据量。
- 活动选择问题:选择一组互不相容的活动,使得参与的活动数最大。
- 最小生成树:如Kruskal和Prim算法,用于在加权连通图中找到权值之和最小的生成树。
- Dijkstra最短路径算法:求解单源最短路径问题,从起始点开始,每次遍历到距离最近且未访问过的顶点的邻接节点。
- 货仓选址问题:在一维数轴上为多个商店选择货仓位置,使得总距离最小。
在使用贪心算法时,必须确保贪心选择的局部最优解能够推导出全局最优解,否则可能得不到最优解。
典型案例
案例一:找零问题
问题描述:假设你是柜台售货员,需要给客户找零n元钱。你拥有无限数量的1元、2元、5元、10元、20元、50元面额的硬币/纸币。如何用最少数量的硬币/纸币来找零?
贪心策略:每次尽量用面额最大的硬币来找零。
示例:
假设要找零的金额为 n = 36 元。
可用的硬币面额为 1、2、5、10、20 和 50。
- 首先,找零最大的面额,即 50 元。但由于 50 元大于 36 元,所以不能使用。
- 接下来,尽量使用次大面额的硬币,即 20 元。36 元中能用一个 20 元,剩下 16 元。
- 然后使用次次大面额的硬币,即 10 元。16 元中能用一个 10 元,剩下 6 元。
- 继续使用 5 元的硬币,6 元中能用一张 5 元,剩下 1 元。
- 最后,用 1 元的硬币找零 1 元。
这样,用 20 元、10 元、5 元和 1 元的硬币一共找零 36 元,共需要 4 枚硬币,是最少数量的硬币。
在这个案例中,贪心算法的贪心策略是每次都选择当前情况下的最优解,即选择当前可用的最大面额的硬币。这种策略在这个特定问题中得到了最优解。但需要指出的是,对于不同的面额组合和要求找零的金额,贪心算法并不总是能够得到最优解。
代码实现:
#include <stdio.h>
void findChange(int amount) {int money[] = { 50, 20, 10, 5, 2, 1 };int num = sizeof(money) / sizeof(money[0]);printf("找零 %d :\n", amount);for (int i = 0; i < num; ++i) {int current = money[i];int numNotes = amount / current;if (numNotes > 0) {printf("%d 张 %d 块\n", numNotes, current);amount = amount % current;}}
}
int main() {int amount = 46;findChange(amount);return 0;
}
复杂度分析:
- 时间复杂度:O(1),因为面额种类有限。
- 空间复杂度:O(1)。
注意:对于某些面额组合,贪心算法不一定能得到最优解。
案例二:活动选择问题
问题描述:有n个活动,每个活动有开始时间和结束时间,要求选择最多数量的互不重叠活动。
贪心策略:每次选择结束时间最早且不与已选活动冲突的活动。
伪代码:
1. 按活动结束时间从小到大排序
2. 依次选择与已选活动不冲突的下一个活动
代码实现:
#include <stdio.h>
#include <stdlib.h>// 定义活动结构体,包含开始时间和结束时间
typedef struct {int start; // 活动开始时间int end; // 活动结束时间int index; // 活动编号(可选,用于标识活动)
} Activity;// 比较函数,用于按活动结束时间排序
int cmp(const void *a, const void *b) {return ((Activity*)a)->end - ((Activity*)b)->end;
}// 贪心算法选择活动函数
void selectActivities(Activity acts[], int n) {// 按活动结束时间从小到大排序qsort(acts, n, sizeof(Activity), cmp);// 选择第一个活动(结束时间最早的活动)int count = 0; // 记录选择的活动数量int lastEnd = -1; // 上一个选择的活动的结束时间,初始为-1printf("选择的活动:\n");for (int i = 0; i < n; ++i) {// 如果当前活动的开始时间大于等于上一个选择的活动的结束时间,则选择该活动if (acts[i].start >= lastEnd) {count++;printf("活动%d: [%d, %d]\n", acts[i].index, acts[i].start, acts[i].end);lastEnd = acts[i].end; // 更新最后选择的活动的结束时间}}printf("共选择了 %d 个活动\n", count);
}// 主函数,演示活动选择问题
int main() {// 示例活动集合,每个活动有开始时间、结束时间和编号Activity activities[] = {{1, 4, 1}, // 活动1:开始时间1,结束时间4{3, 5, 2}, // 活动2:开始时间3,结束时间5{0, 6, 3}, // 活动3:开始时间0,结束时间6{5, 7, 4}, // 活动4:开始时间5,结束时间7{3, 9, 5}, // 活动5:开始时间3,结束时间9{5, 9, 6}, // 活动6:开始时间5,结束时间9{6, 10, 7}, // 活动7:开始时间6,结束时间10{8, 11, 8}, // 活动8:开始时间8,结束时间11{8, 12, 9}, // 活动9:开始时间8,结束时间12{2, 14, 10}, // 活动10:开始时间2,结束时间14{12, 16, 11} // 活动11:开始时间12,结束时间16};int n = sizeof(activities) / sizeof(activities[0]);printf("共有 %d 个活动\n\n", n);// 调用贪心算法选择活动selectActivities(activities, n);return 0;
}
复杂度分析:
- 时间复杂度:O(nlogn),主要是排序的时间复杂度。
- 空间复杂度:O(1),除了存储活动的数组外,只需要常数级的额外空间。
贪心策略正确性证明:
活动选择问题的贪心策略是选择结束时间最早的活动,这一策略的正确性可以通过反证法证明:
假设最优解集合为S,包含k个活动,按结束时间排序后为{a₁, a₂, …, aₖ}。如果a₁不是所有活动中结束时间最早的活动,那么存在活动b,其结束时间早于a₁。
我们可以用b替换S中的a₁,得到新的解集合S’ = {b, a₂, …, aₖ}。由于b的结束时间早于a₁,b不会与a₂, …, aₖ冲突,因此S’也是一个可行解,且|S’| = |S|。这说明选择结束时间最早的活动不会导致最优解的丢失。
通过归纳法,可以证明每次选择当前结束时间最早的、与已选活动不冲突的活动,最终能得到最优解。
应用场景:
活动选择问题在实际中有广泛应用,例如:
- 会议室安排:在有限的会议室中安排尽可能多的会议
- 课程表设计:在固定教室中安排尽可能多的课程
- 任务调度:在单处理器上安排尽可能多的任务
案例三:货仓选址问题
问题描述:在一条数轴上有N家商店,它们的坐标分别为A1∼AN。现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。
贪心策略:将货仓建在所有商店坐标的中位数位置。
代码实现:
#include <stdio.h>
#include <stdlib.h>// 比较函数,用于排序
int compare(const void* a, const void* b) {return (*(int*)a - *(int*)b);
}// 计算距离之和的函数
int sum(int warehouse, int* shops, int n) {int totalDistance = 0;for (int i = 0; i < n; ++i) {totalDistance += abs(warehouse - shops[i]);}return totalDistance;
}// 找到货仓位置的函数
int find(int* shops, int n) {// 将商店坐标排序qsort(shops, n, sizeof(int), compare);// 中位数位置int warehousePosition = shops[n / 2];return warehousePosition;
}int main() {int n;printf("输入商店的数量:");scanf("%d", &n);int* shops = (int*)malloc(n * sizeof(int));printf("输入商店的坐标:");for (int i = 0; i < n; ++i) {scanf("%d", &shops[i]);}int pos = find(shops, n);int total = sum(pos, shops, n);printf("把货仓建在坐标 %d 处,使得货仓到每家商店的距离之和最小,为:%d\n", pos, total);free(shops);return 0;
}
复杂度分析:
- 时间复杂度:O(nlogn),主要是排序的时间复杂度。
- 空间复杂度:O(n),需要存储n个商店的坐标。
注意:这个问题的贪心策略是选择中位数位置,这是因为在一维数轴上,到各点距离之和最小的位置就是这些点的中位数。
贪心算法的应用详解
霍夫曼编码
霍夫曼编码是一种变长编码方式,它根据字符出现的频率来设计编码长度,频率高的字符使用较短的编码,频率低的字符使用较长的编码,从而达到压缩数据的目的。
贪心策略:每次选择两个频率最低的节点合并,构建一棵哈夫曼树,然后根据从根到叶子的路径确定编码。
最小生成树
最小生成树是连通无向图的一个生成树,其权值之和最小。常用的算法有:
Prim算法:
- 从图中任选一个顶点作为起始点,加入到最小生成树中
- 在所有与当前最小生成树中顶点相邻的边中,选择权值最小的边,将其连接的未访问顶点加入到最小生成树中
- 重复步骤2,直到所有顶点都加入到最小生成树中
Kruskal算法:
- 将图中所有边按权值从小到大排序
- 按照权值从小到大的顺序选择边,如果该边不会与已选择的边构成环路,则将其加入到最小生成树中
- 重复步骤2,直到选择了n-1条边(n为顶点数)
Dijkstra最短路径算法
Dijkstra算法用于求解单源最短路径问题,即从一个顶点到其余各顶点的最短路径。
贪心策略:每次选择当前未访问的距离起点最近的顶点,然后更新与该顶点相邻的其他顶点的距离。
总结
贪心算法通过每一步的局部最优选择,期望获得全局最优解。适用于满足最优子结构和贪心选择性质的问题。常见应用有找零、活动选择、最小生成树、最短路径、霍夫曼编码等。实际应用时需验证贪心策略的正确性,因为贪心算法并不总是能得到全局最优解。
相关文章:
算法之贪心算法
贪心算法 贪心算法核心思想常见应用场景典型案例案例一:找零问题案例二:活动选择问题案例三:货仓选址问题 贪心算法的应用详解霍夫曼编码最小生成树Dijkstra最短路径算法 总结 贪心算法 核心思想 贪心算法(Greedy Algorithm&…...
从“链主”到“全链”:供应链数字化转型的底层逻辑
1. 制造业与供应链数字化转型的必然性 1.1. 核心概念与战略重要性 制造业的数字化转型,是利用新一代数字技术(如工业互联网、人工智能、大数据、云计算、边缘计算等)对制造业的整体价值链进行根本性重塑的过程。这不仅涉及技术的应用&#…...
【Windows本地部署n8n工作流自动平台结合内网穿透远程在线访问】
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
Python中如何加密/解密敏感信息(如用户密码、token)
敏感信息,如用户密码、API密钥、访问令牌(token)、信用卡号以及其他个人身份信息(PII),构成了现代应用程序和系统中最为关键的部分。这些信息一旦被未经授权的第三方获取,可能引发灾难性的后果,从个人隐私泄露到企业经济损失,甚至是大规模的社会安全问题。保护这些敏感…...
Win10如何一键切换IP地址教程
切换IP地址可能对于许多用户来说是一个相对陌生但又可能经常需要进行的操作。无论是出于网络安全、突破网络限制还是仅仅为了测试目的,一键切换IP地址都能带来极大的便利。以下是在 Windows 10 中通过批处理脚本实现一键切换 IP 地址的详细教程: 方法一&…...
2021-11-09 C++三位数平方含有该数
缘由求解,运算函数,哪位大神教一下-编程语言-CSDN问答 void 三位数平方含有该数() {//缘由https://ask.csdn.net/questions/7560152?spm1005.2025.3001.5141int a 100, aa 1000, f 0;while (a < aa){f a*a;while (f > a)if ((f - a) % aa)f …...
高效检测书签网址,告别无效链接烦恼
软件介绍 你是否有过面对浏览器中满满的书签,却不知道哪些网址还“健在”,哪些已经“跑路”的烦恼?别担心,今天就给大家介绍一款神奇的小工具——“网址小卫士”。 检测轻松搞定 还在一个个手动检查书签网址的有效性吗…...
SpringBoot高校学生评教系统设计实现
概述 基于SpringBoot的高校学生评教系统项目,该系统包含了学生评教、教师管理等功能,适合作为JavaWeb学习项目。 主要内容 1. 学生功能模块 查看评教信息:可以查看学期、院系、任课教师、课程名称等信息评价打分功能:可以对课…...
代码随想录算法训练营第二十天
LeetCode题目: 39. 组合总和40. 组合总和 II131. 分割回文串2176. 统计数组中相等且可以被整除的数对(每日一题) 其他: 今日总结 往期打卡 39. 组合总和 跳转: 39. 组合总和 学习: 代码随想录公开讲解 问题: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 targ…...
C++入门基础:命名空间,缺省参数,函数重载,输入输出
命名空间: C语言是基于C语言的,融入了面向对象编程思想,有了很多有用的库,所以接下来我们将学习C如何优化C语言的不足的。 在C/C语言实践中,在全局作用域中变量,函数,类会有很多,这…...
GPU怎么绑定到服务器上
确认服务器与 GPU 兼容性1:不同的服务器和 GPU 型号连接方式有所不同,要确保所选的 GPU 卡与服务器兼容。可通过服务器和 GPU 的产品文档,或使用服务器厂商提供的兼容性查询工具进行确认。安装前准备:关闭服务器电源,并…...
opencv函数展示2
一、像素操作与算术运算 1.cv2.split() 2. cv2.merge() 3.cv2.add() 4.cv2.bitwise_and() 5.cv2.bitwise_or() 6.cv2.inRange() 二、仿射变换 1.cv2.getRotationMatrix2D() 2.cv2.warpAffine() 3.cv2.flip() 4.cv2.resize() 三、透视变换 1.cv2.getPerspectiveTransform() 2…...
零基础上手Python数据分析 (16):DataFrame 常用统计分析方法
写在前面 —— 超越简单排序,探索数据内在规律,掌握Pandas统计分析基础 上一篇博客,我们学习了如何使用 Pandas 对 DataFrame 进行排序和排名,这使得我们能够更好地组织数据并快速定位关键信息。 然而,仅仅对数据进行排序和排名,还不足以完全理解数据。 要想更深入地解…...
文件系统 软硬连接
🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、理解文件系统 🌠磁盘结构 二、软硬连接 🌟软硬链接 🌠软链接: 🌠硬链接: 🌟理解软硬链接的应…...
Linux环境基础开发工具使用
本节目标: 1. 学习yum工具,进行软件安装 2. 掌握vim编辑器使用,学会vim的简单配置 3. 掌握gcc/g编译器的使用,并了解其过程,原理 4. 掌握简单gdb使用于调试 5. 掌握简单的Makefile编写,了解其运行思想…...
秘密任务 2.0:如何利用 WebSockets + DTOs 设计实时操作
在之前的文章中,我们探讨了为什么 DTO 是提升 API 效率和安全性的秘密武器。现在,我们进入了一个全新的场景——我们将深入探讨如何通过 WebSockets DTOs 实现实时操作! Agent X 正在进行一项高风险的卧底任务。突然,总部更新了…...
LeetCode hot 100—括号生成
题目 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 示例 1: 输入:n 3 输出:["((()))","(()())","(())()","()(())",&…...
2025.04.17【Dendrogram】生信数据可视化:Dendrogram图表详解
Dendrogram customization Go further with ggraph: edge style, general layout, node features, adding labels, and more. Customized circular dendrogram Learn how to build a circular dendrogram with proper labels. 文章目录 Dendrogram customizationCustomized c…...
SDL基础
SDL SDL(Simple DirectMedia Layer)是一个开源的跨平台多媒体开发库,主要用于开发需要图形、音频和输入设备支持的应用程序。它使用C语言编写,提供了简单易用的API,**能够帮助开发者快速实现跨平台的多媒体功能。**SD…...
硬件工程师面试常见问题(2)
第六问:你知道那些常用逻辑电平?TTL与COMS电平可以直接互连吗? 逻辑电平:是数字电路中用于表示二进制逻辑状态(0 和 1)的电压或电流信号范围,是数字系统中器件间信号传输的统一标准。 注:逻辑电…...
Python自学第2天:条件语句,循环语句
条件语句 1.条件判断 score 60 if score > 90:print("优秀") elif score > 60:print("及格") else:print("不及格") 注意: 1、每个条件后面要使用冒号 :,表示接下来是满足条件后要执行的语句块。2、使用缩进来划…...
2025年4月16日华为笔试第一题100分
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 01. 博物馆展览规划 问题描述 卢小姐是一家著名博物馆的策展人,她需要从众多展品中选择一些组成新的展览。每件展品可以展示不同的历史文化主题,而博物馆希望通过最少的展品数量覆…...
智能体开发的范式革命:Cangjie Magic全景解读与实践思考
引言:当智能体开发遇见仓颉魔法 在人工智能技术日新月异的今天,智能体(Agent)开发正从实验室走向产业应用的核心舞台。2025年3月,仓颉社区推出的Cangjie Magic开源平台,以其创新的设计理念和技术架构,为这一领域带来了…...
LeetCode hot 100—单词搜索
题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或…...
基于flask+vue框架的灯饰安装维修系统u49cf(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
系统程序文件列表 项目功能:用户,工单人员,服务项目,订单记录,服务记录,评价记录 开题报告内容 基于 FlaskVue 框架的灯饰安装维修系统开题报告 一、选题背景与意义 (一)选题背景 随着城市化进程的加速与居民生活品质的显著提升…...
C/C++指针
为什么要使用指针 函数的值传递,无法通过调用函数,来修改函数的实参;被调用函数需要提供更多的“返回值”给调用函数;减少值传递时带来的额外开销,提高代码执行效率 指针定义:指针是什么 int age18; /* …...
Unity编辑器扩展之项目资源查找工具
一、需要实现的效果如下: 二、在项目的Asset目录下新增Editor目录,新增AssetSearchWindow和EditorDefine和EditorTools这三个C#脚本,并复制以下的代码保存好之后,就可以实现上述功能啦。 -------------------------------------------EditorTools脚本Begin----------------…...
什么是分布式锁?
分布式锁是一种在分布式系统中控制资源共享的机制。 一、背景和作用 在单机环境下,当多个线程同时访问共享资源时,可以通过线程锁(如 Java 中的 synchronized 关键字、ReentrantLock 等)来保证操作的原子性、可见性和有序性&#…...
ESP32- 开发笔记- 硬件设计-ESP32-C3 天线设计-利用嘉立创EDA来设计
这个硬件设计,只是一个随手记录文档。如果中间有什么问题,欢迎大家提出来。 1 板载天线 1.1 背景介绍 PCB(Printed Circuit Board)板载天线是现代电子设备中用于无线通信的一种关键组件,它直接集成在电路板上&#…...
setTimeoutsetIntervalrequestAnimationFrame
requestAnimationFrame 详解及与 setTimeout/setInterval 的比较 requestAnimationFrame(简称 rAF)是浏览器提供的专门用于 动画渲染 的 API,相比 setTimeout 和 setInterval,它在性能和流畅度上有显著优势。以下是详细解析和对比…...
Python内置函数---anext()
用于异步迭代器的核心工具,专为处理异步数据流设计。 1. 基本语法 await anext(async_iterator, default) 参数: async_iterator :实现了异步迭代协议的对象(如异步生成器、异步迭代器类)。 default (可选…...
JavaEE——线程安全
目录 前言1.线程安全的定义2.线程安全问题产生的原因2.1 多个线程修改一个变量2.2 修改操作不是原子的2.3 内存可见性引起的线程安全问题 3.解决线程安全问题的方法3.1 通过synchronized关键字加锁3.2 使用volatile关键字 总结 前言 在使用多线程的时候,难免会出现…...
MongoServerError: Authentication failed.处理办法
1停止MongoDB服务: systemctl stop mongod2临时修改MongoDB配置,禁用认证: vim /etc/mongdb.config 在配置文件中找到 security:authorization: disabled # 临时关闭认证3.重启MongoDB服务 # 重启MongoDB服务 sudo systemctl restart mon…...
IOS微信小程序无法显示背景图片
最近线上突然出现了一个问题,就是原来的在线上的小程序无法显示背景图片。而且这个问题只有在IOS上才有。在安卓上是正常的。 然后这里和前端沟通说是,看能不能用苹果手机真机调试。果然也成功复现出来了,部分图片无法显示。 然后在网上找了…...
实验五 8255和LED数码管显示实验
一、实验目的 1.掌握并行接口8255A的工作原理及使用方法。 2.了解七段数码管显示数字的原理。 3.掌握多位数码显示的接口技术。 二、实验电路 三、实验内容 1.静态显示:按图3连接好电路࿰…...
秒杀系统解决两个核心问题的思路方法总结:1.库存超卖问题;2.用户重复抢购问题。
秒杀系统解决两个核心问题 秒杀系统解决两个核心问题:一、解决库存超卖的核心逻辑:解释:原子性保证: 二、如何避免重复抢购:使用 Redis 做唯一标识判断优点: 三、流程完整梳理:四、通过数据库建…...
大数吞小数
A-春_牛客练习赛134 double 的有效数字约 15-17 位十进制,因此: 如果两个数的数量级相差超过 15-16 个数量级,较小的数会被吞掉。...
1-9 堆宝塔
堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小,按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下: 首先准备两根柱子,一根 A 柱串宝塔,一根 B 柱用于临时叠放。把第 1 块彩虹圈…...
Java虚拟机(JVM)平台无关?相关?
计算机的概念模型 计算机实际上就是实现了一个图灵机模型。即,输入参数,根据程序计算,输出结果。图灵机模型如图。 Tape是输入数据,Program是针对这些数据进行计算的程序,中间横着的方块表示的是机器的状态。 目前使…...
第七章--查找
查找表 定义 由同一类型的数据元素(或记录)构成的集合。 1)特点:数据元素的类型相同;结构松散→先后次序无关紧要,只关心是否在集合内。 2)常用操作:查询某个“特定的”数据元素是否在查找表中…...
photo-sphere-viewer 4.8.1在vue中使用
photo-sphere-viewer 加载单张平面图 import { Viewer } from photo-sphere-viewerthis.viewer new Viewer({panorama: ‘完整的url,也可以是一个base64’,// Containercontainer: document.getElementById(viewer1),navbar: true,// Resize the panoramasize: {width: 100%,…...
vue MarkdownIt标签多出了<p>标签导致高度变丑
效果如下: [点击并拖拽以移动] F12观察后发现多了 标签包裹,所以要解决 标签。 在 markdown-it 中禁用自动包裹 <p> 标签的方法 要让 markdown-it 渲染的 Markdown 内容不自动包裹 <p> 标签,你可以使用以下两种方…...
《Java 并发编程实践》阅读笔记(一):线程重要性
文章目录 一. 并发历史二. 线程优势三. 线程带来的风险1. 安全性问题2. 活跃性问题3. 性能问题 四. 线程无处不在示例1: Timer示例2: 远程方法调用(Remote Method Invocation, RMI)示例3: GUI 程序 一. 并发历史 操作系统的出现 大型机时代, 没有操作系统, 一台主机只能执行一…...
算法思想之分治-归并
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之分治-归并 发布时间:2025.4.17 隶属专栏:算法 目录 算法介绍核心思想与步骤时空复杂度分析C代码实现关键特性与优化 例题排序数组题目链接题目描述算法思路代码实现 交易逆序对的总…...
Vue基础(5)_事件修饰符
事件修饰符 Vue中的事件修饰符: 1、prevent:阻止默认事件(常用)。 2、stop:阻止事件冒泡(常用)。 3、once:事件只触发一次(常用)。 4、capture:使用事件的捕获模式。 5、self:只有event.target是当前操作的…...
网络编程 - 1
目录 为什么需要网络编程? —— 丰富的网络资源 什么是网络编程 网络编程中的基本概念 发送端和接收端 请求和相应 客户端和服务端 常见的客户端服务端模型 Socket 套接字 概念 分类 解释 有连接 / 无连接 可靠传输 / 不可靠传输 面向字节流 / 面向数…...
github | 仓库权限管理 | 开权限
省流版总结: github 给别人开权限:仓库 -> Setting -> Cllaborate -> Add people GitHub中 将公开仓库改为私有:仓库 -> Setting -> Danger Zone(危险区) ->Change repository visibility( 更改仓…...
【系统搭建】DPDK关键概念与l2fwd源码解析
DPDK(Data Plane Development Kit)是一套用于高性能网络数据面处理的开发框架,其核心设计在于绕过内核协议栈,它提供了一个用户空间下的高效数据包处理库函数,可以用于快速开发高性能的网络应用程序,如网络…...
【Qt】初识Qt(一)
目录 一、Qt的背景二、认识Qt项目 一、Qt的背景 关于客户端开发: 客户端开发的重要任务,是编写和用户交互的界面,和用户交互的界面有两种风格: TUI:命令行界面,也叫终端界面GUI:图形化界面 Q…...
Django REST framework 并结合 `mixin` 的示例
下面为你提供一个使用 Django REST framework 并结合 mixin 的示例,该示例将实现一个简单的图书管理 API。 项目需求 我们要创建一个图书管理系统的 API,支持对图书信息的创建、读取、更新和删除操作。 实现步骤 1. 项目初始化 首先,确保你已经安装了 Django 和 Django…...