当前位置: 首页 > news >正文

排序学习整理(1)

1.排序的概念及运用

1.1概念

排序:所谓排序,就是使⼀串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作,以便更容易查找、组织或分析数据。

1.2运用

 购物筛选排序

院校排名

1.3常见排序算法

2.实现常见排序算法

int a[] = {5, 3, 9, 6, 2, 4, 7, 1, 8};

2.1 插入排序

把待排序的记录按其关键码值的大小逐个插入到⼀个已经排好序的有序序列中,直到所有的记录插入完为止,得到⼀个新的有序序列 。

2.1.1 直接插入排序

直接插入排序(Direct Insertion Sort)是一种简单直观的排序算法,它通过逐步构建有序序列,将未排序部分的元素插入到已排序部分的适当位置,直到整个数组排序完成。

基本思想

1.将数组分为 已排序部分 和 未排序部分。

                初始时,已排序部分只有第一个元素。

                未排序部分为剩余的元素。

2.依次从未排序部分取出一个元素,插入到已排序部分的正确位置。

3.重复以上操作,直到未排序部分为空。

算法步骤

1.从数组的第二个元素(索引为 1)开始,依次向后遍历。

                对当前元素,在已排序部分从后向前查找其插入位置:

                如果已排序部分的元素大于当前元素,则将其向后移动。

2.找到插入位置后,将当前元素放入。

3.重复此过程,直到所有元素排序完成。

当插入第 i(i>=1) 个元素时,前⾯的 array[0],array[1],…,array[i-1] 已经排好序,此时用 array[i] 的排序码与 array[i-1],array[i-2],… 的排序码顺序进行比较,找到插入位置即将 array[i] 插入,原来位置上的元素顺序后移
代码实现
void InsertSort(int* a, int n) {for (int i = 1; i < n; i++) {// 当前要插入的元素int tmp = a[i];// 已排序部分的最后一个元素的索引int j = i - 1;// 从后向前查找插入位置while (j >= 0 && a[j] > tmp) {a[j + 1] = a[j]; // 后移元素j--;}// 将当前元素插入到正确的位置a[j + 1] = tmp;}
}
特性总结
算法复杂度
  1. 时间复杂度
    • 最坏情况(数组逆序):O(n^2)
    • 最好情况(数组已排序):O(n)
    • 平均情况:O(n^2)
  2. 空间复杂度:原地排序,不需要额外的辅助空间,空间复杂度为 O(1)
  3. 稳定性:直接插入排序是稳定的,因为在插入过程中不会改变相等元素的相对顺序。

优缺点

优点

  1. 简单直观:实现容易,适合小规模数据。
  2. 性能良好:当数组接近有序时,插入排序的效率很高,接近 O(n)

缺点:

  1. 效率低下:对大规模、随机分布的数组排序效率较低,时间复杂度较高。
  2. 大量数据移动:当数组逆序时,几乎每次插入都需要移动大量元素。

适用场景
  1. 数据量较小(如 n <= 100)时,插入排序是一种简单有效的选择。
  2. 数据本身接近有序时(如几乎按升序排列),插入排序效率很高。

2.1.2 希尔排序 

希尔排序又称缩小增量法是一种基于插入排序的改进算法,得名于其发明者 Donald Shell。它通过分组和逐步缩小分组间距(增量),使得数据能够更快地接近有序,从而提高排序效率。

基本思想

先选定⼀个整数(通常是gap = n/3 + 1),把待排序文件所有记录分成各组,所有的距离相等的记录分在同⼀组内,并对每⼀组内的记录进⾏排序,然后gap = gap/3 + 1得到下⼀个整数,再将数组分成各组,进入插入排序,当gap = 1时,就相当于直接插入排序。

它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的。

算法步骤
  1. 初始化 gap = n / 3 + 1,其中 n 是数组的长度。
  2. 按照当前的 gap 将数组分组,对每组进行插入排序。
  3. 缩小 gap,继续分组排序,直到 gap = 1
  4. gap = 1 时,进行最后一次插入排序,数组有序。

 

代码实现
void ShellSort(int* a, int n) {int gap = n;// 缩小增量,直到 gap == 1while (gap > 1) {gap = gap / 3 + 1;// 分组for (int group = 0; group < gap; group++) { // 控制每组// 每组独立进行插入排序for (int i = group + gap; i < n; i += gap) {int tmp = a[i];int j = i - gap;while (j >= group && a[j] > tmp) {a[j + gap] = a[j];j -= gap;}a[j + gap] = tmp;}}}
}

显式地将数组分组,每组独立排序后再继续调整增量 gap,这种更好理解分组排序的原理,但代码稍显冗长,所以我一般用这种

void ShellSort1(int* a, int n) {int gap = n;// 缩小增量,直到 gap == 1while (gap > 1) {gap = gap / 3 + 1;// 从 gap 开始,模拟插入排序for (int i = gap; i < n; i++) {int tmp = a[i]; // 当前待插入的元素int j = i - gap;// 插入排序逻辑,按 gap 步长比较和移动while (j >= 0 && a[j] > tmp) { // 在同组中向前查找a[j + gap] = a[j]; // 将较大的元素后移j -= gap; // 按 gap 步长继续比较}a[j + gap] = tmp; // 插入到合适位置}}
}

这种方法也叫“简单希尔排序”(Simple Shell Sort),或者直接叫并着走,它直接在外层控制增量 gap,然后在整个数组中按步长进行插入排序,逻辑比较直观,效率高。这种实现方法更贴近希尔排序的本质,适合直接应用于实际场景。

它的核心思想是

  • 希尔排序的分组本质上是用 步长 gap 控制哪些元素属于一个组。

    • 在并着走的实现中,假设 gap = 3
      • 对于索引为 0, 3, 6, 9... 的元素,它们属于第一组。
      • 对于索引为 1, 4, 7, 10... 的元素,它们属于第二组。
      • 对于索引为 2, 5, 8, 11... 的元素,它们属于第三组。
    • 并着走的逻辑是遍历整个数组,隐式地让这些组在同一个循环中排序。
  • gap 的控制下:

    • 每个位置 i 的元素 a[i],都会和同组的前一个元素(位置 i - gap)进行比较。
    • 如果需要交换位置,就不断向前检查,直到找到合适位置。
特性总结
算法复杂度

1.时间复杂度

                最坏情况:O(n^2)(不理想的增量序列)。

                平均情况:O(n^(3/2)) 或更优(根据增量序列)。

                最好情况:接近 O(n)

可以分成内外层来分析

外层循环(控制增量 gap):应该能直接看出来吧,无疑问的O(log(n)),就是增量序列的长度。

内层循环(分组插入排序):

假设⼀共有n个数据,合计gap组,则每组为n / gap个;在每组中,插入移动的次数最坏的情况下为 1 + 2 + 3 + .... + ( n / gap− 1)),⼀共是gap组,因此: 1 + 2 + 3 + .... + ( n / gap− 1))
总计最坏情况下移动总数为: gap ∗ (1 + 2 + 3 + .... + (n / gap − 1 ))
gap取值有(以除3为例):n / 3  n / 9  n / 27 ......  2  1
  • 当gap为n / 3时,移动总数为: n / 3 * (1 + 2) = n
  • 当gap为n / 9时,移动总数为: n / 9 * (1 + 2 + 3 + .... + 8) = (n / 9) * (8 (1 + 8) / 2)= 4n
  • 最后⼀趟,gap=1,即直接插入排序,内层循环排序消耗为n

可知,比较次数是先增加再下降的,或者画一张曲线图更好理解

因此,希尔排序在最初和最后的排序的次数都为n,即前⼀阶段排序次数是逐渐上升的状态,当到达某⼀顶点时,排序次数逐渐下降至n,而该顶点的计算暂时无法给出具体的计算过程
所以,目前其实没有明确的希尔排序的时间复杂度,普遍认为的话是在 O(n^1.3) ,这里我们引用充当教科书较多的 《数据结构(C语言版)》--- 严蔚敏书中给出的时间复杂度的解释

 

2.空间复杂度:使用原地排序,额外空间复杂度为 O(1)

3.稳定性不稳定,因为在分组时可能会打乱相同元素的相对顺序。


优缺点

优点

  1. 简单易实现。
  2. 对中等规模的数组(如 1 万以下)性能较好。
  3. 在基本有序的数组上效率较高。

缺点

  1. 不稳定,不能保证相同元素的顺序。
  2. 对非常大的数组,效率不如快速排序。

增量序列的选择
  • 希尔增量gap = gap / 3 + 1
  • Hibbard增量gap = 2^k - 1
  • Sedgewick增量gap = 9 * 4^i - 9 * 2^i + 1 等。
  • 增量序列的选择会显著影响希尔排序的性能。

适用场景
  1. 数据规模适中(几百到几万)。
  2. 数据分布无规律,但需要排序效率较高的场景。
  3. 对性能要求高,但稳定性不重要的场景。

2.2 选择排序 

每⼀次从待排序的数据元素中选出最小或最大的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。

2.2.1 直接选择排序 

直接选择排序(Selection Sort)是一种简单的排序算法,其基本思想是每次从待排序的序列中选择最小(或最大)元素,将其放到已排序序列的末尾。该算法属于交换排序类,通过多次选择最小(或最大)元素并与当前序列中的元素交换来逐步完成排序。

基本思想
  1. 选择最小元素:在每一轮中,找到剩余未排序部分的最小元素。
  2. 交换位置:将找到的最小元素与当前已排序部分的末尾元素交换位置。
  3. 重复:每次排好一个元素后,缩小待排序部分的范围,继续执行选择和交换操作,直到所有元素排序完成。
算法步骤 
  1. 假设数组长度为 n,开始时将整个数组看作未排序部分。
  2. 从第一个元素开始,扫描剩余部分,找到最小的元素。
  3. 将最小元素与当前待排序部分的第一个元素交换。
  4. 重复此过程,直到排序完成。
1. 在元素集合 array[i]--array[n-1] 中选择关键码最大(小)的数据元素
2. 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素
交换
3. 在剩余的 array[i]--array[n-2](array[i+1]--array[n-1]) 集合中,重复上述步骤,直到集合剩余 1 个元素
代码实现
void SelectionSort(int* a, int n) {// 外层循环控制已排序部分的末尾for (int i = 0; i < n - 1; i++) {int minIndex = i;// 内层循环在未排序部分中寻找最小值for (int j = i + 1; j < n; j++) {if (a[j] < a[minIndex]) {minIndex = j;  // 记录最小元素的索引}}// 交换最小元素与当前已排序部分的下一个元素if (minIndex != i) {int temp = a[i];a[i] = a[minIndex];a[minIndex] = temp;}}
}
特性总结
算法复杂度

1.时间复杂度

                最坏情况(数组逆序):O(n^2)

                最好情况(数组已排序):O(n^2)(即数组已经排序,选择排序仍需执行完整的循环)

                平均情况O(n^2)

2.空间复杂度原地排序:不需要额外的辅助空间,空间复杂度为 O(1)

3.稳定性不稳定:在排序过程中可能会改变相等元素的相对顺序,因为会交换位置。


优缺点

优点

  1. 简单直观:直接选择排序算法的实现简单,易于理解,适合小规模数据。
  2. 空间效率高:只使用常数级的额外空间,内存开销小。

缺点

  1. 效率低下:由于时间复杂度为 O(n^2),对于大规模数据,性能较差。
  2. 不稳定:相同元素的顺序可能被改变,导致排序不稳定。
  3. 交换次数较多:每次找到最小元素后都会交换,可能导致不必要的交换操作。

适用场景
  1. 数据量较小(如 n <= 100)时,选择排序是一种简单有效的排序方法,适合小规模数据的排序。
  2. 数据本身接近有序时,直接选择排序的性能相对较好,尽管时间复杂度为 O(n^2),但相较于其他 O(n^2) 算法,选择排序的交换次数较少。

2.2.2 堆排序

堆排序(Heap Sort)是一种基于堆数据结构的排序算法,堆是一种完全二叉树,满足堆的性质:

  • 最大堆(Max Heap):父节点的值大于或等于其子节点的值,根节点是最大元素。
  • 最小堆(Min Heap):父节点的值小于或等于其子节点的值,根节点是最小元素。

堆排序利用堆的性质,每次从堆中提取根节点(最大或最小),然后调整堆结构,从而实现排序。

基本思想 
  1. 构建堆:将待排序数组转换成一个堆结构(可以是最大堆或最小堆),通常构建最大堆。
  2. 交换根节点与最后一个节点:将堆顶(最大元素)与堆的最后一个元素交换,这样最大元素就被放置到了正确的位置。
  3. 调整堆:交换后,堆的结构可能被破坏,需要重新调整堆,使其恢复堆的性质。
  4. 重复:将剩下的部分继续调整为堆,再次进行交换,直到所有元素都排序完成。
算法步骤
  1. 建堆:将给定的数组转换成一个最大堆。
  2. 交换根节点和最后一个节点:把堆顶元素(最大值)交换到数组的末尾。
  3. 调整堆:将剩余部分重新调整为最大堆。
  4. 重复交换和调整过程,直到堆的大小减小为1。
代码实现 
#include <stdio.h>// 调整堆结构
void AdjustDown(int* a, int n, int parent) {int child = parent * 2 + 1;  // 左子节点的索引while (child < n) {// 如果有右子节点,且右子节点更大,则选择右子节点if (child + 1 < n && a[child + 1] > a[child]) {child++;}// 如果父节点小于最大子节点,则交换if (a[child] > a[parent]) {int temp = a[parent];a[parent] = a[child];a[child] = temp;parent = child;child = parent * 2 + 1;  // 继续向下调整} else {break;  // 如果父节点大于等于最大子节点,则结束}}
}// 堆排序主函数
void HeapSort(int* a, int n) {// 建堆(从最后一个非叶子节点开始调整堆)for (int i = (n - 1) / 2; i >= 0; --i) {AdjustDown(a, n, i);}// 交换根节点(最大元素)和最后一个元素,然后调整堆int end = n - 1;while (end > 0) {// 交换根节点与堆的最后一个元素int temp = a[0];a[0] = a[end];a[end] = temp;// 重新调整堆AdjustDown(a, end, 0);--end;}
}// 打印数组
void PrintArray(int* a, int n) {for (int i = 0; i < n; ++i) {printf("%d ", a[i]);}printf("\n");
}int main() {int arr[] = {4, 10, 3, 5, 1};int n = sizeof(arr) / sizeof(arr[0]);HeapSort(arr, n);PrintArray(arr, n);return 0;
}
堆排序的步骤演示

假设我们有一个数组 [4, 10, 3, 5, 1],我们来逐步演示堆排序的过程。

1.建堆:首先将数组转换为最大堆:

      AdjustDown 会从最后一个非叶子节点开始,调整堆结构。

                经过调整,最大堆应该是 [10, 5, 3, 4, 1]

2.交换根节点和最后一个元素:交换根节点 10 和数组末尾的元素 1,得到 [1, 5, 3, 4, 10]

                通过 AdjustDown 调整堆,使其重新恢复堆的性质,得到 [5, 4, 3, 1, 10]

3.再次交换根节点和最后一个元素:交换根节点 5 和倒数第二个元素 1,得到 [1, 4, 3, 5, 10]

                通过 AdjustDown 调整堆,得到 [4, 1, 3, 5, 10]

4.重复:继续交换并调整堆,直到整个数组排好序:

                交换后得到 [3, 1, 4, 5, 10]

                调整后得到 [3, 1, 4, 5, 10]

                最终得到排序结果 [1, 3, 4, 5, 10]

特性总结
算法复杂度

1.时间复杂度

                最坏情况(数组逆序):O(n log n)

                最好情况(数组已排序):O(n log n)

                平均情况O(n log n)

2.空间复杂度原地排序:堆排序不需要额外的辅助空间,空间复杂度为 O(1)

3.稳定性不稳定:堆排序在排序过程中可能改变相等元素的相对顺序,因此是一个不稳定的排序算法。


优缺点

优点

  1. 时间复杂度稳定:无论在最坏、最好还是平均情况下,堆排序的时间复杂度始终为 O(n log n),表现稳定。
  2. 原地排序:堆排序只使用常数级额外空间,空间复杂度为 O(1),内存开销小。
  3. 适用于大规模数据:由于堆排序的时间复杂度较为稳定,因此适合用于处理大规模数据的排序任务。

缺点

  1. 不稳定:堆排序不保持相等元素的相对顺序,因此不适用于需要稳定排序的场景。
  2. 常数因子较大:虽然时间复杂度为 O(n log n),但堆排序的常数因子较大,通常会比其他如快速排序的实际性能稍差。

适用场景
  1. 大规模数据的排序:堆排序在处理大数据时较为稳定,尤其是在对时间复杂度有较高要求时。
  2. 内存有限的情况:堆排序是原地排序,不需要额外的内存,适用于内存受限的情况。
  3. 需要稳定时间复杂度的场景:当不关心排序的稳定性时,堆排序是一个不错的选择,尤其是在无法预测输入数据分布的情况下。

下一章应该是介绍冒泡和快速排序(

那几种快速排序够写很多了(

相关文章:

排序学习整理(1)

1.排序的概念及运用 1.1概念 排序&#xff1a;所谓排序&#xff0c;就是使⼀串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作&#xff0c;以便更容易查找、组织或分析数据。 1.2运用 购物筛选排序 院校排名 1.3常见排序算法 2.实…...

提升分布式系统响应速度:分布式系统远程调用性能提升之道

目录 一、远程调用直接案例分析 二、并行调用 &#xff08;一&#xff09;核心思想 &#xff08;二&#xff09;并行调用的实现方式 1. 基本思路 2. 代码示例 3. 关键点说明 4.线程池配置建议 三、数据异构 &#xff08;一&#xff09;场景重提 &#xff08;二&…...

通过MinIO+h2non/imaginary 搭建自己的阿里云OSS

安装MinIO Docker部署MinIO对象存储服务 图片访问地址&#xff1a;http://192.168.153.138:9000/public/su7_1.jpg 安装h2non/imaginary Docker部署h2non/imaginary 处理图片地址&#xff1a;http://192.168.153.138:7000/resize?urlhttp://192.168.153.138:9000/public/su…...

.NET 9 AOT的突破 - 支持老旧Win7与XP环境

引言 随着技术的不断进步&#xff0c;微软的.NET 框架在每次迭代中都带来了令人惊喜的新特性。在.NET 9 版本中&#xff0c;一个特别引人注目的亮点是 AOT&#xff08; Ahead-of-Time&#xff09;支持&#xff0c;它允许开发人员将应用程序在编译阶段就优化为能够在老旧的 Win…...

iOS与Windows间传文件

想用数据线从 windows 手提电脑传文件入 iPhone&#xff0c;有点迂回。 参考 [1]&#xff0c;要在 windows 装 Apple Devices。装完、打开、插线之后会检测到手机&#xff0c;界面&#xff1a; 点左侧栏「文件」&#xff0c;不是就直接可以传&#xff0c;而是要通过某个应用传…...

ospf协议(动态路由协议)

ospf基本概念 定义 OSPF 是典型的链路状态路由协议&#xff0c;是目前业内使用非常广泛的 IGP 协议之一。 目前针对 IPv4 协议使用的是 OSPF Version 2 &#xff08; RFC2328 &#xff09;&#xff1b;针对 IPv6 协议使用 OSPF Version 3 &#xff08; RFC2740 &#xff09;。…...

直击高频编程考点:聚焦新版综合编程能力考查汇总

目录 一、业务性编程和广度能力考查 &#xff08;一&#xff09;基本定义 &#xff08;二&#xff09;必要性分析 二、高频考查样题&#xff08;编程扩展问法&#xff09; 考题1: 用java 代码实现一个死锁用例&#xff0c;说说怎么解决死锁问题&#xff1f;&#xff08;高…...

爬虫框架快速入门——Scrapy

适用人群&#xff1a;零基础、对网络爬虫有兴趣但不知道从何开始的小白。 什么是 Scrapy&#xff1f; Scrapy 是一个基于 Python 的网络爬虫框架&#xff0c;它能帮助你快速爬取网站上的数据&#xff0c;并将数据保存到文件或数据库中。 特点&#xff1a; 高效&#xff1a;支…...

Springfox、Swagger 和 Springdoc

Springfox、Swagger 和 Springdoc 是用于在 Spring Boot 项目中生成 API 文档的工具&#xff0c;但它们之间有显著的区别和演进关系&#xff1a; 1. Swagger 简介 Swagger 是一个开源项目&#xff0c;旨在为 RESTful APIs 提供交互式文档。最早由 SmartBear 开发&#xff0c;…...

Css、less和Sass(SCSS)的区别详解

文章目录 Css、less和Sass&#xff08;SCSS&#xff09;的区别详解一、引言二、CSS 简介1.1、CSS 示例 三、Less 简介2.1、Less 特性2.2、Less 示例 四、Sass&#xff08;SCSS&#xff09;简介3.1、Sass 特性3.2、SCSS 示例 五、总结 Css、less和Sass&#xff08;SCSS&#xff…...

新能源汽车充电基础设施短板问题多,如何实现高效、综合、智能化管理?

随着城市经济的发展&#xff0c;人民生活水平的提升&#xff0c;新能源汽车保有量快速增长&#xff0c;而日益增长的新能源汽车需求与充电基础设施建设不平衡的矛盾日益突出。由于停车泊位充电基础设施总量不足、布局待优化、利用效率低、建设运营存在短板问题等原因&#xff0…...

DBA面试题-1

面临失业&#xff0c;整理一下面试题&#xff0c;找下家继续搬砖 主要参考&#xff1a;https://www.csdn.net/?spm1001.2101.3001.4476 略有修改 一、mysql有哪些数据类型 1&#xff0c; 整形 tinyint,smallint,medumint,int,bigint&#xff1b;分别占用1字节、2字节、3字节…...

LAN,WAN,VLAN,WLAN,VPN了解笔记

局域网LAN---公司的内部网络就是局域网LAN。 提供有线连接的接口允许局域网内的设备&#xff08;如台式电脑、网络打印机、网络存储设备等&#xff09;通过以太网线连接到路由器并与其他局域网设备进行通信实现设备之间的数据传输和资源共享一种私有的网络相对其他网络传输速度…...

1.2 算法和算法评价

1.2.1 算法的基本概念 算法&#xff1a;对特定问题求解步骤的一种描述&#xff0c;它是指令的有限序列&#xff0c;其中的每条指令表示一个或多个操作。 算法的五个重要特性 “好”的算法的五个目标 1.2.2 算法效率的度量 一、时间复杂度 算法的时间复杂度是指一个算法每行…...

各大常见编程语言应用领域

不同编程语言因其特性和设计目标而适用于不同的应用领域。以下是一些常见编程语言及其主要应用领域&#xff1a; 1. Python 数据科学与人工智能&#xff1a;Python 在数据分析、机器学习、深度学习等领域广泛使用&#xff0c;因其丰富的库&#xff08;如 NumPy、Pandas、Tens…...

【FFT】数据点数是否一定为2的n次方?不补零会如何处理?

一般来说&#xff0c;FFT的数据点个数为以2为基数的整数次方&#xff08;采用以2为基的FFT算法&#xff0c;可以提升运算性能&#xff09;&#xff0c;但是并没有要求FFT的数据点个数一定为2的n次方。 因此针对数据点数不是以2为基数的整数次方&#xff0c;有两种处理方法&…...

shell脚本小练习#003:查找并拷贝目录

实例1&#xff1a; # 从当前执行脚本的路径位置开始向上搜索一个名为sourceProject目录名 # 并将这个文件目录的路径名称打印出来#!/bin/bashfunction find_dir() {local current_dir$PWDwhile [[ $current_dir ! "/" ]]; doif [[ -d "${current_dir}/sourcePr…...

frp内网穿透

目录 1&#xff0c;准备公网服务器 2&#xff0c;下载安装frp服务端 3&#xff0c;服务端安装 2&#xff09;编辑服务端配置文件fprs.toml 3&#xff09;配置启动服务 4&#xff09;启动服务 5 &#xff09;设置开机启动服务 6&#xff09;查看服务启动状态 3&#xff0c…...

Android电视项目焦点跨层级流转

1. 背景 在智家电视项目中&#xff0c;主要操作方式不是触摸&#xff0c;而是遥控器&#xff0c;通过Focus进行移动&#xff0c;确定点击进行的交互&#xff0c;所以在电视项目中焦点、选中、确定、返回这几个交互比较重要。由于电视屏比较大&#xff0c;在一些复杂页面中会存…...

时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式基本介绍 时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法 程序设计 clear clc % close all load x.mat % 导入数据 x =...

转载 为nautilus安装rabbitvcs

# 添加 rabbitvcs 的 ppa 源 sudo add-apt-repository ppa:rabbitvcs/ppa sudo apt update # 安装 rabbitvcs sudo apt install rabbitvcs-cli rabbitvcs-core rabbitvcs-gedit rabbitvcs-nautilus # 注销后重新登录&#xff0c;右键即可使用 # 解决 RabbitVCS 无法自动保存…...

OpenCV 模板匹配全解析:从单模板到多模板的实战指南

简介&#xff1a;本文深入探讨 OpenCV 中的模板匹配技术。详细介绍构建输入图像与模板图像的步骤&#xff0c;包括读取、截取、滤波与存储等操作。剖析 cv2.matchTemplate 语法及其参数含义&#xff0c;阐述不同匹配方法下结果值的意义。同时讲解 cv2.minMaxLoc 语法&#xff0…...

手机控制载货汽车一键启动无钥匙进入广泛应用

移动管家载货汽车一键启动无钥匙进入手机控车系统‌&#xff0c; 该系统广泛应用于物流运输、工程作业等货车场景&#xff0c;为车主提供了高效、便捷的启动和熄火解决方案&#xff0c;体现了科技进步对物流行业的积极影响‌ 核心功能‌&#xff1a;简化启动流程&#xff0c;提…...

Springboot——SseEmitter流式输出

文章目录 前言SseEmitter 简介测试demo注意点异常一 ResponseBodyEmitter is already set complete 前言 最近做AI类的开发&#xff0c;看到各大AI模型的输出方式都是采取的一种EventStream的方式实现。 不是通常的等接口处理完成后&#xff0c;一次性返回。 而是片段式的处理…...

【人工智能数学基础篇】线性代数基础学习:深入解读矩阵及其运算

矩阵及其运算&#xff1a;人工智能入门数学基础的深入解读 引言 线性代数是人工智能&#xff08;AI&#xff09;和机器学习的数学基础&#xff0c;而矩阵作为其核心概念之一&#xff0c;承担着数据表示、变换和运算的重任。矩阵不仅在数据科学中广泛应用&#xff0c;更是神经…...

idea 自动导包,并且禁止自动导 *(java.io.*)

自动导包配置 进入 idea 设置&#xff0c;可以按下图所示寻找位置&#xff0c;也可以直接输入 auto import 快速定位到配置。 Add unambiguous imports on the fly&#xff1a;自动帮我们优化导入的包Optimize imports on the fly&#xff1a;自动去掉一些没有用到的包 禁止导…...

奇怪的编码2

1.当铺密码 当铺密码的标志是“田由中人工大王夫井羊” 口 0 田 0 由 1 中 2 人 3 工 4 大 5 王 6 夫 7 井 8 羊 9 解密脚本&#xff1a; s 田由中人工大王夫井羊 codeinput("请输入当铺密码&#xff1a;") code code.split(" ") w for i in code:k…...

AI服务器从HBM到CXL的技术变革

AI服务器从HBM到CXL变革 本文探讨了AI产业的新范式&#xff0c;特别是服务器变革。传统服务器价格通常在1万美金以内&#xff0c;而搭载8张H100算力卡的DGX H100AI服务器价值高达40万美金(约300万人民币)。这一变化将对AI产业产生深远影响。 自然语言和图形处理依赖大量存储器…...

将自定义 AWS S3 快照存储库连接到 Elastic Cloud

作者&#xff1a;来自 Elastic Annie Hansen, Stef Nestor 在本博客中&#xff0c;我们将介绍如何通过 Elasticsearch 的快照将我们已提交的集群数据备份到 AWS S3 存储桶中。在 Elastic Cloud&#xff08;企业版&#xff09;中&#xff0c;Elastic 在其 found-snapshots 存储…...

Java 多线程编程核心要点全解析:深度探秘关键方法与同步机制

1.Thread 类中的start() 和 run() 方法有什么区别&#xff1f; 在Java编程语言中&#xff0c;Thread 类的 start() 和 run() 方法有重要的区别&#xff1a; start() 方法&#xff1a; 当你调用 start() 方法时&#xff0c;它会启动一个新的线程&#xff0c;并且这个新线程会…...

个人博客接入github issue风格的评论,utteranc,gitment

在做个人博客的时候&#xff0c;如果你需要评论功能&#xff0c;但是又不想构建用户体系和评论模块&#xff0c;那么可以直接使用github的issue提供的接口&#xff0c;对应的开源项目有utteranc和gitment&#xff0c;尤其是前者。 它们的原理是一样的&#xff1a;在博客文章下…...

搞个项目之-esp32-cam ov2640模组搭建图像视频项目

开发版的介绍&#xff1a; 1、开发板使用的是&#xff1a;ESP32-CAM 2、摄像头模组&#xff1a;OV2640 3、烧录底座&#xff1a;ESP32-CAM开发板烧录座 4、mirco usb线&#xff0c;四线30cm 5、开发版的原理图像 项目前期的准备工作 一、安装arduino arduino官网地址地址…...

【FPGA开发】Vivado自定义封装IP核,绑定总线

支持单个文件的封装、整个工程的封装&#xff0c;这里用单个文件举例。 在文件工程目录下&#xff0c;自建一个文件夹&#xff0c;里面放上需要封装的verilog文件。 选择第三个&#xff0c;指定路径封装&#xff0c;找到文件所在目录 取个名&#xff0c;选择封装IP的路径 会…...

Leetcode51:N 皇后

题目描述&#xff1a; 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问…...

C#面向对象之访问限制,类基础,继承

文章目录 1 访问限制1.1 简介 2 类基础讲解2.1 类定义2.2 构造函数2.2.1 构造函数2.2.2 静态构造函数2.2.3 初始化顺序2.2.4 对象初始化器 2.3 析构函数2.4 类的静态成员2.5 匿名对象2.5.1 定义2.5.2 匿名对象的创建 3 继承3.1 基类和派生类3.2 基类初始化3.3 Partial类3.3.1 定…...

科研小白成长记41——享受大起大落

一直内心对自己的定位是喜欢安安静静生活的人&#xff0c;但是朋友提醒我我的生活一直都是出于各种冒险之中&#xff0c;从GAP申博&#xff0c;到GAP找工作&#xff0c;都不是一个乐于安于现状的人会做出来的。仔细想想不无道理&#xff0c;既然如此&#xff0c;那就如享受安静…...

正则表达式笔记

一、基本正则 常见元字符 元字符说明^以某个字符开头$以某个字符结尾.匹配任意单字符*对前一项进行0次或者多次重复匹配{m,n}将前一项字符重复m-n次&#xff0c;{m,},{,n},{m&#xff0c;n}[]对方括号内的单字符进行匹配[^]不匹配方括号内的单字符^[]匹配以某个字符开头的行(…...

解决本地运行SuperPoint_SLAM报错ERROR: flag ‘flagfile‘ was defined more than once

解决本地运行SuperPoint_SLAM报错ERROR: flag flagfile was defined more than once 起因使用LD_DEBUG排查链接过程用ldd查看各自链接的库解决办法问题解决 起因 在之前本地编译了opencv-3.4.2&#xff0c;当时因为contrib模块需要gflags&#xff0c;重新下载了一个gflags在本…...

springboot信息化在线教学平台的设计与实现(代码+数据库+LW)

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了信息化在线教学平台的开发全过程。通过分析信息化在线教学平台管理的不足&#xff0c;创建了一个计算机管理信息化在线教学平台的方案。文章介绍了信息化在线教…...

maxun爬虫工具docker搭建

思路来源开源无代码网络数据提取平台Maxun 先把代码克隆到本地&#xff08;只有第一次需要&#xff09; git clone https://github.com/getmaxun/maxun.git 转到maxun目录 cd maxun 启动容器 docker-compose --env-file .env up -d 成功启动六个容器 网址 http://local…...

高效 Python Web 开发:FastAPI 入门与实践

高效 Python Web 开发&#xff1a;FastAPI 入门与实践 目录 ✨ 1. 安装与环境配置 &#x1f4e6; 安装 FastAPI 和 Uvicorn&#x1f5c2;️ 项目目录结构和初始化&#x1f680; 创建一个简单的 FastAPI 项目 &#x1f6e0;️ 2. FastAPI 路由与请求处理 &#x1f6e3;️ 基本…...

C++中的函数重载

函数重载是指在同一个作用域&#xff08;通常是一个类或者一个命名空间&#xff09;内&#xff0c;可以有多个同名函数&#xff0c;但是这些同名函数的参数列表&#xff08;参数的个数、类型或者顺序&#xff09;不同。当调用这个函数名时&#xff0c;编译器会根据传入的实际参…...

达梦数据库常用指令都是工作中常用的

达梦数据库连接配置文件名称 cd /etc/dm_svc.conf查询 sql 日志记录是否开启&#xff1a;0 关闭&#xff0c;1/2/3开启); select SF_GET_PARA_VALUE(1,SVR_LOG)union ALL select SF_GET_PARA_VALUE(2,SVR_LOG);关闭 sql 日志记录功能 call SP_SET_PARA_VALUE(1,SVR_LOG,0);开…...

【2024最新】基于Springboot+Vue的就业信息管理系统Lw+PPT

作者&#xff1a;计算机搬砖家 开发技术&#xff1a;SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;Java精选实战项…...

linux一键部署apache脚本

分享一下自己制作的一键部署apache脚本&#xff1a; 脚本已和当前文章绑定&#xff0c;请移步下载&#xff08;免费&#xff01;免费&#xff01;免费&#xff01;&#xff09; &#xff08;单纯的分享&#xff01;&#xff09; 步骤&#xff1a; 将文件/内容上传到终端中 …...

修改MySQL数据库密码报1290

修改MySQL数据库密码报1290 错误 如下&#xff1a; alter user ‘root’‘localhost’ identified by ‘root’; ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement 需要刷新下配置 flush privileg…...

OpenCV4.8 开发实战系列专栏之 17 - 图像直方图

大家好&#xff0c;欢迎大家学习OpenCV4.8 开发实战专栏&#xff0c;长期更新&#xff0c;不断分享源码。 专栏代码全部基于C 与Python双语演示&#xff0c;领学习资料(Free) & 进专栏答疑群&#xff0c; VX&#xff1a; OpenCVXueTang_Asst 本文关键知识点&#xff1a;图…...

Linux下如何安装JDK

在Linux系统上安装JDK&#xff08;Java Development Kit&#xff09;&#xff0c;通常包括下面步骤&#xff1a; 下载JDK安装包解压安装包配置环境变量等 在介绍安装之前&#xff0c;先厘清一些常用问题。 Linux 下Java 安装到哪个目录比较好&#xff1f; 在Linux系统下&am…...

实时数据开发|Flink如何实现不同数据源输入--DataSource模块

DataStream 编程模型 Flink定义DataStream API让用户灵活且高效的编写流式应用。主要分为3部分&#xff1a;DataSource模块&#xff0c;Transformation模块以及DataSink模块。 DataSource模块&#xff0c;主要定义了数据接入功能&#xff0c;将外部数据接入至flink&#xff0…...

使用Dify与BGE-M3搭建RAG(检索增强生成)应用-改进一,使用工作流代替Agnet

文章目录 前言Agent vs 工作流编写工作流 前言 在上一篇中&#xff0c;我们实现了一个基本的基于Dify的RAG的示范。 使用Dify与BGE-M3搭建RAG&#xff08;检索增强生成&#xff09;应用 这个效果确实很差。 我们一起来看看&#xff0c;该怎么改进。 今天我们就尝试一下&…...