【C++】数据结构 九种排序算法的实现
本篇博客给大家带来的是直接插入、希尔、直接选择、堆、冒泡、快速、归并、计数、排序算法的实现!
🐟🐟文章专栏:数据结构
🚀🚀若有问题评论区下讨论,我会及时回答
❤❤欢迎大家点赞、收藏、分享!
今日思想:疯狂的不是我,是整个世界!
一、常见排序算法
二、插入排序
插入排序:把待排序的值按大小一个个插入到有序的序列中,例如:玩扑克牌。
1、直接插入排序
我们看一下这个数组,这是一个降序的数组,我们让它变成升序。
步骤:
一开始我们定义两个值(end和tmp): end = 0,tmp= arr [ end+1 ], 然后进行比较(如果arr[end]>tmp,就arr[end+1] = arr[ end ],然后end--,这时候end= - 1,end<0,再把arr[ end+1 ] = tmp)。
接下来end来到下标为1的值那里,tmp保存下标为2的值,然后再比较(比较方法和上面一样)。
重复上面的步骤之后:
思想风暴:
代码实例:
//直接插入排序
void InserSort(int* arr, int n)
{for (int i = 0; i < n - 1; i++){int end = i;int tmp = arr[end + 1];while (end >= 0){if (arr[end] > tmp){arr[end + 1] = arr[end];end--;}else{break;}}arr[end + 1] = tmp;}
}
时间复杂度:
最差情况:O(n^2)数组为降序,当大部分大的值放到数组前面,大部分小的值放到数组的后面,时间复杂度近似最差情况。
最好情况:O(n)数组为升序,当大部分的值放到数组的后面,大部分小的值放到数组的前面,时间复杂度近似最好情况。
空间复杂度:O(1)
2、希尔排序
希尔排序是在直接插入排序的基础上优化的,通过一系列的分组把大部分大的数据放到数组的后面来降低时间复杂度。
步骤:
注意:上面有10个数字,一开始gap=10,gap=gap/3+1之后gap=4,由于一些原因这里的gap=5,但是不影响讲解。gap是组数和两个数字之间的距离例如9到4的距离是5。上面排序完之后的数据不是最终有序数据而是当gap=5时排序完之后的数据。
首先:进行分组之后,我们进行排序,这里的排序跟直接插入排序差不多,我们让end=0,tmp=arr[end+gap],然后就是比较大小,end-=gap,之后arr[end+gap]=tmp;
接着end++
经过一系列end++之后
排序完之后gap=gap/3+1,再接着完成上面的步骤,最终为:
只要gap>1,就继续分组排序。
注意:当gap=1时并没有判断gap>1,gap=1是在gap=2判断结束之后gap=1,所以还会继续执行排序。当gap=1时跟直接插入排序没什么区别了,不过大部分大的数据放到数组的后面了,大大降低了时间复杂度。
代码实例:
//希尔排序
void ShellSort(int* arr, int n)
{int gap = n;while (gap > 1){gap = gap / 3 + 1;for (int i = 0; i < n - gap; i++){int end = i;int tmp = arr[end + gap];while (end >= 0){if (arr[end] > tmp){arr[end + gap] = arr[end];end -= gap;}else{break;}}arr[end + gap] = tmp;}}
}
希尔排序时间复杂度:O(n^1.3)
推演:
外层循环时间复杂度:我们可以直接给出外层时间复杂度为:O(log2^n)或者O(log3^n),即O(logn)。原因:外层循环就是上面while循环,他的时间复杂度看gap/2还是gap/3.
内层循环:假设n=9,若gap=3,则一共gap组,每组n/gap个数据。
根据上面的图我们来分析一下第一组数据移动的次数:第一组3个数据,次数移动=1+2=3。
假设有n个数据,一共gap组每组n/gap个数据
因为一共有gap组,所以总的移动次数:gap*[1+2+3.....(n/gap-1)]
注意:上面的公式是由上面的1+2=3推来的,2是每组的数据个数-1的来的,所以n/gap-1。
gap取值:n/3,n/9,n/27.....1
注意:一开始gap=n,所以gap和n没啥区别,这里不用gap/3+1,因为+1是一个非常小的值,在时间复杂度里面不算什么。
当gap为n/3时,移动总数为:n/3*(1+2)=n
注意:套用上面的公式:gap*[1+2+3+....+(n/gap-1)]
当gap/9时,移动总数为:n/9*[1+2+3+....+8]=(n/9)*([8(1+8)]/2)=4n
注意:([8(1+8)]/2)这个是由等差求和公式得来的
。。。。。
最后gap肯定得1,这时候就是直接插入排序,当然这时候大的数据大部分放到数组的后面,所以移动总是近似为:n
总结:移动总数一开始慢慢变大,达到顶点之后慢慢变小近似n,没有达到n。
注意:顶点我们目前无法求取,为什么呢,因为涉及一些目前数学上未解决的问题。
我们只要知道根据《数据结构(C语言版)》——严蔚敏给出的希尔排序的时间复杂度为O(n^1.3)就行。
三、选择排序
基本思想:每一次从待排序的数据元素中选出一个最小或者最大的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
图解:
1、直接选择排序
直接选择是定义begin和end两个变量,begin起始位置在数组下标为0的数字,end的起始位置在最后一个数字那里,我们又定义两个变量maxi和mini,他们的起始位置都在下标为0那里,再定义一个变量 i 一开始i=begin,它遍历数组的数据只要 i > maxi 那么maxi = i,如果 i < mini,那么minx=i,最后 maxi 和 end 交换位置,mini 和 begin 交换位置,begin++,end-- 。重复以上的操作得到最后的升序序列。
注意:i 遍历数组的范围 [ begin , end ]
思想风暴:
图解:
关于上面细节的解释:
代码实例:
void Swap(int* x, int* y)
{int tmp = *x;*x = *y;*y = tmp;
}
//直接选择排序
void SelectSort(int* arr, int n)
{int begin = 0, end = n - 1;while (begin < end){int mini = begin, maxi = begin;for (int i = begin; i <= end; i++){if (arr[i] > arr[maxi]){maxi = i;}else if (arr[i] < arr[mini]){mini = i;}}if (maxi == begin){maxi = mini;}Swap(&arr[begin], &arr[mini]);Swap(&arr[end], &arr[maxi]);begin++;end--;}
}
时间复杂度:O(n^2)
2、堆排序
关于堆排序之前我的一篇博客说过,这里就不再细讲了,具体内容请看博客:
【C++】树和二叉树的实现(上)-CSDN博客
【C++】树和二叉树的实现(下)-CSDN博客
注意:第一个博客是为第二个博客做铺垫,堆排序就是第二个博客内容的建大堆和小堆。
四、交换排序
关键:大的值向序列的尾部移动,小的往前面移动。
1、冒泡排序
通过一个个值的比较,达到最佳位置。
图解:
思想风暴:
时间复杂度:O(n^2)
空间复杂度:O(1)
代码实例:
void Swap(int* x, int* y)
{int tmp = *x;*x = *y;*y = tmp;
}//冒泡排序
void BubbleSort(int* arr, int n)
{int k = 0;//标记,如果经过一系列的交换k还是等于0,表示这个数组的有序的for (int i = 0; i < n; i++){for (int j = 0; j < n - 1; j++){if (arr[j] > arr[j + 1]){Swap(&arr[j], &arr[j + 1]);k = 1;}}if (k == 0){break;}}
}
2、快速排序
2.1递归版本
快速排序是Hoare在1962年提出的一种二叉树结果的交换排序方法,其实就是递归。思想:通过寻找序列的基准值,然后将待排序分成两部分序列,然后将这两个序列排序,再将这两个序列再分,重复分,最后得到有序序列。
图解:
思想风暴:
代码实例:
void Swap(int* x, int* y)
{int tmp = *x;*x = *y;*y = tmp;
}
int _QuickSort(int* arr, int left, int right)
{int keyi = left;left++;while (left <= right){while (left <= right && arr[right] > arr[keyi]){right--;}while (left <= right && arr[left] < arr[keyi]){left++;}if (left <= right){Swap(&arr[left++], &arr[right--]);}}Swap(&arr[keyi], &arr[right]);return right;
}
}
//快速排序
void QuickSort(int* arr, int left, int right)
{if (left >= right){return;}//找基准值int keyi = _QuickSort(arr, left, right);//左序列[left,keyi-1] 右序列:[keyi+1,right]QuickSort(arr, left, keyi - 1);QuickSort(arr, keyi+1,right);
}
时间复杂度:O(nlogn)
注意:如果基准值找的不好或者序列有序,时间复杂度为O(n^2)。例如:
那么这里有个更好找基准值的办法:
lomuto前后指针找基准值法:
创建三个变量(keyi,cur,prev),keyi指向第一个数据,prev一开始指向第一个数据,cur指向prev+1。cur在前面找比keyi指向的值小的数据,找到:prev++,arr[ prev ]和arr[ cur ]交换(注意当当 prev = cur 时不能交换)之后 cur++,找不到:cur++。当cur越过数组下标的最大值时交换arr[ prev ]和arrp[ keyi ]并且返回 prev ,此时 prev 就是基准值。
图解:
代码实例:
int _QuickSort2(int* arr, int left, int right)
{int keyi = left;int prev = left, cur = prev + 1;while (cur <= right){if (arr[cur] < arr[keyi] && ++prev != cur){Swap(&arr[prev], &arr[cur]);}cur++;}Swap(&arr[prev], &arr[keyi]);return prev;
}
//快速排序
void QuickSort(int* arr, int left, int right)
{if (left >= right){return;}//找基准值int keyi = _QuickSort2(arr, left, right);//左序列[left,keyi-1] 右序列:[keyi+1,right]QuickSort(arr, left, keyi - 1);QuickSort(arr, keyi+1,right);
}
2.2非递归版本
我们上面利用了递归来实现对数组不断的裂开进而通过找基准值来排序,那么不用递归我们怎么实现裂开数组然后对数组找基准值来排序呢?答案是:我们通过栈来实现,把数组的下标入栈栈,不断的出栈和入栈来实现递归的裂开。
注意:如果大家对栈有点遗忘可以看一下我写的博客:
【C++】数据结构 栈的实现_c++ 栈实例-CSDN博客
图解:
代码实例:
int _QuickSort2(int* arr, int left, int right)
{int keyi = left;int prev = left, cur = prev + 1;while (cur <= right){if (arr[cur] < arr[keyi] && ++prev != cur){Swap(&arr[prev], &arr[cur]);}cur++;}Swap(&arr[prev], &arr[keyi]);return prev;
}
//非递归版本的快速排序
void QuickSortNonR(int* arr, int left, int right)
{ST st;STInit(&st);StackPush(&st, right);StackPush(&st, left);while (!StackEmpty(&st)){//取两次栈顶int begin = StackTop(&st);StackPop(&st);int end = StackTop(&st);StackPop(&st);//找基准值int keyi = _QuickSort2(arr, begin, end);//左序列:【begin,keyi-1】右序列:【keyi+1,end】if (keyi + 1 < end){StackPush(&st, end);StackPush(&st, keyi + 1);}if (begin < keyi - 1){StackPush(&st, keyi - 1);StackPush(&st, begin);}}STDestroy(&st);
}
五、归并排序
归并排序就是把一个数组不断的分成两个数组,最终分成单个数据,让后不断的两两比较把单个数据合并。
图解:
代码实例:
void _MergeSort(int* arr, int left, int right, int* tmp)
{//分解if (left >= right){return;}int mid = (left + right) / 2;//划分左右两个序列:【left,mid】【mid+1,right】_MergeSort(arr, left, mid, tmp);_MergeSort(arr, mid + 1, right, tmp);//合并两个序列:[left,mid] [mid+1,right]int begin1 = left, end1 = mid;int begin2 = mid + 1, end2 = right;int index = begin1;while (begin1 <= end1 && begin2 <= end2){if (arr[begin1] < arr[begin2]){tmp[index++] = arr[begin1++];}else{tmp[index++] = arr[begin2++];}}//右序列的数据没有完全放到tmp数组中//左序列的数据没有完全放到tmp数组中while (begin1 <= end1){tmp[index++] = arr[begin1++];}while (begin2 <= end2){tmp[index++] = arr[begin2++];}//把数据放回到原来的数组中for (int i = left; i <= right; i++){arr[i] = tmp[i];}
}
//归并排序
void MergeSort(int* arr, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);_MergeSort(arr, 0, n - 1, tmp);free(tmp);
}
时间复杂度:O(n^logn)
六、总结
运行时间:堆排序 < 快速排序 < 希尔排序 < 归并排序 < 直接插入排序 < 直接选择排序 < 冒泡排序。
建议使用前四种排序方法。
七、附加算法(计数排序)
计数排序又称鸽巢原理,是对哈希直接定址法的变形应用。
规则:统计相同数据出现的次数,把次数放到数组里面进而排序。
图解:
注意:如果序列的值相差的值太大就不能用计数排序。例如:1,4,5,6,10000,10。申请空间范围range=10000-1=9999,造成空间浪费。
代码实例:
//非比较排序——计数排序
void CountSort(int* arr, int n)
{int min = arr[0], max = arr[0];//默认最大值和最小值都是arr[0]for (int i = 1; i < n - 1; i++)//找最大值和最小值{if (arr[i] < min){min = arr[i];}if (arr[i] > max){max = arr[i];}}int range = max - min + 1;int* count = (int*)malloc(sizeof(int) * range);if (count == NULL){perror("malloc fail!");}memset(count, 0, sizeof(int) * range);for (int i = 0; i < n; i++){count[arr[i] - min]++;}//把数据回原来的数组int index = 0;for (int i = 0; i < range; i++){while(count[i]--){arr[index++] = i + min;}}
}
时间复杂度:O(n*range)
八、稳定性
稳定性就是一个数组的任意两个数据经过排序之后前后顺序不变。
例如:a,n,b,c,d,e,f经过排序之后a还在b的前面。
目前来说以上这么多的排序算法只有冒泡排序、归并排序、直接插入排序稳定其他都不稳定。
完!!!!
相关文章:
【C++】数据结构 九种排序算法的实现
本篇博客给大家带来的是直接插入、希尔、直接选择、堆、冒泡、快速、归并、计数、排序算法的实现! 🐟🐟文章专栏:数据结构 🚀🚀若有问题评论区下讨论,我会及时回答 ❤❤欢迎大家点赞、收藏、分享…...
【数据结构与算法】跳表实现详解
文章目录 Ⅰ. 前言Ⅱ. 跳表(skiplist)一、什么是跳表二、跳表的发明历程三、跳表的搜索方式Ⅲ. skiplist的算法性能分析一、理论准备二、性能分析(了解即可,主要记结论)Ⅳ. skiplist与平衡树、哈希表的比较Ⅴ. skiplist的实现[ 设计跳表](https://leetcode.cn/problems/de…...
2025年“深圳杯”数学建模挑战赛B题-LED显示屏颜色转换设计与校正
LED显示屏颜色转换设计与校正 小驴数模 问题的背景 走在晚风都市,或春日田野,我们都会看到一个色彩斑斓的世界。色彩是我们对世界一种重要感知。什么是色彩,或颜色?颜色是光作用于人眼引起的视觉感知现象,它与物体的…...
毕业论文 | 基于C#开发的NMEA 0183协议上位机
以下是基于C#开发的NMEA 0183协议上位机完整实现方案,包含串口通信、数据解析与可视化功能: 基于C#开发的NMEA 0183协议上位机 一、项目结构二、核心代码实现1. 数据模型定义2. 串口通信管理3. NMEA协议解析核心4. 主界面实现(Windows Forms)三、界面设计关键元素(需在窗体…...
【Scrapy】简单项目实战--爬取dangdang图书信息
目录 一、基本步骤 1、新建项目 :新建一个新的爬虫项目 2、明确目标 (items.py):明确你想要抓取的目标 3、制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页 4、存储内容 (p…...
Linux架构篇、第1章_01架构的介绍HTTP HTTPS 协议全面解析
题目:HTTP/HTTPS 协议全面解析:原理、区别与状态码详解 版本号: 1.0,0 作者: 老王要学习 日期: 2025.04.30 适用环境: 服务器 文档说明 本文围绕 HTTP/HTTPS 协议展开,详细介绍了协议的基本概念、工作原理、两者之间的区别以及常见的状态码…...
Python 刷题记录(持续更新)
Python 刷题记录(持续更新) 主要是 PythonTip 里的题目 刷题网站 【PythonTip】1.分秒转换 def convert_to_seconds(minutes):second minutes * 60return second# 输入分钟 input_minutes int(input())# 调用函数 print(convert_to_seconds(input…...
核心技能:ArcGIS洪水灾害普查、风险评估及淹没制图
查看原文>>>ArcGIS 在洪水灾害普查、风险评估及淹没制图中的实践技术应用 【内容简述】: 水旱灾害风险普查是全国自然灾害综合风险普查的重要组成部分。其中,我国有超过 60%的国土面积、90%以上的人口均受到不同程度的洪水威胁,重…...
MySQL explain
1 EXPLAIN执行结果下各字段含义 (1) id 含义:标识查询中每个 SELECT 子句的唯一编号。规则:相同 id:按从上到下的顺序执行。不同 id:值越大,优先级越高(先执行)。NULL:表示该行是 …...
数据结构每日一题day14(链表)★★★★★
题目描述:试编写算法将带头结点的单链表就地逆置,所谓“就地”就是空间复杂度为O(1)。 算法思想: 1.初始化: 定义三个指针 prev、curr、next,分别表示前驱节点、当前节点和后继节点。 prev 初始化为 NULL…...
Java继承中super的使用方法
super 关键字在 Java 中用于访问父类的成员(包括字段、方法和构造函数)。当你在子类中调用父类的方法或访问父类的成员变量时,super 是必不可少的工具。 🔑 super 的基本用法 1. 调用父类的构造方法 在子类的构造方法中&#x…...
2025东三省B题深圳杯B题数学建模挑战赛数模思路代码文章教学
完整内容请看文章最下面的推广群 一、问题一的模型构建与优化(RGB颜色空间转换模型) 基础模型(线性映射模型)/高斯过程回归模型(GPR): 针对高清视频源(BT2020标准)与普通…...
K8S - GitOps 入门实战 - 自动发布与秒级回滚
引言 传统运维依赖手动执行 kubectl apply或脚本推送应用,存在环境差异、操作记录缺失、回滚缓慢等痛点。 GitOps以 Git 为唯一可信源,通过声明式配置和版本化回滚,重构 Kubernetes 交付流程,带来以下优势: • 环境…...
第六章 流量特征分析-常见攻击事件 tomcat wp
1、在web服务器上发现的可疑活动,流量分析会显示很多请求,这表明存在恶意的扫描行为,通过分析扫描的行为后提交攻击者IP flag格式:flag{ip},如:flag{127.0.0.1} 可看见有大量的IP为:14.0.0.120的ip攻击10.0.0.112。 2、找到攻击者…...
Axure RP 快速上手指南:安装配置与实战技巧
以下是Axure RP的中文安装与使用指南: 1. 下载Axure RP Axure RP提供下载地址:https://pan.quark.cn/s/cc957c429c1c 2. 安装Axure RP Windows系统: 双击下载的 .exe 文件。 按提示完成安装(接受协议、选择安装路径等ÿ…...
【Dockerfile】Dockerfile打包Tomcat及TongWeb应用镜像(工作实践踩坑教学)
文章目录 前言准备工作目录结构准备基础镜像准备dockerfile开发(TongWeb)dockerfile开发(Tomcat)dockerfile镜像命令(排查问题基本够用) 更多相关内容可查看 前言 本文仅应用于完成此项工作,后…...
第16届蓝桥STEMA真题剖析-2025年1月12日Scratch初/中级组
[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥真题解析系列教程第223讲。 第16届第4次蓝桥STEMA已于2025年1月12日正式落下帷幕,比赛仍然采取线上形式。这是Scratch…...
文件读取操作
如果需要从文件读入数据,并把输出数据保存为文件,需要使用文件读取。 freopen为file reopen,意为文件重新打开,实现重定向标准输入输出第一个参数为文件名可以修改,输入文件为.in,输出文件为.out第二个参数…...
服务容错治理框架resilience4jsentinel基础应用---微服务的限流/熔断/降级解决方案
写在前文:hystrix停止维护,不做总结; 本文主要总结sentinel和resilience4j这两个框架;另外额外补充面试可能会问到的限流算法; 目录 限流算法 漏桶算法 计数器算法 令牌桶算法 resilience4j与sentinel resilie…...
信创系统图形界面开发指南:技术选择与实践详解
信创系统图形界面开发指南:技术选择与实践详解 🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书&…...
六、UI自动化测试06--PO设计模式
目录 一、PO 设计模式1. v1 版本1.1 v1.11.2 v1.2 2. v2 版本3. ⽅法封装套路4. v3 版本4.1 浏览器对象管理类的实现4.2 浏览器对象管理类的优化4.3 浏览器对象管理类的使⽤4.4 获取弹窗信息⽅法的封装 5. PO 设计模式6. v4 版本6.1 PO⻚⾯元素封装步骤6.2 测试⽤例的最终代码样…...
电子病历高质量语料库构建方法与架构项目(智能数据目录篇)
电子病历高质量语料库的构建是医疗人工智能发展的基础性工作,而智能数据目录作为数据治理的核心组件,能够有效管理这些语料资源。本文将系统阐述电子病历高质量语料库的构建方法与架构,特别聚焦于智能数据目录的设计与实现,包括数据目录的功能定位、元数据管理、构建步骤以…...
DeepSeek最新大模型发布-DeepSeek-Prover-V2-671B
2025 年 4 月 30 日,DeepSeek 开源了新模型 DeepSeek-Prover-V2-671B,该模型聚焦数学定理证明任务,基于混合专家架构,使用 Lean 4 框架进行形式化推理训练,参数规模达 6710 亿,结合强化学习与大规模合成数据…...
论文公式根据章节自动编号教程
目录 一、操作前提二、具体操作步骤 插入公式编号添加括号(如需) 问答 摘要: 在撰写论文等文档时,让公式根据章节自动编号能大幅提升排版效率。 一、操作前提 先将每一章标题设置为多级标题。可点击Word“多级列表” - “定义…...
「Mac畅玩AIGC与多模态10」开发篇06 - 使用自定义翻译插件开发智能体应用
一、概述 本篇介绍如何在 macOS 环境下,通过编写自定义 OpenAPI Schema,将无需认证的翻译服务接入 Dify 平台,并开发基于实时翻译的智能体应用。本案例培养单提参数 API 调用技巧,实现智能体的实时转换能力。 二、环境准备 1. 确认本地开发环境 macOS 系统Dify 平台已成…...
大连理工大学选修课——机器学习笔记(8):Boosting及提升树
Boosting及提升树 Boosting概述 Bootstrap强调的是抽样方法 不同的数据集彼此独立,可并行操作 Boosting注重数据集改造 数据集之间存在强依赖关系,只能串行实现 处理的结果都是带来了训练集改变,从而得到不同的学习模型 Boosting基本思…...
OpenHarmony - 小型系统内核(LiteOS-A)(十七)标准库
OpenHarmony - 小型系统内核(LiteOS-A)(十七) 二十一、标准库 OpenHarmony内核使用musl libc库,支持标准POSIX接口,开发者可基于POSIX标准接口开发内核之上的组件及应用。 标准库接口框架 图1 POSIX接口…...
vscode详细配置Go语言相关插件
文章目录 vscode详细配置Go语言1.插件介绍1.1 BetterCommments1.2GitGraph1.3Go1.4GoComment1.5goctl1.6Lowlight Go Errors1.7Markdown1.8Material Icon Theme1.9Preetier2.0Project Manager其它插件 2.settings.json文件 vscode详细配置Go语言 1.插件介绍 1.1 BetterCommme…...
如何解决服务器文件丢失或损坏的问题
当服务器文件丢失或损坏时,需采取系统化的恢复和预防措施。以下是分步骤解决方案: --- ### **一、紧急恢复措施** #### 1. **检查文件系统完整性** bash # 对未挂载的分区进行检查(需先umount) fsck -y /dev/sdX # 针对ext4文…...
【C++11】包装器:function 和 bind
📝前言: 这篇文章我们来讲讲C11——包装器:function和bind,对于每个包装器主要讲解: 原型基本语法使用示例 🎬个人简介:努力学习ing 📋个人专栏:C学习笔记 🎀…...
芯知识|小体积语音芯片方案WTV/WT2003H声音播放ic应用解析
在智能硬件设备趋向微型化的背景下,语音芯片方案厂家针对小体积设备开发了多款超小型语音芯片方案,其中WTV系列和WT2003H系列凭借其QFN封装设计、高性能与高集成度,成为微型设备语音方案的理想选择。以下从封装特性、功能优势及典型应用场景三…...
第三部分:特征提取与目标检测
像边缘、角点、特定的纹理模式等都是图像的特征。提取这些特征是许多计算机视觉任务的关键第一步,例如图像匹配、对象识别、图像拼接等。目标检测则是在图像中找到特定对象(如人脸、汽车等)的位置。 本部分将涵盖以下关键主题: …...
MySQL bin目录下的可执行文件
文章目录 MySQL bin目录下的可执行文件1.mysqldump2.mysqladmin3.mysqlcheck4.mysqlimport5.mysqlshow6.mysqlbinlog7.常用可执行文件 MySQL bin目录下的可执行文件 1.mysqldump mysqldump 是 MySQL 的数据库备份工具。对数据备份、迁移或恢复非常重要。 备份整个数据库&…...
第四部分:赋予网页健壮的灵魂 —— TypeScript(中)
目录 4 类与面向对象:构建复杂的组件4.1 类的定义与成员4.2 继承 (Inheritance)4.3 接口实现 (Implements)4.4 抽象类 (Abstract Class)4.5 静态成员 (Static Members) 5 更高级的类型:让类型系统更灵活5.1 联合类型 (|)5.2 交叉类型 (&)5.3 字面量类…...
Learning vtkjs之ImageMarchingCubes
体积 等值面处理 介绍 vtkImageMarchingCubes - 对体积进行等值面处理 给定一个指定的等值,使用Marching Cubes算法生成一个等值面。 效果 新建了一个球,对比一下原始的(透明的)和ISO的效果 核心代码 参数部分 const updat…...
【“星睿O6”AI PC开发套件评测】+ tensorflow 初探
因为本次我的项目计划使用 tensorflow,所以这篇文章主要想做一个引子,介绍如何在“星睿O6”上搭建 tensorflow 的开发环境和验证测试。本文主要分为几个部分: 在“星睿O6”上编译安装 tensorflow基于 MNIST 数据集的模型训练和评估 tensorf…...
通义灵码全面接入Qwen3:AI编程进入智能体时代,PAI云上部署实战解析
引言:AI编程的范式革命 2025年4月30日,阿里云通义灵码宣布全面支持新一代大模型Qwen3,并同步推出编程智能体功能,标志着AI辅助开发从“工具助手”向“自主决策智能体”的跃迁。与此同时,阿里云PAI平台上线Qwen3全系列…...
如何禁止AutoCAD这类软件联网
推荐二、三方法,对其他软件影响最小 一、修改Hosts文件 Hosts文件是一个存储域名与IP地址映射关系的文本文件,通过修改Hosts文件可以将AutoCAD的域名指向本地回环地址(127.0.0.1),从而实现禁止联网的目的。具体步骤如…...
音视频项目在微服务领域的趋势场景题深度解析
音视频项目在微服务领域的趋势场景题深度解析 在互联网大厂Java求职者的面试中,经常会被问到关于音视频项目在微服务领域的应用场景的相关问题。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官:马架构,欢迎来到我…...
100 个 NumPy 练习
本文翻译整理自:https://github.com/rougier/numpy-100 文章目录 关于 100 个 NumPy 练习相关链接资源关键功能特性 100 个 NumPy 练习题1、导入 NumPy 包并命名为 np (★☆☆)2、打印 NumPy 版本和配置信息 (★☆☆)3、创建一个大小为 10 的空向量 (★☆☆)4、如何…...
在Carla中构建自动驾驶:使用PID控制和ROS2进行路径跟踪
机器人软件开发什么是 P、PI 和 PID 控制器?比例 (P) 控制器比例积分 (PI) 控制器比例-积分-微分 (PID) 控制器横向控制简介CARLA ROS2 集成纵向控制横向控制关键要点结论引用 机器人软件开发 …...
Windows和 macOS 上安装 `nvm` 和 Node.js 16.16.0 的详细教程。
Windows和 macOS 上安装 nvm 和 Node.js 16.16.0 的详细教程。 --- ### 1. 安装 nvm(Node Version Manager) nvm 是一个 Node.js 版本管理工具,可以轻松安装和切换不同版本的 Node.js。 #### Windows 安装 nvm 1. **下载 nvm 安装包**&#x…...
day11 python超参数调整
模型组成:模型 算法 实例化设置的外参(超参数) 训练得到的内参调参评估:调参通常需要进行两次评估。若不使用交叉验证,需手动划分验证集和测试集;但许多调参方法自带交叉验证功能,实际中可省略…...
Linux C++ xercesc xml 怎么判断路径下有没有对应的节点
在Linux环境下使用Xerces-C库处理XML文件时,判断路径下是否存在对应的节点可以通过以下几个步骤实现: 加载XML文档 首先,你需要加载XML文档。这可以通过创建一个xercesc::DOMParser对象并使用它的parse方法来实现。 #include <xercesc/…...
罗技K580蓝牙键盘连接mac pro
罗技K580蓝牙键盘,满足了我们的使用需求。最棒的是,它能够同时连接两个设备,通过按F11和F12键进行切换,简直不要太方便! 连接电脑 💻 USB连接 1、打开键盘:双手按住凹槽两边向前推࿰…...
Socket-UDP
Socket(套接字 )是计算机网络中用于实现进程间通信的重要编程接口,是对 TCP/IP 协议的封装 ,可看作是不同主机上应用进程之间双向通信端点的抽象。以下是详细介绍: 作用与地位 作为应用层与传输层、网络层协议间的中…...
【游戏ai】从强化学习开始自学游戏ai-2 使用IPPO自博弈对抗pongv3环境
文章目录 前言一、环境设计二、动作设计三、状态设计四、神经网路设计五、效果展示其他问题总结 前言 本学期的大作业,要求完成多智能体PPO的乒乓球对抗环境,这里我使用IPPO的方法来实现。 正好之前做过这个单个PPO与pong环境内置的ai对抗的训练&#…...
LeRobot 项目部署运行逻辑(三)——机器人及舵机配置
Lerobot 目前的机器人硬件以舵机类型为主,并未配置机器人正逆运动学及运动学,遥操作映射以舵机关节角度为主 因此,需要在使用前需要对舵机各项参数及初始位置进行配置 目录 1 Mobile ALOHA 配置 2 Dynamixel 配置 2.1 配置软件 2.2 SDK …...
Ubuntu20.04安装NVIDIA Warp
Ubuntu20.04安装NVIDIA Warp 安装测试 Warp的gitee网址 Warp的github网址 写在前面:建议安装前先参考readme文件自检系统驱动和cuda是否支持,个人实测建议是python3.9,但python3.8.20也可以使用。 写在前面:后续本人可能会使用这…...
电子病历高质量语料库构建方法与架构项目(临床情景理解模块篇)
引言 随着人工智能技术在医疗健康领域的广泛应用,电子病历(Electronic Medical Records,EMR)作为临床医疗数据的重要载体,已成为医学研究和临床决策支持的关键资源。电子病历高质量语料库的构建为医疗人工智能模型的训练和应用提供了基础支撑,其中临床情境理解模块是连接…...