数据结构:八大排序(冒泡,堆,插入,选择,希尔,快排,归并,计数)详解
目录
一.冒泡排序
二.堆排序
三.插入排序
四.选择排序
五.希尔排序
六.快速排序
1.Lomuto版本(前后指针法)
2.Lomuto版本的非递归算法
3.hoare版本(左右指针法)
4.挖坑法找分界值:
七.归并排序
八.计数排序
九.排序算法复杂度及稳定性分析
一.冒泡排序
冒泡排序即qsort排序,其在几大排序中属于那种效率较低的排序方式,相同条件下,qsort排序的时间要比其他排序多几十乃至几千倍,但由于其在排序过程中不会轻易改变原来数据的相对位置,因此它也算是一种较为稳定的函数(关于排序函数的稳定性我会在下文带着慢慢说明),以下是冒泡排序的具体原理与代码:
在升序条件下,不断遍历左边的数据以找其中最大者然后不断循环放在右边
//冒泡排序 void BubbleSort(int* arr, int n) {int end = n;while (end){int flag = 0;for (int i = 1; i < end; ++i)//代表每一次进入循环左边数据都会少一个{if (arr[i - 1] > arr[i]){int tem = arr[i];arr[i] = arr[i - 1];arr[i - 1] = tem;//右边比左边大就交换flag = 1;}}if (flag == 0){break;}--end;} }
看懂这样的代码之后可以仔细想想:冒泡排序在最差的情况下(即恰好每一轮的找最大值都需要它一个不漏地遍历其当时的所有数据)那么冒泡排序的时间复杂度为O(n^2)(即1一直累加到n-1),最好的情况下就是O(n),同时,在冒泡排序的每一趟过程中,假设有两个连续的一样的数据,那么冒泡排序在遍历过程中,是不会改变这两个数据的相对位置的,因此在不考虑时间复杂度的情况下,所以我称冒泡排序这种排序方式是一种稳定的排序方式
二.堆排序
堆排序的具体使用我在以下文章https://blog.csdn.net/2403_87691282/article/details/145888014?spm=1001.2014.3001.5501里有过说明,所以这里就允许我稍微偷下懒展示一下现成代码吧:
//向下调整算法 void AdjustDown(HP* hp, int parent, int n)//n是向下调整的下界范围 {int child = parent * 2 + 1;//公式while (child < n){//建小根堆if (child + 1 < n && hp->arr[child + 1] < hp->arr[child])//child+1的目的是确保两个孩子结点都是有意义的结点{child++;}if (hp->arr[parent] > hp->arr[child]){swap(&hp->arr[parent], &hp->arr[child]);parent = child;child = parent * 2 + 1;}else{//我最小的孩子都比父节点大,那么这个堆就是正常堆了,直接退出break;}} }// 升序,建⼤堆 // 降序,建⼩堆 // O(N*logN)//基于数组的堆排序 void HeapSort(int* a, int n) {// a数组直接建堆 O(N)for (int i = (n-1-1)/2; i >= 0; --i){AdjustDown(a, n, i);}// O(N*logN)int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);--end;} }
堆排序的时间复杂度也是比较好理解的:n*log(n),log(n)是向下调整算法每一层遍历需要的时间,n则是每一次为了出堆顶数据而进行的循环调用,由于每一次的出堆顶数据都需要调用一次向下调整算法,因此堆排序的时间复杂度为n*log(n),而且需要补充的一点是由于每一次的取堆顶出堆顶,可能会导致原待排序数据中相同数据的相对位置在堆排序后出现改变,因此也可以说尽管堆排序的效率在排序里算不错的,但其稳定性是属于不稳定的那一批
三.插入排序
插入排序的逻辑其实也不难:
1.从第一个元素开始,假设该元素已经被排序
2.取下一个元素tem,从已排序的元素序列从后往前遍历
3.如果该元素大于tem,则将该元素移到下一位
4.重复步骤3,直到找到已排序元素中小于等于tem的元素
5.tem插入到该元素的后面,若已排序所有元素都大于tem,则将tem插入到下标为0的位置
6.循环步骤2~5
void InsertSort(int* arr, int n) {for (int i = 0; i < n - 1; ++i){//记录有序序列最后一个元素的下标int end = i;//待插入的元素int tem = arr[end + 1];//单趟排while (end >= 0){//比插入的数大就向后移if (tem < arr[end]){arr[end + 1] = arr[end];end--;}//比插入的数小,跳出循环else{break;}}//tem放到比插入的数小的数的后面arr[end + 1] = tem;//代码执行到此位置有两种情况://1.待插入元素找到应插入位置(break跳出循环到此)//2.待插入元素比当前有序序列中的所有元素都小(while循环结束后到此)} }
代码补充解释:由于end作为记录有序数据的最后一个数据的变量,所以在大循环for中,end的实际值是一直在改变的,因此就需要在单趟排之后随时重置tmp的位置,而且tmp作为始终处于end后一位的变量(作为end的侦察兵,始终为了确定end是否需要与后一位交换位置而存在),在小循环while里end值每交换一次,就代表其与tmp值交换位置,因此需要在每个小循环的最后再将end值--使其回到正确的实际值,同样还有一点需要注意的就是直接插入排序的时间复杂度为O(n^2),且由于其在遍历过程中不会改变相同数据的相对位置,所以其排序性质是稳定的
四.选择排序
选择排序的思路也不算难,主要就是通过每次从待排序序列中挑一个最大再挑一个最小然后分别放在数组的两端,依次类推:
具体代码:
//选择排序 void swap(int* a, int* b) {int tem = *a;*a = *b;*b = tem; } void SelectSort(int* arr, int n) {//保存参与单趟排序的第一个数和最后一个数的下标int begin = 0, end = n - 1;while (begin < end){//保存最大值的下标int maxi = begin;//保存最小值的下标int mini = begin;//找出最大值和最小值的下标for (int i = begin; i <= end; ++i){if (arr[i] < arr[mini]){mini = i;}if (arr[i] > arr[maxi]){maxi = i;}}//最小值放在序列开头swap(&arr[mini], &arr[begin]);//最大值放在序列结尾swap(&arr[maxi], &arr[end]);++begin;--end;} }
当理解了选择排序后有一点需要注意的就是直接选择排序的时间复杂度无论是最佳情况(即待排序数据已经排序完毕)还是最差情况(每一次找最大最小都要遍历全部待排序数据)都是O(n^2),这点与冒泡排序不同,冒泡排序虽然最差情况时与直接排序相同,但在最好情况下的时间复杂度却是O(n),主要还是因为冒泡排序如果排已经拍好的数组时,其中的小循环几乎已经不需要进入执行了,但直接选择排序即便是遍历已经排好的数组也仍旧需要从头到尾遍历一遍,并且直接选择在遇到相同数据时同样是有可能会改变原始数据的相对顺序的,是不稳定的
五.希尔排序
希尔排序的逻辑可能就有些复杂:其基本思想为先选定⼀个整数(通常是gap=n/3+1),把 待排序⽂件所有记录分成各组,所有的距离相等的记录分在同⼀组内,并对每⼀组内的记录进行排序,然后gap=gap/3+1得到下⼀个整数,再将数组分成各组,进行插入排序,当gap=1时,就相当于直接插入排序,
再简单点来说就是先将待排序列进行预排序,使待排序列接近有序,然后再对该序列进行一次插入排序,此时插入排序的时间复杂度为O(N)
由于它是在直接插入排序算法的基础上进行改进⽽来的,综合来说它的效率肯定是更高的
//希尔排序 void ShellSort(int* arr, int n) {int gap = n;while (gap>1){//每次对gap折半操作gap = gap / 2;//单趟排序for (int i = 0; i < n - gap; ++i){int end = i;int tem = arr[end + gap];while (end >= 0){if (tem < arr[end]){arr[end + gap] = arr[end];end -= gap;}else{break;}}arr[end + gap] = tem;}} }
代码方面的解释也不算很难,希尔排序通过对原始数据不断的分小组细化,然后对每一个小组使用直接插入排序,从而减少直接插入排序算法里循环的次数,希尔算法里对于其中小循环的解释跟直接插入排序算法是有一样的,都是基于end与tmp的相对位置不变,然后小的往前放,大的往后放并且随时重置tmp(希尔里就是end+gap)使其一直处于end的前面而实现的算法,同样,我们再说到其时间复杂度,这里希尔算法的时间复杂度由于数学理论的局限,因此:
但唯一可以确定的是,希尔排序确实在很大程度上优化了直接插入算法
六.快速排序
快速排序我认为是几大排序里最复杂也是探究的最深的一个排序算法思想,其根本的逻辑就是通过先在原始数据任意建立一个参考点,然后通过各种方法使参考点的左边的数据小于参考点,然后使参考点右边的数据大于参考点
1.Lomuto版本(前后指针法)
思路:
1.选出一个keyi,一般是最左边或是最右边的。
2.起始时,prev指针指向序列开头,cur指针指向prev+1。
3.若cur指向的内容小于keyi,则prev先向后移动一位,然后交换prev和cur指针指向的内容,然后cur指针++;若cur指向的内容大于key,则cur指针直接++,(因此在排序过程中在没遇到大于keyi参考值时,prev和cur都会在下一步之前重合,只有当遇到大于参考值时,cur才会多走一步从而拉开与prev的距离,而这样拉开一步的解雇就是使prev的下一步指向值是一个比参考值大的数,因此此时交换prev和cur就可以实现数据大的往后移动)如此进行下去,直到cur到达end+1(出界)位置,此时将keyi和prev指针指向的内容交换即可。经过一次单趟排序,最终也能使得key左边的数据全部都小于key,key右边的数据全部都大于key。
4.然后也还是将key的左序列和右序列再次进行这种单趟排序,如此反复操作下去,直到左右序列只有一个数据,或是左右序列不存在时,便停止操作
//Lomuto前后指针 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; }
2.Lomuto版本的非递归算法
非递归版本的快速排序就是在Lomuto算法的基础上充分利用了栈的性质(这里有些具体的栈的操作我在之前有篇文章提过,具体请参考:https://blog.csdn.net/2403_87691282/article/details/145228592?spm=1001.2014.3001.5501),通过将数组的首尾元素存储在栈里从而实现一种类似于不断循环的二分数组的结构,而其中二分的核心即是我们最核心的代码:Lomuto算法(找参考值)
#include<stdio.h>//定义栈的结构 typedef int STDataType; typedef struct Stack {STDataType* arr;int top; //指向栈顶的位置int capacity;//栈的容量 }ST;void QuickSortNonR(int* arr, int left, int right) {ST st;STInit(&st);StackPussh(&st, right);StackPussh(&st, left);while (!StackEmpty(&st)){//取栈顶两次int begin = StackTop(&st);StackPop(&st);int end = StackTop(&st);StackPop(&st);//[begin,end]--找基准值int key1 = begin;int prev = begin, cur = prev + 1;//Lomuto前后指针法排序while (cur <= end){if (arr[cur] < arr[key1] && ++prev != cur){Swap(&arr[prev], &arr[cur]);}cur++;}Swap(&arr[prev], &arr[key1]);key1 = prev;//重新设定基准值以区分两个数组//begin key1 end//左序列【begin,key1-1】 右序列【key1+1,end】//要确保有效if (key1 + 1 < end){StackPush(&st, end);StackPush(&st, key1+1);}if (begin < key1-1){StackPush(&st, key1 - 1);StackPush(&st, begin);}}//销毁栈STDestroy(&st); }
3.hoare版本(左右指针法)
//快速排序 hoare版本(左右指针法) void QuickSort(int* arr, int begin, int end) {//只有一个数或区间不存在if (begin >= end)return;int left = begin;int right = end;//选左边为keyint keyi = begin;while (begin < end){//右边选小 等号防止和key值相等 防止顺序begin和end越界while (arr[end] >= arr[keyi] && begin < end){--end;}//左边选大while (arr[begin] <= arr[keyi] && begin < end){++begin;}//小的换到右边,大的换到左边swap(&arr[begin], &arr[end]);}swap(&arr[keyi], &arr[end]);keyi = end;//[left,keyi-1]keyi[keyi+1,right]QuickSort(arr, left, keyi - 1);QuickSort(arr,keyi + 1,right); }
在这个算法里有两点需要额外关注,一就是递归时所使用的函数的参数,这个就是三路递归法,之所以使用这样的方法是因为在快排的双指针法中,可以确保递归的平衡,避免Lomuto双指针法里产生的元素集中在左侧或者右侧而产生的递归不平衡,二就是代码过程中判断指针是否运动时的等号,之所以在相等时也让指针持续运动,是为了使数据中相同的元素最后集中在三路里的中间一路,以避免多次重复的递归计算
4.挖坑法找分界值:
思路:
创建左右指针,⾸先从右向左找出⽐基准⼩的数据,找到后⽴即放⼊左边坑中,当前位置变为新 的"坑",然后从左向右找出⽐基准⼤的数据,找到后⽴即放⼊右边坑中,当前位置变为新的"坑",结 束循环后将最开始存储的分界值放⼊当前的"坑"中,返回当前"坑"下标(即分界值下标)
int _QuickSort(int* a, int left, int right) {int mid = a[left];int hole = left;int key = a[hole];while (left < right){while (left < right && a[right] >= key){--right;}a[hole] = a[right];hole = right;while (left < right && a[left] <= key){++left;}a[hole] = a[left];hole = left;}a[hole] = key;return hole; }
七.归并排序
总结来说:归并排序是一种基于分治法的高效排序算法,其核心思想是将数组逐步拆分为更小的子数组进行排序,再将有序的子数组合并为整体有序的数组
void _MergeSort(int* a, int left, int right, int* tmp) {if (left >= right){return;}int mid = (right + left) / 2;//[left,mid] [mid+1,right]_MergeSort(a, left, mid, tmp);_MergeSort(a, mid + 1, right, tmp);int begin1 = left, end1 = mid;int begin2 = mid + 1, end2 = right;int index = begin1;//合并两个有序数组为⼀个数组 while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){tmp[index++] = a[begin1++];}else{tmp[index++] = a[begin2++];}}while (begin1 <= end1){tmp[index++] = a[begin1++];}while (begin2 <= end2){tmp[index++] = a[begin2++];}for (int i = left; i <= right; i++){a[i] = tmp[i];} }void MergeSort(int* arr, int n) {//外部申请临时数组空间,因此不计入空间复杂度int* tmp = (int*)malloc(sizeof(int*)*n);_MergeSort(arr, 0, n - 1, tmp);free(tmp); }
八.计数排序
void CountSort(int* a, int n) {int min = a[0], max = a[0];for (int i = 1; i < n; i++){if (a[i] > max)max = a[i];if (a[i] < min)min = a[i];}int range = max - min + 1;int* count = (int*)malloc(sizeof(int) * range);if (count == NULL){perror("malloc fail");return;}memset(count, 0, sizeof(int) * range);//初始化// 统计次数 for (int i = 0; i < n; i++){count[a[i] - min]++; }// 排序 int j = 0;for (int i = 0; i < range; i++){while (count[i]--){a[j++] = i + min;}} }
九.排序算法复杂度及稳定性分析
ok阿,到这里为止,数据结构的最后一章排序也结束了,下面是整个数据结构章节的所有内容的概览图:
好了,那就到此为止吧
全文终
相关文章:
数据结构:八大排序(冒泡,堆,插入,选择,希尔,快排,归并,计数)详解
目录 一.冒泡排序 二.堆排序 三.插入排序 四.选择排序 五.希尔排序 六.快速排序 1.Lomuto版本(前后指针法) 2.Lomuto版本的非递归算法 3.hoare版本(左右指针法) 4.挖坑法找分界值: 七.归并排序 八.计数排序…...
QT-对象树
思维导图 写1个Widget窗口,窗口里面放1个按钮,按钮随便叫什么 创建2个Widget对象 Widget w1,w2 w1.show() w2不管 要求:点击 w1.btn ,w1隐藏,w2显示 点击 w2.btn ,w2隐藏,w1 显示 #include <QApplication> #inc…...
随机播放音乐 伪随机
import java.util.*;/*** https://cloud.tencent.com.cn/developer/news/1045747* 伪随机播放音乐*/ public class MusicPlayer {private List<String> allSongs; // 所有歌曲列表private List<String> playedSongs; // 已经播放过的歌曲列表private Map<String…...
spring boot打包插件的问题
在spring boot项目中声明了 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build> 执行mvn clean package&…...
海康摄像头接入流媒体服务器实现https域名代理播放
环境 操作系统:Ubuntu 22.04流媒体服务器:srs 官网安装教程srs开启GB28181协议 官网开启教程进行海康摄像头的配置 官网配置教程srs使用systemctl实现开机自启 官网配置教程 nginx配置说明 server {listen 80;server_name a.com;return 301 https://$…...
Stable Diffusion模型Pony系列模型深度解析
Stable Diffusion模型Pony系列模型深度解析 一、技术架构与核心特性 基于SDXL的深度优化 Pony系列模型以SDXL为基础框架,通过针对二次元/动漫风格的微调,强化了在该领域的生成能力,同时保留了对写实场景的兼容性。其训练数据特别侧重于人…...
性能巅峰对决:Rust vs C++ —— 速度、安全与权衡的艺术
??关注,带你探索Java的奥秘!?? ??超萌技术攻略,轻松晋级编程高手!?? ??技术宝库已备好,就等你来挖掘!?? ??订阅,智趣学习不孤单!?? ??即刻启航,编…...
【Kubernets】K8S内部nginx访问Service资源原理说明
文章目录 原理概述**一、核心概念****二、Nginx 访问 Service 的流程****1. Service 的作用****2. Endpoint 的作用****3. Nginx Pod 发起请求****(1) DNS 解析****(2) 流量到达 kube-proxy****(3) 后端 Pod 处理请求** **三、不同代理模式的工作原理****1. iptables 模式****2…...
Markdown HTML 图像语法
插入图片 Markdown 一般来说,直接复制粘贴过来就行了,部分网页/应用可以拖拽,没人会真敲图片的链接吧…… 示例图片: 就不能再改变。然而,这并不影响对象内部的状态(即对象的属性)是否可以改变。具体来说&a…...
疫情管理系统设计与实现(代码+数据库+LW)
摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本疫情管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…...
记Android12上一个原生bug引起的system_server crash
一. 现象描述 近日测试上报一个几乎必现的crash,描述如下: 现象: launcher编辑状态与锁屏解锁交互时系统概率性重启 操作步骤: 进入launcher组件编辑状态按电源键灭屏后亮屏,锁屏界面上滑解锁launcher编辑状态向右或向左滑动重复1,2&#x…...
代码随想录算法训练营第六天|Leetcode454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
15. 三数之和 建议:本题虽然和 两数之和 很像,也能用哈希法,但用哈希法会很麻烦,双指针法才是正解,可以先看视频理解一下 双指针法的思路,文章中讲解的,没问题 哈希法很麻烦。 题目链接/文章讲…...
大数据环境(单机版) Flume传输数据到Kafka
文章目录 前言一、准备二、安装三、配置环境变量四、修改配置4.1、kafka配置4.2、Flume配置 五、启动程序5.1、启动zk5.2、启动kafka5.3、启动flume 六、测试6.1、启动一个kafka终端,用来消费消息6.2、写入日志 其他 前言 flume监控指定目录,传输数据到…...
计算机毕业设计SpringBoot+Vue.js高校教师科研管理系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
C++课程设计【宿舍管理查询软件】
宿舍管理查询软件 一、题目描述二、源码以及说明宿舍管理查询软件设计与实现1. 系统设计思路1.1 功能需求1.2 数据结构2. 系统实现3. 代码说明3.1 数据结构3.2 功能实现3.3 文件存储4. 示例运行输入输出5. 总结其他QT文章推荐一、题目描述 (一)问题描述 为宿舍管理人员编写一…...
数据挖掘校招面经一
写在前面:其实数据挖掘、风控、机器学习算法与搜广推的八股还是有重合的部分,毕竟都是面对结构化数据。特别是我自己是做竞赛的,平时LGBM、CatBoost用的挺多的,所以感觉这些八股还是有必要看看,建议大家也可以看一下。…...
迷你世界脚本对象库接口:ObjectLib
对象库接口:ObjectLib 迷你世界 更新时间: 2023-04-26 20:21:09 具体函数名及描述如下: 序号 函数名 函数描述 1 getAreaData(...) 获取区域数据 2 getPositionData(...) 获取位置数据 3 getLivingData(...) 获取生物数据 4 getItemDat…...
VSCode知名主题带毒 安装量900万次
目前微软已经从 Visual Studio Marketplace 中删除非常流行的主题扩展 Material Theme Free 和 Material Theme Icons,微软称这些主题扩展包含恶意代码。 统计显示这些扩展程序的安装总次数近 900 万次,在微软实施删除后现在已安装这些扩展的开发者也会…...
C#—csv文件格式操作实例【在winform表格中操作csv】
C#—csv文件格式操作实例【在winform表格中操作csv】 实例一 实例效果 当在winform界面中点击读取按钮时 将csv中的所有数据读取出来放置在datagridview控件,可以在datagridview控件中编辑数据,当点击保存按钮时 将datagridview控件中的所有数据存储在…...
Redis设计与实现-数据结构
Redis数据结构 1、RedisObject对象2、简单动态字符串2.1 SDS定义2.2 SDS与C语言的区别2.3 SDS的空间分配策略2.3.1 空间预分配2.3.2 惰性空间释放 2.4 SDS的API 3、链表3.1 链表的定义3.2 链表的API 4、字典4.1 字典的定义4.2 哈希算法4.3 哈希表的扩缩4.3.1 哈希表扩缩的判断依…...
Ubuntu20.04双系统安装及软件安装(四):国内版火狐浏览器
Ubuntu20.04双系统安装及软件安装(四):国内版火狐浏览器 Ubuntu系统会自带火狐浏览器,但该浏览器不是国内版的,如果平常有记录书签、浏览记录、并且经常使用浏览器插件的习惯,建议重装火狐浏览器为国内版的…...
C语言100天练习题【记录本】
C语言经典100题(手把手 编程) 可以在哔哩哔哩找到 已解决的天数:一,二,五,六 下面的都是模模糊糊的 可以学学这些算法,我是算法白痴,但是我不是白痴,可以学ÿ…...
基于CURL命令封装的JAVA通用HTTP工具
文章目录 一、简要概述二、封装过程1. 引入依赖2. 定义脚本执行类 三、单元测试四、其他资源 一、简要概述 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持文件的上传和下载,是综合传输工具&…...
SQL刷题:自连接(Self-Join)--通过将 同一张表连接两次,比较不同行之间的数据关系
例题: 表:Employee ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | | salary | int | | managerId | int | ---------------------- id 是该表的主键…...
避坑!用Docker搞定PHP开发环境搭建(Mac、Docker、Nginx、PHP-FPM、XDebug、PHPStorm、VSCode)
本次更新主要是对环境版本进行了更新,例如php 7.3.7升级到了7.3.8,另外之前的版本有同学踩了坑,主要是官方docker镜像php:7.3.7-fpm和php:7.3.8-fpm使用了不同版本的debian,后面会提到,请各位同学留意。 因为最近换电脑…...
第七节:基于Winform框架的串口助手小项目---协议解析《C#编程》
介绍 文章上所说的串口助手,工程文件资源-CSDN文库 目标 代码实现 private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e){if (isRxShow false) return;// 1,需要读取有效的数据 BytesToReadbyte[] dataTemp new byte[serialPor…...
pt-archiver删除数据库的数据表/各种报错类型
这篇帖子是前面文的一部分延申 mysqlimport导入一亿数据的csv文件/一行命令删除表-CSDN博客 如需转载,标记出处 目录 pt-archiver命令格式 如果执行后出现下面报错 1)Cannot find an ascendable index in table at /usr/bin/pt-archiver line 3233. …...
STM32Cubemx配置E22-xxxT22D lora模块实现定点传输
文章目录 一、STM32Cubemx配置二、定点传输**什么是定点传输?****定点传输的特点****定点传输的工作方式****E22 模块定点传输配置****如何启用定点传输?****示例** **应用场景****总结** **配置 1:C0 00 07 00 02 04 62 00 17 40****解析** …...
模块和端口
1、模块 模块内部的5个组成是:变量声明 数据流语句 低层模块实例 函数和任务 行为语句 SR锁存器 timescale 1ns / 1psmodule SR_latch(input wire Sbar ,input wire Rbar ,output wire Q ,output wire Qbar);nand…...
Android+SpringBoot的老年人健康饮食小程序平台
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 我将从经济、生活节奏、技术融合等方面入手,详细阐述居家养老管理模式兴起的…...
[machine learning] MACS、MACs、FLOPS、FLOPs
本文介绍机器学习中衡量一个模型计算复杂度的四个指标:MACS、MACs、FLOPS、FLOPs。 首先从含义上讲,可以分类两类:MACS/FLOPS和MACs/FLOPs。MACs/FLOPs表示总的操作数(后缀s可以看成是表示复数),MACS/FLOPS表示每秒可以执行的操作…...
PostgreSQL10 物理流复制实战:构建高可用数据库架构!
背景 PostgreSQL 10 在高可用架构中提供了物理复制,也称为流复制(Streaming Replication),用于实现实例级别的数据同步。PostgreSQL 复制机制主要包括物理复制和逻辑复制:物理复制依赖 WAL 日志进行物理块级别的同步&…...
STM32---FreeRTOS中断管理试验
一、实验 实验目的:学会使用FreeRTOS的中断管理 创建两个定时器,一个优先级为4,另一个优先级为6;注意:系统所管理的优先级范围 :5~15 现象:两个定时器每1s,打印一段字符串&#x…...
Linux常见操作命令(1)
(一)常用命令: 1.Tab 键可以实现自动补齐和提示,要合理使用 2.方向键(上下)来切换前后执行过的命令 (二)查看命令 一共有三个:ls, cd , pwd 。 1.ls:列出目录内容,包括参数-l(详细…...
SPI驱动(二) -- SPI驱动程序模型
文章目录 参考资料:一、SPI驱动重要数据结构1.1 SPI控制器数据结构1.2 SPI设备数据结构1.3 SPI驱动数据结构 二、SPI 驱动框架2.1 SPI控制器驱动程序2.2 SPI设备驱动程序 三、总结 参考资料: 内核头文件:include\linux\spi\spi.h 一、SPI驱…...
Qt中txt文件输出为PDF格式
main.cpp PdfReportGenerator pdfReportGenerator;// 加载中文字体if (QFontDatabase::addApplicationFont(":/new/prefix1/simsun.ttf") -1) {QMessageBox::warning(nullptr, "警告", "无法加载中文字体");}// 解析日志文件QVector<LogEntr…...
SpringBoot 校园新闻网站
收藏关注不迷路!! 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多…...
JAVA面经2
ConcurrentHashMap 并发程序出现问题的根本原因 线程池 线程池的执行原理(核心参数) 线程池的常见阻塞队列 ArrayBlockingQueue插入和删除数据,只采用了一个lock,而LinkedBlockingQueue则是在插入和删除分别采用了putLock和takeL…...
NVIDIA(英伟达) GPU 芯片架构发展史
GPU 性能的关键参数 CUDA 核心数量(个):决定了 GPU 并行处理能力,在 AI 等并行计算类业务下,CUDA 核心越多性能越好。 显存容量(GB):决定了 GPU 加载数据量的大小,在 AI…...
C++设计一:日期类Date实现
一、引言与概述 1 引言 日期操作是软件开发中的常见需求,如日程管理、数据统计等场景均需处理日期的比较、偏移及合法性校验。为简化此类操作,本文设计了一个高效且类型安全的C日期类Date。 该类通过构造函数内嵌合法性检查,确保对象初始状…...
关于2023新版PyCharm的使用
考虑到大家AI编程的需要,建议大家安装新版Python解释器和新版PyCharm,下载地址都可以官网进行: Python:Download Python | Python.org(可以根据需要自行选择,建议选择3.11,保持交流版本一致&am…...
【Azure 架构师学习笔记】- Azure Databricks (15) --Delta Lake 和Data Lake
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (14) – 搭建Medallion Architecture part 2 前言 ADB 除了UC 这个概念之外,前面【Azure 架构师学习笔记】- Azure Databricks (1…...
一文了解Conda使用
一、Conda库频道 conda的软件频道是存储软件包的远程位置,当在Conda中安装软件包时,它会从指定的频道中下载和提取软件包。频道包含了各种软件包,不同的频道可能提供不同版本的软件包,用户可以根据需要选择适合的版本。 常见 Co…...
SP导入智能材质球
智能材质球路径 ...\Adobe Substance 3D Painter\resources\starter_assets\smart-materials 放入之后就会自动刷新...
记录一次Spring事务失效导致的生产问题
一、背景介绍 公司做的是“聚合支付”业务,对接了微信、和包、数字人民币等等多家支付机构,我们提供统一的支付、退款、自动扣款签约、解约等能力给全国的省公司、机构、商户等。 同时,需要做对账功能,即支付机构将对账文件给到…...
腾讯云物联网平台(IoT Explorer)设备端使用
1、直接看图流程 2、跑起来demo,修改产品id,设备名称,设备秘钥。 3、连接部分 4、修改默认地址和端口 sdk里面的地址默认是带着产品ID拼接的,咱们现在中铁没有泛域名解析,要改下这里。把+productID都去掉,然后地址里的.也去掉。...
ML.NET库学习023: ONNX Runtime 中 C++ 辅助函数解析:Span 类与张量操作
文章目录 ML.NET库学习023: ONNX Runtime 中 C 辅助函数解析:Span 类与张量操作主题项目主要目的和原理项目概述实现的主要功能关键函数代码结构 主要功能与步骤Span 类的实现张量大小计算数据加载与处理准确性评估 数据集的使用以下是逐步解释ÿ…...
利用opencv_python(pdf2image、poppler)将pdf每页转为图片
1、安装依赖pdf2image pip install pdf2image 运行.py报错,因为缺少了poppler支持。 2、安装pdf2image的依赖poppler 以上命令直接报错。 改为手工下载: github: Releases oschwartz10612/poppler-windows GitHub 百度网盘: 百度网盘…...