排序算法之线性时间排序:计数排序,基数排序,桶排序详解
排序算法之线性时间排序:计数排序、基数排序、桶排序详解
- 前言
- 一、计数排序(Counting Sort)
- 1.1 算法原理
- 1.2 代码实现(Python)
- 1.3 性能分析
- 1.4 适用场景
- 二、基数排序(Radix Sort)
- 2.1 算法原理
- 2.2 代码实现(Java)
- 2.3 性能分析
- 2.4 适用场景
- 三、桶排序(Bucket Sort)
- 3.1 算法原理
- 3.2 代码实现(C++)
- 3.3 性能分析
- 3.4 适用场景
- 四、三种线性时间排序算法的对比与应用选择
- 总结
前言
在排序算法的大家族中,比较排序算法(如快速排序、归并排序等)的时间复杂度下限为 O ( n log n ) O(n \log n) O(nlogn)。而线性时间排序算法另辟蹊径,在特定条件下能够实现 O ( n ) O(n) O(n)的时间复杂度,大大提高了排序效率。本文我将深入介绍计数排序、基数排序和桶排序这三种典型的线性时间排序算法,从原理、实现到性能分析,结合具体代码示例,带大家全面了解它们的应用场景与优势。
一、计数排序(Counting Sort)
1.1 算法原理
计数排序是一种非比较排序算法,它适用于待排序元素的取值范围相对较小的情况。其核心思想是:统计每个元素在数组中出现的次数,然后根据统计结果将元素依次放置到正确的位置上。
具体步骤如下:
确定范围:找出待排序数组中的最大值 m a x max max和最小值 m i n min min,计算出元素的取值范围 r a n g e = m a x − m i n + 1 range = max - min + 1 range=max−min+1。
统计计数:创建一个长度为 r a n g e range range的计数数组 c o u n t count count,用于统计每个元素出现的次数。遍历待排序数组,将每个元素 n u m num num对应的 c o u n t [ n u m − m i n ] count[num - min] count[num−min]的值加 1。
累计计数:对计数数组 c o u n t count count进行累计操作,即 c o u n t [ i ] = c o u n t [ i ] + c o u n t [ i − 1 ] count[i] = count[i] + count[i - 1] count[i]=count[i]+count[i−1]( i > 0 i > 0 i>0),此时 c o u n t [ i ] count[i] count[i]表示小于等于 i + m i n i + min i+min的元素个数。
排序输出:创建一个与原数组长度相同的结果数组 o u t p u t output output,倒序遍历原数组,根据 c o u n t count count数组确定每个元素在 o u t p u t output output数组中的位置,并将元素放入,同时将 c o u n t count count数组中对应的值减 1。
1.2 代码实现(Python)
def counting_sort(arr):if not arr:return arrmax_val = max(arr)min_val = min(arr)range_val = max_val - min_val + 1count = [0] * range_valfor num in arr:count[num - min_val] += 1for i in range(1, range_val):count[i] += count[i - 1]output = [0] * len(arr)for num in reversed(arr):output[count[num - min_val] - 1] = numcount[num - min_val] -= 1return output
上述 Python 代码首先计算出元素的取值范围,创建计数数组并统计每个元素的出现次数,然后进行累计计数,最后根据计数结果将元素放入结果数组中,完成排序。
1.3 性能分析
时间复杂度:计数排序的时间复杂度为 O ( n + k ) O(n + k) O(n+k),其中 n n n是待排序数组的长度, k k k是元素的取值范围。当 k k k与 n n n同阶或 k k k相对 n n n较小时,算法的时间复杂度接近 O ( n ) O(n) O(n),表现出高效性。
空间复杂度:计数排序需要额外的计数数组和结果数组,空间复杂度为 O ( n + k ) O(n + k) O(n+k)。
稳定性:计数排序是稳定的排序算法,因为在将元素放入结果数组时,是按照原数组的顺序倒序处理的,相同元素的相对顺序不会改变。
1.4 适用场景
计数排序适用于元素取值范围有限且相对较小的场景,例如对学生成绩(分数范围通常固定)进行排序,或者对一定范围内的整数进行排序等。
二、基数排序(Radix Sort)
2.1 算法原理
基数排序也是一种非比较排序算法,它基于数字的每一位(如个位、十位、百位等)进行排序。基数排序从最低位开始,依次对每一位数字进行排序,直到最高位排序完成,最终得到有序数组。
具体步骤如下(以十进制整数为例):
确定位数:找出待排序数组中最大的数,确定其位数 d d d,例如最大数是 987 987 987,则 d = 3 d = 3 d=3。
按位排序:从个位(第 0 位)开始,依次对每一位进行排序。对于每一位,使用计数排序或其他稳定排序算法,根据该位数字的大小将元素分配到不同的桶中,然后按照桶的顺序依次取出元素,形成新的数组。重复这个过程,直到最高位排序完成。
2.2 代码实现(Java)
import java.util.ArrayList;
import java.util.List;public class RadixSort {public static int[] radixSort(int[] arr) {if (arr == null || arr.length == 0) {return arr;}int max = getMax(arr);for (int exp = 1; max / exp > 0; exp *= 10) {countingSort(arr, exp);}return arr;}private static int getMax(int[] arr) {int max = arr[0];for (int num : arr) {if (num > max) {max = num;}}return max;}private static void countingSort(int[] arr, int exp) {int[] output = new int[arr.length];int[] count = new int[10];for (int num : arr) {count[(num / exp) % 10]++;}for (int i = 1; i < 10; i++) {count[i] += count[i - 1];}for (int i = arr.length - 1; i >= 0; i--) {output[count[(arr[i] / exp) % 10] - 1] = arr[i];count[(arr[i] / exp) % 10]--;}System.arraycopy(output, 0, arr, 0, arr.length);}public static void main(String[] args) {int[] arr = {170, 45, 75, 90, 802, 24, 2, 66};int[] sortedArr = radixSort(arr);for (int num : sortedArr) {System.out.print(num + " ");}}
}
在上述 Java 代码中,radixSort
方法首先找到数组中的最大值,确定排序的位数。然后通过循环,从个位开始,每次调用countingSort
方法对当前位进行排序,最终完成整个数组的排序。
2.3 性能分析
时间复杂度:假设待排序数组的长度为 n n n,元素的最大位数为 d d d,每一位上元素的取值范围为 k k k(如十进制中 k = 10 k = 10 k=10)。基数排序需要对每一位进行排序,每次排序的时间复杂度为 O ( n + k ) O(n + k) O(n+k),总共进行 d d d次,所以时间复杂度为 O ( d ( n + k ) ) O(d(n + k)) O(d(n+k))。当 d d d和 k k k相对固定时,时间复杂度接近 O ( n ) O(n) O(n)。
空间复杂度:基数排序在每一位排序时需要额外的计数数组和临时数组,空间复杂度为 O ( n + k ) O(n + k) O(n+k)。
稳定性:由于在每一位排序时使用的是稳定排序算法(如计数排序),所以基数排序是稳定的排序算法。
2.4 适用场景
基数排序适用于对整数进行排序,特别是当整数的位数相对固定且取值范围不是特别大时,效果较好。例如对身份证号码、银行卡号等固定长度的数字序列进行排序。
三、桶排序(Bucket Sort)
3.1 算法原理
桶排序的基本思想是将待排序数组分到有限数量的桶子里,每个桶子再分别进行排序(可以使用其他排序算法,如插入排序),最后将各个桶中的元素依次取出,得到有序数组。
具体步骤如下:
确定桶的数量和范围:根据待排序数组的特点,确定桶的数量 m m m。同时,找出数组中的最大值 m a x max max和最小值 m i n min min,计算每个桶的范围 r a n g e = ( m a x − m i n + 1 ) / m range = (max - min + 1) / m range=(max−min+1)/m。
分配元素到桶中:遍历待排序数组,根据元素的值将其分配到对应的桶中。通常可以通过公式 i n d e x = ( n u m − m i n ) / r a n g e index = (num - min) / range index=(num−min)/range计算元素应该放入的桶的索引。
对每个桶进行排序:使用合适的排序算法(如插入排序)对每个桶中的元素进行排序。
合并桶中元素:按照桶的顺序,依次将每个桶中的元素取出,放入结果数组中,得到最终的有序数组。
3.2 代码实现(C++)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;void bucketSort(vector<double>& arr) {int n = arr.size();if (n == 0) return;vector<vector<double>> buckets(10);double max_val = *max_element(arr.begin(), arr.end());double min_val = *min_element(arr.begin(), arr.end());double range = (max_val - min_val + 1) / 10;for (double num : arr) {int index = (num - min_val) / range;buckets[index].push_back(num);}for (auto& bucket : buckets) {sort(bucket.begin(), bucket.end());}arr.clear();for (const auto& bucket : buckets) {for (double num : bucket) {arr.push_back(num);}}
}
上述 C++ 代码中,首先确定桶的数量为 10,计算每个桶的范围,然后将元素分配到对应的桶中。接着使用std::sort
函数对每个桶中的元素进行排序,最后将各个桶中的元素合并到原数组中,完成排序。
3.3 性能分析
时间复杂度:桶排序的时间复杂度与桶的数量、每个桶中元素的数量以及桶内使用的排序算法有关。如果桶的数量合理,且每个桶中的元素数量较少,桶内排序时间复杂度较低,整体时间复杂度可以接近 O ( n ) O(n) O(n)。但在最坏情况下,所有元素都分配到同一个桶中,此时时间复杂度退化为桶内排序算法的最坏时间复杂度(如使用插入排序时为 O ( n 2 ) O(n^2) O(n2))。
空间复杂度:桶排序需要额外的空间存储桶和桶内的元素,空间复杂度为 O ( n + m ) O(n + m) O(n+m),其中 m m m是桶的数量。
稳定性:如果桶内使用的是稳定排序算法,那么桶排序是稳定的排序算法。
3.4 适用场景
桶排序适用于数据分布较为均匀的情况,例如对大量的浮点数进行排序,或者对一定范围内的整数,且数据分布比较分散时,桶排序能够发挥较好的性能。
四、三种线性时间排序算法的对比与应用选择
排序算法 | 时间复杂度 | 空间复杂度 | 稳定性 | 适用场景 |
---|---|---|---|---|
计数排序 | O ( n + k ) O(n + k) O(n+k) | O ( n + k ) O(n + k) O(n+k) | 稳定 | 元素取值范围有限且较小 |
基数排序 | O ( d ( n + k ) ) O(d(n + k)) O(d(n+k)) | O ( n + k ) O(n + k) O(n+k) | 稳定 | 对整数排序,位数固定且取值范围不大 |
桶排序 | 理想 O ( n ) O(n) O(n),最坏 O ( n 2 ) O(n^2) O(n2) | O ( n + m ) O(n + m) O(n+m) | 取决于桶内算法 | 数据分布均匀的场景 |
在实际应用中,应根据数据的特点(如数据类型、取值范围、分布情况等)来选择合适的线性时间排序算法。如果数据满足相应算法的适用条件,线性时间排序算法能够带来比比较排序算法更高的效率,在处理大规模数据时具有显著优势。
总结
计数排序、基数排序和桶排序作为线性时间排序算法的代表,通过独特的设计思路突破了比较排序的时间限制,在特定场景下展现出高效性。它们的原理、实现方式和适用场景各有不同,理解并掌握这些算法,能够帮助我们在面对不同的排序需求时,选择最合适的解决方案。随着数据规模的不断增大,线性时间排序算法的应用价值也将愈发凸显,值得我们深入学习和研究。
That’s all, thanks for reading!
创作不易,点赞鼓励;
知识无价,收藏备用;
持续精彩,关注不错过!
相关文章:
排序算法之线性时间排序:计数排序,基数排序,桶排序详解
排序算法之线性时间排序:计数排序、基数排序、桶排序详解 前言一、计数排序(Counting Sort)1.1 算法原理1.2 代码实现(Python)1.3 性能分析1.4 适用场景 二、基数排序(Radix Sort)2.1 算法原理2…...
HarmonyOS 开发之 —— 合理使用动画与转场
HarmonyOS 开发之 —— 合理使用动画与转场 谢谢关注!! 前言:上一篇文章主要介绍HarmonyOs开发之———UIAbility进阶:https://blog.csdn.net/this_is_bug/article/details/147976323?spm=1011.2415.3001.10575&sharefrom=mp_manage_link 在移动应用开发中,动画与转…...
网络流量分析 | NetworkMiner
介绍 NetworkMiner 是一款适用于Windows(也适用于Linux/Mac)的开源网络取证分析工具。它可被用作被动网络嗅探器/数据包捕获工具,也可被用于检测操作系统、会话、主机名、开放端口等,还能被用于解析pcap文件进行离线分析。点击此…...
EtherCAT转ProfiNet智能网关选型策略匹配S7-1500与CX5140通讯需求的关键参数对比
一、案例背景 随着新能源行业的迅猛发展,锂电池生产制造企业面临着日益激烈的市场竞争和不断增长的生产需求。某锂电池生产企业在扩大产能的过程中,新建了一条锂电池生产线。该生产线采用了倍福CX5140PLC作为EtherCAT协议主站,控制着涂布机、…...
适合学校使用的桌面信息看板,具有倒计时、桌面时钟、课程表、天气预报、自动新闻联播、定时关机、消息通知栏、随机点名等功能。
简介 教育时钟(Education Clock) 是一款致力于帮助学习者科学规划学习时间、提高学习效率的开源工具。由 Return-Log 团队开发,适配多平台(Windows、Mac、Linux),界面简洁直观,操作便捷。通过设…...
兰亭妙微设计:为生命科技赋予人性化的交互语言
在医疗科技日新月异的今天,卓越的硬件性能唯有匹配恰如其分的交互语言,方能真正发挥价值。作为专注于医疗UI/UX设计的专业团队,兰亭妙微设计(www.lanlanwork.com)始终相信:每一处像素的排布,都应…...
redis数据结构-12(配置 RDB 快照:保存间隔和压缩)
配置 RDB 快照:保存间隔和压缩 Redis 持久性对于确保在服务器重启或发生故障时数据不会丢失至关重要。虽然 Redis 以其内存中数据存储而闻名,但它提供了将数据持久化到磁盘的机制。本章节重点介绍其中一种机制:Redis 数据库 (RDB…...
SG7050VAN差分晶振,X1G0042810033,EPSON爱普生以太网6G晶振
产品简介 SG7050VAN差分晶振,X1G0042810033,EPSON爱普生以太网6G晶振,日本EPSON爱普生株式会社,进口晶振型号:SG7050VAN,编码为:X1G0042810033,频率为:156.250000 MHz,小体积晶振尺…...
nfs网络文件系统
nfs网络文件系统简介 NFS (Network File system ,网络文件系统)是由SUN公司研制的UNIX表示层协议,它允许网络中的计算机(不同的计算机、不同的操作系统)之间通过TCP/IP网络共享资源,主要在unix系列操作系统上使用。在NFS的应用中,本地NFS的客…...
西安前端面试
面试1 1.vue2和vue3的原理及区别 2.伪数组 3.对箭头函数怎么理解的 4.vue父子组件传值的几种方式 5.对Promise的理解 面试2 1.两个升序数组实现合并升序排序 2.数组拍平[3, [[7, [1, 5]], 4], 8, [6]] 面试3 1.let var const的区别,什么时候const能改变 …...
Linux常用命令42——tar压缩和解压缩文件
在使用Linux或macOS日常开发中,熟悉一些基本的命令有助于提高工作效率,tar 是 Linux 和 Unix 系统中用于归档文件和目录的强大命令行工具。tar 名字来自 "tape archive"(磁带归档),最初用于将文件打包到磁带…...
AML 数据集
在公开的AML(急性髓性白血病)数据集中,有几个包含图像和多组学数据的资源,且部分带有生存状态和生存时间的标签。以下是一些相关数据集: 1. TCGA-AML (The Cancer Genome Atlas - Acute Myeloid Leukemia) 描述&…...
什么是Rosetta?
Apple 提供的「动态二进制翻译器」,让基于 Intel 的 x86_64 应用/二进制在 Apple Silicon(M1/M2/M3,ARM 架构)上运行 项目说明🧠 Rosetta 2是 Apple 提供的一种「Intel → ARM 翻译器」🖥️ 功能让你的 AR…...
Redis解析
Redis解析 一、单线程模型 redis在io层面是多线程的,在数据处理层面是单线程的。 多线程一般用于: 关闭连接删除/淘汰内存网络IO 1.1 io多路复用 redis使用nio(select、poll、epoll)的方式处理socket 主线程负责接收建立连接…...
轨迹误差评估完整流程总结(使用 evo 工具)
roslaunch .launch rosbag play your_dataset.bag -r 2.0 ✅ 第二步:录制估计轨迹 bash 复制编辑 rosbag record -O traj_only.bag /aft_mapped_to_init 运行一段时间后 CtrlC 停止,生成 traj_only.bag 第三步:提取估计轨迹和真值轨迹为…...
服务器死机了需要检查哪些问题
在这个数字化的时代,服务器就像是我们信息世界的“大管家”,可要是它突然死机了,那可真是让人头疼。今天咱们就来聊聊,服务器死机了,到底需要检查哪些问题。 一、硬件问题 电源供应:检查电源是否稳定&…...
秒杀案例讲解
技术择型 Springboot 接收请求并操作 redis 和 mysqlRedis 用于缓存分布式锁Rocketmq 用于解耦 削峰,异步Mysql 用于存放真实的商品信息Mybatis 用于操作数据库的 orm 框架 架构图 spike-web(接受用户秒杀请求) pom.xml <?xml versio…...
Qt图表绘制(QtCharts)- 性能优化(13)
文章目录 1 批量替换代替追加1.1 测试11.2 测试21.3 测试3 2 开启OpenGL2.1 测试12.2 测试22.3 测试32.4 测试4 更多精彩内容👉内容导航 👈👉Qt开发 👈👉QtCharts绘图 👈👉python开发 …...
[逆向工程]DebugView捕获WPS日志?解析未运行WPS时Shell扩展加载的原因与解决方案(二十五)
[逆向工程]DebugView捕获WPS日志?解析未运行WPS时Shell扩展加载的原因与解决方案(二十五) 引言:一个“幽灵”般的日志问题 你是否在使用 DebugView 排查系统问题时,发现日志中频繁出现 WPS 相关模块(如 k…...
【打破信息差】萌新认识与入门算法竞赛
阅前须知 XCPC萌新互助进步群2️⃣:174495261 博客主页:resot (关注resot谢谢喵) 针对具体问题,应当进行具体分析;并无放之四海而皆准的方法可适用于所有人。本人尊重并支持每位学习者对最佳学习路径的自主选择。本篇所列训练方…...
Ai Agent革命:不是流程驱动,而是模型为魂
前言:AI 智能体的未来:模型才是“主旋律”,工作流只是“插曲” 在 AI 智能体的未来舞台上,模型本身才是永恒的“主旋律”,而工作流不过是短暂的“插曲”。以 Manus 为例,其基于“预先编排好的提示词与工具…...
使用CherryStudio +SiliconFlow 部署独立的deepseek+知识库
deepseek知识库,独立的deepseek 首先我们先了解 CherryStudio?SiliconFlow? CherryStudio是一个支持多平台的AI客户端,我们致力于让更多人能够享受到AI带来的便利。 简单来说,它是一个能让普通人轻松用上AI 的「万能工…...
【leetcode】94. 二叉树的中序遍历
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root [] 输出:[] 示例 3: 输入:root [1] 输出…...
OpenCV阈值处理完全指南:从基础到高级应用
引言 阈值处理是图像处理中最基础、最常用的技术之一,它能够将灰度图像转换为二值图像,为后续的图像分析和处理奠定基础。本文将全面介绍OpenCV中的各种阈值处理方法,包括原理讲解、代码实现和实际应用场景。 一、什么是阈值处理࿱…...
源码与二进制包区别
文章目录 源码包与二进制包的区别及选择建议概述核心区别对比1. 内容组成2. 安装复杂度3. 灵活性4. 依赖管理5. 安全性 选择建议适合使用**源码包**的场景:适合使用**二进制包**的场景: 总结 源码包与二进制包的区别及选择建议 概述 在常见的Linux安装…...
NAT转换和ICMP
NAT nat原理示意 nat实现 ICMP ICMP支持主机或路由器: 差错或异常报告网络探寻 2类icmp报文: 差错报告报文(5种) 目的不可达源抑制--拥塞控制超时&超期--TTL超时参数问题--问题报文丢弃重定向--不应该由这个路由器转发&a…...
No module named‘serial‘解决办法
jksjks-VMware-Virtual-Platform:~/gx$ sudopython3py.py Traceback (most recent call last): File "py.py",line 1, in <module> import serial.tools.list_ports ModuleNotFoundError: No module namedserial 这个报错意思是缺少serial模块 解决方法也很简…...
用 Gensim 实现 Word2Vec 古诗生成
向量操作。我们将借助它完成从语料处理到古诗生成的全流程。 6.1 环境搭建与库导入 首先安装 Gensim 及依赖库: bash pip install gensim numpy pandas 导入必要模块: python 运行 from gensim.models import Word2Vec # 核心词向量模型 from r…...
【图像生成1】Latent Diffusion Models 论文学习笔记
一、背景 本文主要记录一下使用 LDMs 之前,学习 LDMs 的过程。 二、论文解读 Paper:[2112.10752] High-Resolution Image Synthesis with Latent Diffusion Models 1. 总体描述 LDMs 将传统 DMs 在高维图像像素空间(Pixel Space&#x…...
MapReduce Shuffle 全解析:从 Map 端到 Reduce 端的核心数据流
一、Shuffle 的本质定位:MapReduce 的核心枢纽 Shuffle 过程涵盖 MapTask 的后半程与 ReduceTask 的前半程,具体指从 map 方法输出到 reduce 方法输入之间的整个数据处理链路。它承担着三大核心使命: 数据分区:决定数据归属…...
架构与UML4+1视图
简单对比分析 架构41视图 架构41视图是由Philippe Kruchten提出的,用于描述软件系统的架构。它包括以下五个视图: 逻辑视图:描述系统的功能需求,展示系统的静态结构,通常使用类图、对象图等。开发视图:…...
nosqlbooster pojie NoSQLBooster for MongoDB
测过可用,注意 asar的安装使用报错改用 npx asar extract app.asar app 路径 C:\Users{computerName}\AppData\Local\Programs\nosqlbooster4mongo\resources npm install asar -g asar extract app.asar app 打开shared\lmCore.js 修改MAX_TRIAL_DAYS3000 修改…...
UI自动化测试中,一个完整的断言应所需要考虑的问题
在UI自动化测试中,一个完整的断言应全面覆盖用户界面(UI)的功能性、交互性和视觉正确性。以下是断言需要包含的核心内容及详细说明: 一、基础元素验证 存在性断言 验证元素存在于DOM中示例代码(Python + Selenium):assert driver.find_element(By.ID, "submit_btn&…...
电脑出故障驱动装不上?试试驱动人生的远程服务支持
在日常工作或学习中,驱动问题时常成为电脑用户的一大困扰。尤其是在更换硬件、重装系统、驱动冲突等情况下,许多用户往往手足无措,不知道从何下手。而“驱动人生”作为国内领先的驱动管理工具,一直以高效、便捷、智能著称。现在&a…...
机器学习第十五讲:决策树全面讲解:像玩“20个问题“游戏猜身份[特殊字符]
机器学习第十五讲:决策树全面讲解:像玩"20个问题"游戏猜身份🎮 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署&…...
基于Rust语言的Rocket框架和Sqlx库开发WebAPI项目记录(二)
参数结构体模块 在src目录下新建params文件夹 在params文件夹下依次新建req.rs、resp.rs、result_parse.rs、mod.rs 目录结构如下: project |—src |—params //封装参数结构体模块 |—req.rs //封装请求参数结构体 |—resp.rs //封装返回数据结构体 |—resu…...
Centos7系统(最小化安装)安装zabbix7版本详细文章、nginx源代码配置、php源代码、mysql-yum安装
zabbix官网链接下载zabbix源代码安装包 选择zabbix版本(此文章使用zabbix7.0版本) 安装之前由于是最小化安装centos7安装一些开发环境和工具包 文章使用国内阿里源 cd /etc/yum.repos.d/;curl -O https://mirrors.aliyun.com/repo/epel-7.repo;curl -…...
rocketmq 环境配置[python]
因本人是 python 开发,macbook 开发。windows 可以采取配置远程 linux 解释器或者 pycharm 专业版的 docker 解释器进行开发 M1 芯片 本地运行 rocketmq rocketmq Python 开源地址: https://github.com/apache/rocketmq-client-python 因为需要 linu…...
前端学习(4)—— JavaScript(基础语法)
目录 一,介绍 1.1 是什么 1.2 组成 1.3 书写形式 1.4 输入输出 二,变量的使用 2.1 基本用法 2.2 动态类型 三,基本数据类型 3.1 数字类型 3.2 字符串类型 3.3 布尔类型 3.4 未定义数据类型 3.5 空值类型 四,运算符…...
简单介绍C++中线性代数运算库Eigen
Eigen 是一个高性能的 C 模板库,专注于线性代数、矩阵和向量运算,广泛应用于科学计算、机器学习和计算机视觉等领域。以下是对 Eigen 库的详细介绍: 1. 概述 核心功能:支持矩阵、向量运算,包括基本算术、矩阵分解&…...
原生小程序+springboot+vue+协同过滤算法的音乐推荐系统(源码+论文+讲解+安装+部署+调试)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统背景 在数字音乐产业迅猛发展的当下,Spotify、QQ 音乐、网易云音乐等音乐平台的曲…...
[特殊字符] 如何优雅地避免 SQL 多表 LEFT JOIN 造成的笛卡尔积放大问题?
在实际项目开发中,我们经常需要从多个数据表中统计和聚合项目相关数据。但如果处理不当,多表 LEFT JOIN 容易造成 数据行数异常放大 的问题,也就是我们常说的“笛卡尔积放大”。 本文通过一个简单示例,直观讲清问题产生的原因&am…...
哈希表实现(1):
1. 哈希: 之前我们的红黑数的查找是由于左边小右边大的原则可以快速的查找,我们这里的哈希表呢? 这里是用过哈希函数把关键字key和存储位置建立一个关联的映射。 直接定址法(函数函数定义的其中一种): 直…...
【流程控制结构】
流程控制结构 流程控制结构1、顺序结构2、选择结构if基本选择结构if else语法多重if语法嵌套if语法switch选择结构 3、循环结构循环结构while循环结构程序调试for循环跳转语句区别 流程控制结构 1、顺序结构 流程图 优先级 2、选择结构 if基本选择结构 单if 语法 if&…...
敏捷-第二章 敏捷宣言与原则
敏捷宣言与原则之间的关系 将敏捷明确表述为一种思维模式,它由《敏 捷宣言》的价值观所界定,受敏捷原则指导, 4通过各种实践实现敏捷不是指某一种具体的方法论、过程或框架,而是一组价值观和原则。 敏捷宣言(Manifesto)的4大价值…...
UAI 2025重磅揭晓:录取数据公布(附往届数据)
近日,第41届UAI公布了论文录用结果。本次大会共收到 750篇有效论文投稿,最终录用230篇,录用率为30.7%。录取率较去年(UAI 2024)相比有所上升(录取率:26.88%)。 会议概览 人工智能不…...
京东方10.1寸工业液晶屏GV101WXM-N80
第一篇:规格参数总览 产品标称 京东方(BOE) GV101WXM-N85 工业级显示单元 核心应用方向 教学终端设备|工业便携装置|车载控制系统 面板属性 非晶硅TFT液晶技术|全视角显示模式联合常暗配置 物理规格 对角线长度25.7cm&…...
实例分割AI数据标注 ISAT自动标注工具使用方法
文章目录 🌕ISAT安装和启动方法🌕下载和使用AI分割模型🌙SAM模型性能排行🌙手动下载sam模型 & sam模型下载路径🌕使用方法🌙从file中导入图片🌙点击左上角的图标进入分割模式🌙鼠标左键点击画面中的人则自动标注🌙点击右键该区域不标注🌙一个人一个人的…...
软件架构风格系列(4):事件驱动架构
文章目录 前言一、从“用户下单”场景看懂事件驱动核心概念(一)什么是事件驱动架构?(二)核心优势:解耦与异步的双重魔法 二、架构设计图:三要素构建事件流转闭环三、Java实战:从简单…...
软件架构风格系列(2):面向对象架构
文章目录 引言一、什么是面向对象架构风格1. 定义与核心概念2. 优点与局限性二、业务建模:用对象映射现实世界(一)核心实体抽象1. 员工体系2. 菜品体系 (二)封装:隐藏实现细节 三、继承实战:构建…...