【1.排序】
排序 笔记记录
- 1.排序的基本概念
- 1.1 排序的定义
- 2. 插入排序
- 2.1 直接插入排序
- 2.2 折半插入排序
- 2.3 希尔排序
- 3. 交换排序
- 3.1 冒泡排序
- 3.2 快速排序
- 4. 选择排序
- 4.1 简单选择排序
- 4.2 堆排序
- 5. 归并排序、基数排序和计数排序
- 5.1 归并排序
- 4.2 基数排序
- 4.3 计数排序
- 6. 各种内部排序算法的比较及应用
- 7. 外部排序
- 8. 一些常见结论
1.排序的基本概念
1.1 排序的定义
- 排序,就是重新排列表中的元素,使表中的元素满足按关键字有序的过程。为了查找方便, 通常希望计算机中的表是按关键字有序的。
- 稳定性:排列后元素的相对位置不发生改变。稳定性不能衡量一个算法的优劣。
- 在排序过程中,根据数据元素是否完全存放在内存中,可将排序算法分为两类:①内部排序, 是指在排序期间元素全部存放在内存中的排序;②外部排序,是指在排序期间元素无法全部同时 存放在内存中,必须在排序的过程中根据要求不断地在内、外存之间移动的排序。
一般情况下,内部排序算法在执行过程中都要进行两种操作:比较和移动。通过比较两个关键字的大小,确定对应元素的前后关系,然后通过移动元素以达到有序。当然,并非所有的内部 排序算法都要基于比较操作,事实上,基数排序就不基于比较操作。
每种排序算法都有各自的优缺点,适合在不同的环境下使用,就其全面性能而言,很难提出 一种被认为是最好的算法。通常可以将排序算法分为插入排序、交换排序、选择排序、归并排序 和基数排序五大类。内部排序算法的性能取决于算法的时间复杂度和空间复杂度,而时间复杂度一般是由比较和移动的次数决定的。
2. 插入排序
插入排序是一种简单直观的排序算法,其基本思想是每次将一个待排序的记录按其关键字大小插入前面已排好序的子序列,直到全部记录插入完成。由插入排序的思想可以引申出三个重要的排序算法:直接插入排序、折半插入排序和希尔排序。
2.1 直接插入排序
- 实现对L[1…n]的排序,可以将L(2)~L(n)依次插入前面已排好序的子序列,初始L[1] 可以视为一个已排好序的子序列。上述操作执行n-1次就能得到一个有序的表。插入排序在实现 上通常采用原地排序(空间复杂度为 O(1),因而在从后往前的比较过程中,需要反复把已排序 元素逐步向后挪位,为新元素提供插入空间。
- 比较次数和移动次数取决于待排序表的初始状态。
- 空间复杂度O(1)
- 时间复杂度:最好O(n) 平均O(n2) 最差O(n2)
- 稳定性:稳定
- 适用性:链式存储和顺序存储都适用,链式存储不用移动元素
static void insertSort(int[] A, int n) {int j, temp;//从第二个位置开始判断并插入到前面的有序队列中for (int i = 1; i < n; i++) {//如果发现当前的比有序队列还小,就进行插入操作if (A[i] < A[i - 1]) {//temp存的是待插入元素temp = A[i];//一个个比较直到找到temp的位置,只要temp小于有序元素,就向后移一位 12355for (j = i - 1; j >= 0 && temp < A[j]; j--) {A[j + 1] = A[j];}//最终的A[j + 1] = temp;}}}
2.2 折半插入排序
- 从直接插入排序算法中,不难看出每趟插入的过程中都进行了两项工作:①从前面的有序子 表中查找出待插入元素应该被插入的位置;②给插入位置腾出空间,将待插入元素复制到表中的 插入位置。注意到在该算法中,总是边比较边移动元素。下面将比较和移动操作分离,即先折半 查找出元素的待插入位置,然后统一地移动待插入位置之后的所有元素。当排序表为顺序表时, 可以对直接插入排序算法做如下改进:因为是顺序存储的线性表,所以查找有序子表时可以用折 半查找来实现。
- 比较次数与待排序表的初始状态无关。
- 空间复杂度O(1)
- 时间复杂度:最好O(n) 平均O(n2) 最差O(n2)
- 稳定性:稳定
- 适用性:顺序存储
static void halfInsertSort(int[] A, int n) {int j, temp, low, high, mid;for (int i = 1; i < n; i++) {if (A[i] < A[i - 1]) {temp = A[i];low = 0;high = i - 1;//查找待排元素位置while (low <= high) {//这个写法主要是为了避免high特别大的情况,防止溢出 high比low多的分一半给low也就是两人各自一半mid = low + (high - low) / 2;if (temp < A[mid]) {high = mid - 1;} else {low = mid + 1;}}//最终high的下一个位置就是待插入位置,这里只需要记住high最终会停在真实位置的前一个位置,所以大于high的都向后移动for (j = i - 1; j > high; j--) {A[j + 1] = A[j];}//这里high的下一个位置就是temp真正的位置A[high + 1] = temp;}}}
2.3 希尔排序
从前面的分析可知,直接插入排序算法的时间复杂度为O(n2),但若待排序列为“正序”时, 其时间效率可提高至O(n),由此可见它更适用于基本有序的排序表和数据量不大的排序表。希 排序正是基于这两点分析对直接插入排序进行改进而得来的,又称缩小增量排序。
- 希尔排序的基本思想是:先将待排序表分割成若干形如L[i,i+d,i+2d,…,i+kd]的“特殊” 子表,即把相隔某个“增量”的记录组成一个子表,对各个子表分别进行直接插入排序,当整个 表中的元素已呈“基本有序”时,再对全体记录进行一次直接插入排序。
- 空间复杂度O(1)
- 时间复杂度:最好O(n1.3) 最差O(n2)
- 稳定性:不稳定
- 适用性:顺序存储
public static void shellSort(int[] arr, int n) {// 初始步长int gap = n / 2;// 循环减小增量while (gap > 0) {// 对每个组进行直接插入排序 2, 4, 3, 5, 1, 6for (int i = gap; i < n; i++) {int temp = arr[i];int j = i;/*** 将arr[i]插入到已排序的序列中* arr[j - gap] > temp这里的意思是步长前元素与步长元素比较如果大于步长元素,* 则说明不是有序的,将原本的元素放入步长位置* 且j恢复到原来的位置,继续比较*/while (j >= gap && arr[j - gap] > temp) {arr[j] = arr[j - gap];j -= gap;}//这里其实就是与最初的元素互换位置arr[j] = temp;System.out.println(Arrays.toString(arr));}// 减小步长gap /= 2;}}
3. 交换排序
所谓交换,是指根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。 基于交换的排序算法很多,本书主要介绍冒泡排序和快速排序。
3.1 冒泡排序
冒泡排序的基本思想是:从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即 A[i-1]>A[i]),则交换它们,直到序列比较完。我们称它为第一趟冒泡,结果是将最小的元素交换到待排序列的第一个位置(或将最大的元素交换到待排序列的最后一个位置),关键字最小 的元素如气泡一般逐渐往上“漂浮”至“水面”(或关键字最大的元素如石头一般下沉至水底)。 下一趟冒泡时,前一趟确定的最小元素不再参与比较,每趟冒泡的结果是把序列中的最小元素(或 最大元素)放到了序列的最终位置……这样最多做n-1趟冒泡就能把所有元素排好序。
- 空间复杂度O(1)
- 时间复杂度:最好O(n2) 最差O(n2)
- 稳定性:稳定
- 适用性:顺序存储和链式存储
static void bubbleSort(int[] arr, int n) {//给个标记 防止在某一趟已经排好序了还继续无用的循环 查看是否有元素交换boolean flag = false;for (int i = 0; i < n - 1; i++) {//这里的n-i-1是因为每一趟都会将最大的元素排到最后,也就是只需要排剩下的n-i-1个元素for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {//进入这个if分支里边,则说明有元素进行了交换//所以将flag=trueflag = true;int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}//在进行完一轮的排序之后,判断本轮是否发生了元素之间的交换//如果没有发生交换,说明数组已经是有序的了,则直接结束排序if (!flag) {break;} else {//如果发生了交换,那么在下一轮排序之前将flag再次置为false//以便记录下一轮排序的时候是否会发生交换flag = false;}}}
3.2 快速排序
快速排序(以下有时简称快排)的基本思想是基于分治法的:在待排序表L[1…n]中任取一 个元素 pivot 作为枢轴(或称基准,通常取首元素),通过一趟排序将待排序表划分为独立的两 部分L[1…k-1]和L[k+1…n],使得L[1…k-1]中的所有元素小于pivot,L[k+1…n]中的所有 元素大于或等于pivot,则pivot放在了其最终位置L(k)上,这个过程称为一次划分。然后分 别递归地对两个子表重复上述过程,直至每部分内只有一个元素或为空为止,即所有元素放在了 其最终位置上。
- 快速排序是所有内部排序算法中平均性能最优的排序算法。
- 空间复杂度O(1)
- 时间复杂度:最好O(log2n) 最差O(n2)
- 稳定性:不稳定
- 适用性:快速排序仅适用于顺序存储的线性表。
/*** 快速排序*/private static void quickSort(int[] arr, int low, int high) {if (low < high) {int pivot = partition(arr, low, high);quickSort(arr, low, pivot - 1);quickSort(arr, pivot + 1, high);}}/*** 分区操作,找到基准元素的正确位置,并返回该位置** @param arr* @param low* @param high* @return*/static int partition(int[] arr, int low, int high) {int pivot = arr[low];int i = low;int j = high;while (i < j) {while (i < j && arr[j] >= pivot) {j--;}while (i < j && arr[i] <= pivot) {i++;}if (i < j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}arr[low] = arr[i];arr[i] = pivot;return i;}
4. 选择排序
选择排序的基本思想是:每一趟(如第i趟)在后面n-i+1(i=1,2,…,n-1)个待排序元 素中选取关键字最小的元素,作为有序子序列的第i个元素,直到第n-1趟做完,待排序元素只 剩下1个,就不用再选。
4.1 简单选择排序
假设排序表为 L[1.n],第i趟排序即从L[i…n]中选择关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的最终位置,这样经过n-1趟排序就可使得整个排序表有序。
- 空间复杂度O(1)
- 时间复杂度:最好O(n2) 最差O(n2)
- 稳定性:不稳定
- 适用性:简单选择排序适用于顺序存储和链式存储的线性表,以及关键字较少的情况。
static void selectSort(int[] arr, int n) {for (int i = 0; i < n - 1; i++) {int min = i;for (int j = i + 1; j < n; j++) {if (arr[j] < arr[min]) {min = j;}}if (min != i) {int temp = arr[i];arr[i] = arr[min];arr[min] = temp;}}}
4.2 堆排序
堆的定义如下,n个关键字序列L[1…n]称为堆,当且仅当该序列满足:
①L(i)>=L(2i)且L(i)>=L(2i+1)或
② L(i)<=L(2i)且L(i)<=L(2i+1)(1≤i≤Ln/2」)
可以将堆视为一棵完全二叉树,满足条件①的堆称为大根堆(大顶堆),大根堆的最大元素 存放在根结点,且其任意一个非根结点的值小于或等于其双亲结点值。满足条件②的堆称为小根 堆(小顶堆),小根堆的定义刚好相反,根结点是最小元素。
堆排序的思路很简单:首先将存放在L[1-n]中的n个元素建成初始堆,因为堆本身的特点 (以大顶堆为例),所以堆顶元素就是最大值。输出堆顶元素后,通常将堆底元素送入堆顶,此时 根结点已不满足大顶堆的性质,堆被破坏,将堆顶元素向下调整使其继续保持大顶堆的性质,再 输出堆顶元素。如此重复,直到堆中仅剩一个元素为止。可见,堆排序需要解决两个问题:①如何将无序序列构造成初始堆?②输出堆顶元素后,如何将剩余元素调整成新的堆?
- 空间复杂度O(1)
- 时间复杂度:最好O(nlog2n) 平均O(nlog2n) 最坏O(nlog2n)
- 稳定性:不稳定
- 适用性:适用于顺序存储。
public static void heapSort(int[] arr, int n) {//初始化堆for (int i = n / 2 - 1; i >= 0; i--) {adjustHeap(arr, i, n);}for (int i = n - 1; i > 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;adjustHeap(arr, 0, i);}}public static void adjustHeap(int[] arr, int i, int n) {while (true) {int l = 2 * i + 1;int r = 2 * i + 2;int index = i;if (l < n && arr[l] > arr[index]) {index = l;}if (r < n && arr[r] > arr[index]) {index = r;}if (i != index) {int temp = arr[index];arr[index] = arr[i];arr[i] = temp;i = index;} else {break;}}}
5. 归并排序、基数排序和计数排序
5.1 归并排序
归并排序与上述基于交换、选择等排序的思想不一样,归并的含义是将两个或两个以上的有 序表合并成一个新的有序表。假定待排序表含有n个记录,则可将其视为n个有序的子表,每个 子表的长度为1,然后两两归并,得到「n/2]个长度为2或1的有序表;继续两两归并……如此重 复,直到合并成一个长度为n的有序表为止,这种排序算法称为二路归并排序。
- 空间复杂度O(n)
- 时间复杂度:O(nlog2n)
- 稳定性:稳定
- 适用性:适用于顺序存储和链式存储。
public static void mergeSort(int[] arr, int left, int right) {//确保不会越界if (left < right) {//从中间划分两个序列int mid = left + (right - left) / 2;//左边部分mergeSort(arr, left, mid);//右边部分mergeSort(arr, mid + 1, right);merge(arr, left, mid, right);}}public static void merge(int[] arr, int left, int mid, int right) {int[] temp = new int[right - left + 1];//左边子数组的第一个元素。int i = left;//右边子数组的第一个元素int j = mid + 1;int k = 0;//当 i 和 j 都在各自子数组范围内时循环。while (i <= mid && j <= right) {//谁小把谁放进temp数组if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}//走到这里说明上面有一个已经放完了所有元素,可能另外一个数组还有元素则继续加入temp数组while (i <= mid) {temp[k++] = arr[i++];}while (j <= right) {temp[k++] = arr[j++];}// 将临时数组的结果拷贝回原数组for (int m = 0; m < temp.length; m++) {arr[left + m] = temp[m];}}
4.2 基数排序
基数排序是一种很特别的排序算法,它不基于比较和移动进行排序,而基于关键字各位的大 小进行排序。基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法。
- 空间复杂度O®
- 时间复杂度:O(d(n+r))
- 稳定性:稳定
- 适用性:适用于顺序存储和链式存储。
4.3 计数排序
计数排序也是一种不基于比较的排序算法。计数排序的思想是:对每个待排序元素x,统计 小于x的元素个数,利用该信息就可确定x的最终位置。例如,若有8个元素小于x,则x就排 在第9号位置上。当有几个元素相同时,该排序方案还需做一定的优化。
static int[] countSort(int[] arr) {//1.得到数列的最大值与最小值,并算出差值dint max = arr[0];int min = arr[0];for (int i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}if (arr[i] < min) {min = arr[i];}}int d = max - min;//2.创建基于差值长度的统计数组并统计填充对应元素个数int[] countArray = new int[d + 1];for (int i = 0; i < arr.length; i++) {countArray[arr[i] - min]++;}//3.统计数组变形,后面的元素等于前面的元素之和for (int i = 1; i < countArray.length; i++) {countArray[i] = countArray[i] + countArray[i - 1];}int[] output = new int[arr.length];//保证原来元素的顺序 保持稳定for (int i = arr.length - 1; i >= 0; i--) {//arr[i] - min真正在countArray中的索引位置output[countArray[arr[i] - min] - 1] = arr[i];//避免相同的元素放在同一个位置 应该放在自己对应的位置countArray[arr[i] - min]--;}return output;}
6. 各种内部排序算法的比较及应用
- 从时间复杂度看:简单选择排序、直接插入排序和冒泡排序平均情况下的时间复杂度都为 O(n2),且实现过程也较为简单,但直接插入排序和冒泡排序最好情况下的时间复杂度可以达到 O(n),而简单选择排序则与序列的初始状态无关。希尔排序作为插入排序的拓展,对较大规模的 数据都可以达到很高的效率,但目前未得出其精确的渐近时间。堆排序利用了一种称为堆的数据 结构,可以在线性时间内完成建堆,且在O(nlog2n)内完成排序过程。快速排序基于分治的思想, 虽然最坏情况下的时间复杂度会达到O(n2),但快速排序的平均性能可以达到O(nlogn),在实际 应用中常常优于其他排序算法。归并排序同样基于分治的思想,但由于其分割子序列与初始序列 的排列无关,因此它的最好、最坏和平均时间复杂度均为O(nlog2n)。
- 从空间复杂度看:简单选择排序、插入排序、冒泡排序、希尔排序和堆排序都仅需借助常数 个辅助空间。快速排序需要借助一个递归工作栈,平均大小为
O(log2n),当然在最坏情况下可能会增长到O(n)。二路归并排序在合并操作中需要借助较多的辅助空间用于元素复制,大小为0(n),
虽然有方法能克服这个缺点,但其代价是算法会很复杂而且时间复杂度会增加。- 从稳定性看:插入排序、冒泡排序、归并排序和基数排序是稳定的排序算法,而简单选择排 序、快速排序、希尔排序和堆排序都是不稳定的排序算法。平均时间复杂度为O(nlogn)的稳定排
序算法只有归并排序,对于不稳定的排序算法,只需举出一个不稳定的实例即可。- 从适用性看:折半插入排序、希尔排序、快速排序和堆排序适用于顺序存储。直接插入排序、冒泡排序、简单选择排序、归并排序和基数排序既适用于顺序存储,又适用于链式存储。
7. 外部排序
① 外部排序指的是大文件的排序,即待排序的记录存储在外存中,待排序的文件无法一次性装入内存,需要在内存和外存之间进行多次数据交换,以达到排序整个文件的目的。
② 为减少平衡归并中外存读/写次数所采取的方法:增大归并路数和减少归并段个数。
③ 利用败者树增大归并路数。
④ 利用置换-选择排序增大归并段长度来减少归并段个数。 ⑤ 由长度不等的归并段进行多路平衡归并,需要构造最佳归并树。
许多应用中,经常需要对大文件进行排序,因为文件中的记录很多,无法将整个文件复制进内存中进行排序。因此,需要将待排序的记录存储在外存上,排序时再把数据一部分一部分地调入内存进行排序,在排序过 程中需要多次进行内存和外存之间的交换。这种排序算法就称为外部排序。
8. 一些常见结论
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法。【选快希堆】
- 冒泡排序、插入排序、归并排序、基数排序是稳定的排序算法。【直冒归基】
- 简单选择排序则与序列的初始状态无关
相关文章:
【1.排序】
排序 笔记记录 1.排序的基本概念1.1 排序的定义 2. 插入排序2.1 直接插入排序2.2 折半插入排序2.3 希尔排序 3. 交换排序3.1 冒泡排序3.2 快速排序 4. 选择排序4.1 简单选择排序4.2 堆排序 5. 归并排序、基数排序和计数排序5.1 归并排序4.2 基数排序4.3 计数排序 6. 各种内部排…...
visual studio添加滚动条预览
如何在vs中添加如图的滚动条呢? 打开VS 工具栏 选项 - 文本编辑器 - C/C - 滚动条 行为-使用缩略图 -- 确定...
[SAP ABAP] ALV状态栏GUI STATUS的快速创建
使用事务码SE38进入到指定程序,点击"显示对象列表"按钮 鼠标右键,选择"GUI状态" 弹出【创建状态】窗口,填写状态以及短文本描述以后,点击按钮 点击"调整模板",复制已有程序的状态栏 填…...
鸿蒙元服务项目实战:备忘录UI页面开发
前言 之前写过一篇关于元服务项目的上架流程,为了更好的了解及开发元服务,准备从0到1简单开发一个小项目,也希望能够帮助到刚刚介入到鸿蒙开发的同学,具体项目呢,也是十分的简单,就是一个小巧的备忘录项目&…...
【Java基础面试题022】什么是Java内部类?有什么作用?
回答重点 Java内部类是指:在一个类的内部定义的类,Java支持多种类型的内部类,包括成员内部类、局部内部类、匿名内部类和静态内部类。实际上内部类是一个编译层面的概念,像一个语法糖一样,经过编译器之后其实内部类会…...
量子芯片在新医疗领域的应用研究展望
一、引言 (一)研究背景 随着科技的不断发展,量子芯片在新医疗领域有望在多个技术方面实现创新突破,进而持续拓展其应用范围与深度。 在提高纠错能力方面,当前量子比特的易错性是制约量子芯片广泛应用的关键因素之一…...
不可重入锁与死锁
不可重入锁确实可能导致死锁,特别是在同一线程尝试多次获取同一把锁时。如果锁是不可重入的,那么线程在第二次尝试获取锁时会永远阻塞,从而导致死锁。 不可重入锁与死锁的关系 不可重入锁不允许同一个线程多次获取同一把锁。在以下情况下&am…...
Linux(Ubuntu)命令大全——已分类整理,学习、查看更加方便直观!(2024年最新编制)
Hello! 认真好学的小伙伴们,大家好呀(Respect~)!我是 H u a z z i Huazzi Huazzi,欢迎观看本篇博客,接下来让我们一起来学习 Ubuntu命令大全 吧!祝你有所收获! 文章目录 前言&#x…...
画一颗随机数
代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>codePen - Random Tree</title> </head> <body><canvas></canvas><script>const canvas doc…...
机器人变换关系
rigid 刚性变换(平移、旋转): 只改变位置和方向,拥有6个自由度,保持变换物体的形状。 affine 仿射变换(平移、旋转、缩放、倾斜等): 改变物体形状、位置、方向,拥有12…...
2024年企业中生成式 AI 的现状报告
从试点到生产,企业 AI 格局正在被实时改写。我们对 600 名美国企业 IT 决策者进行了调查,以揭示新兴的赢家和输家。 从试点到生产 2024 年标志着生成性人工智能成为企业关键任务的一年。这些数字讲述了一个戏剧性的故事:今年人工智能支出飙升…...
共创共建!葡萄城 SpreadJS 完成 HarmonyOS NEXT 操作系统兼容认证
最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 近日,华为“企业工作必备应用鸿蒙化论坛”在北京圆满落幕,论坛汇聚了众多行业精英和合作伙伴,聚焦讨论企业数字化转型与原生鸿蒙生态融合等话题。葡萄…...
webAPI clean architecture
文章目录 项目地址一、Restaurants.Domain 核心业务层1.1 Entities实体层1.2 Repositories 数据操作EF的接口二、Restaurants.Infrastructure 基础设施层2.1 Persistence 数据EF CORE配置2.2 Repositories 数据查询实现2.3 Extensions 服务注册三、Restaurants.Application用例…...
JS使用random随机数实现简单的四则算数验证
1.效果图 2.代码实现 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</ti…...
在Linux中使用`scp`进行远程目录文件复制
在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令。它允许在远程主机之间复制文件和目录,具有很强的安全性,是一种常用的文件传输工具。以下是如何使用…...
【C++游记】string的使用和模拟实现
枫の个人主页 你不能改变过去,但你可以改变未来 算法/C/数据结构/C Hello,这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕,我们继续来学习C的内容呀。C是接近底层有比较经典的语言,因此学习起来注定枯燥无味…...
解决Linux访问HuggingFace的问题(操作记录)
目录 一、软件下载 二、软件使用 1、启动软件 2、设置网络 3、注意事项 三、linux命令行访问 1、问题分析 2、设置命令行代理 一、软件下载 MrQiguan/cfw-linux 二、软件使用 1、启动软件 ./cfw 注:先选择节点,再开启Start with Linux&#…...
《向量数据库指南》——Milvus Cloud 2.5:Sparse-BM25引领全文检索新时代
Milvus Cloud BM25:重塑全文检索的未来 在最新的Milvus Cloud 2.5版本中,我们自豪地引入了“全新”的全文检索能力,这一创新不仅巩固了Milvus Cloud在向量数据库领域的领先地位,更为用户提供了前所未有的灵活性和效率。作为大禹智库的向量数据库高级研究员,以及《向量数据…...
verilog+systemVerilog写代码bug总结
前言 此文用来记录我在写verilog项目时遇到的bug,方便回顾,也供大家参考。 语言:verilog、systemverilog 平台:vivado 2021.01 bug记录和解决 如何让计数从0开始,而不是从1开始? 情景描述:我现在要实现…...
【Java基础面试题014】for循环与增强for的区别是什么?
回答重点 for for是一种传统的循环结构,允许开发者控制循环的初始值,终止条件和步进方式 主要特点: 灵活性:可以控制循环的初始值、终止条件和步进方式使用于数组:可以通过索引访问,使用索引进行反向遍…...
2412d,d的8月会议
原文 总结 替换D的逃逸分析 Rikki说,他一个月前曾与Dennis讨论过简化D的逃逸分析,但没有结果.在BeerConf上,他再次提起了它,Dennis说他一直在考虑它. Rikki也与Walter谈过这件事,Walter曾说过DIP1000并没有完全如期工作,且有点太复杂了. 因此,Rikki想讨论按D逃逸分析方法替…...
如何在Qt中应用html美化控件
在Qt中应用HTML美化控件,主要可以通过以下几种方式: 使用QWebEngineView:QWebEngineView是基于Chromium引擎的控件,用于显示和交互HTML内容。它支持现代Web标准和技术,如HTML5、CSS3和JavaScript。你可以通过以下步骤…...
vue3实现商城系统详情页(前端实现)
目录 写在前面 预览 实现 图片部分 详情部分 代码 源码地址 总结 写在前面 笔者不是上一个月毕业了么?找工作没找到,准备在家躺平两个月。正好整理一下当时的毕业设计,是一个商城系统。还是写篇文章记录下吧 预览 商品图片切换显示…...
[Pro Git#4] 标签 | 理解 | 创建 | push
目录 一、理解标签 二、创建标签 三、操作标签 一、理解标签 标签定义:在Git中,标签(tag)是对某次提交(commit)的一个标识,相当于起了一个别名。应用场景示例: 在项目发布某个版…...
在M系列芯片的Mac上使用Uniapp开发的依赖安装指南
在M系列芯片的Mac上使用Uniapp开发的依赖安装指南 在基于M系列芯片(例如M3、M4)的Mac上进行Uniapp开发时,使用esbuild和rollup等依赖包时需要注意处理不同架构的支持。具体问题出现在darwin-arm64(ARM架构)和darwin-x…...
delve调试环境搭建—golang
原文地址:delve调试环境搭建—golang – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 由于平时不用 IDE 开发环境,习惯在 linux终端vim 环境下开发,所以找了golang的调试工具,delve类似gdb的调试界…...
暂停一下,给Next.js项目配置一下ESLint(Next+tailwind项目)
前提 之前开自己的GitHub项目,想着不是团队项目,偷懒没有配置eslint,后面发现还是不行。eslint的存在可以帮助我们规范代码格式,同时 ctrl s保存立即调整代码格式是真的很爽。 除此之外,团队使用eslint也是好处颇多…...
vscode 使用说明
文章目录 1、文档2、技巧显示与搜索宏定义和包含头文件 3、插件4、智能编写5、VSCode 与 C(1)安装(2)调试(a)使用 CMake 进行跨平台编译与调试(b)launch.json(cÿ…...
单片机:实现蜂鸣器数码管的显示(附带源码)
单片机实现蜂鸣器数码管显示 蜂鸣器和数码管在嵌入式系统中广泛应用。蜂鸣器可以发出声音警告或提示,而数码管则用于显示数字或字母。在本项目中,我们将通过8051单片机实现一个控制蜂鸣器和数码管显示的系统,结合使用蜂鸣器和数码管…...
Next.js v15-基于NextAuth进行身份验证
NextAuth.js 抽象化了管理会话、登录和注销以及身份验证的其他方面所涉及的大部分复杂性操作。虽然您可以手动实现这些功能,但该过程可能非常耗时且容易出错。NextAuth.js简化了流程,为 Next.js 应用程序中的身份验证提供了统一的解决方案。 步骤 通过…...
解锁Vue组件的奇妙世界
文章目录 一、Vue 组件概述(一)什么是 Vue 组件(二)Vue 组件的优点 二、Vue 组件的创建方式(一)全局注册(二)局部注册(三)单文件组件(SFC…...
二分查找【Lecode_HOT100】
文章目录 1.搜索插入位置No.352.搜索二维矩阵No.743.在排序数组中查找元素的第一个和最后一个位置No.344.搜索旋转排序数组No.335.寻找旋转排序数组中的最小值No.153 1.搜索插入位置No.35 class Solution {public int searchInsert(int[] nums, int target) {int l 0;int r n…...
解决git clone时报错“authentication failed for huggingface repository”
问题1: 已经获取了模型的授权,但是git clone时,弹出弹窗 输入huggingface的用户名和密码后,报错如下 解决方式1: 阅读红框标注的说明,“password authentication in git is no longer supported.”&#…...
力扣-图论-16【算法学习day.66】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
【异常】GL-SFT1200路由器中继模式,TL-CPE1300D无法搜寻5G网问题分析
【异常】GL-SFT1200路由器中继模式,TL-CPE1300D无法搜寻5G网问题 情况实验结论情况 在用GL-SFT1200路由器切换中继模式时,由于web密码忘却,需要重置,但根据官网使用手册,或者对应的中文版手册,重置失败。通过跟商家联系,进行uboot刷机,提供了指导文档,尝试后刷机成功…...
LeetCode 热题 100_K 个一组翻转链表(31_25_困难_C++)(四指针法)
LeetCode 热题 100_K 个一组翻转链表(31_25) 题目描述:输入输出样例:题解:解题思路:思路一(四指针法): 代码实现代码实现(思路一(四指针法&#x…...
【LeetCode】35.搜索插入位置
目录 LeetCode35.搜索插入位置题解解题思路code1 暴力解法2 二分查找什么是二分查找?二分查找的原理二分查找图解二分查找的优缺点……更新中 LeetCode35.搜索插入位置题解 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如…...
拿到小米 Offer,却迷茫了。。
大家好,我是程序员鱼皮,12 月了,很多小伙伴也拿到了秋招的 Offer(没拿到也不要灰心),但即使拿到 Offer,可能还会有一些其他的顾虑。今天分享我们编程导航一位鱼友的提问,给大家作为学…...
redis集群 服务器更换ip,怎么办,怎么更换redis集群的ip
redis集群 服务器更换ip,怎么办,怎么更换redis集群的ip 1、安装redis三主三从集群2、正常状态的redis集群3、更改redis集群服务器的ip 重启服务器 集群会down4、更改redis集群服务器的ip 重启服务器 集群down的原因5、更改redis集群服务器的ip后…...
运行 Mongodb Server
如何使用 mongod 命令通过配置文件启动 MongoDB Server 适用于通过 Homebrew 安装的 MongoDB Server 如果您的 MongoDB Server 是通过 Homebrew 安装的,则安装过程中会自动创建必要的文件夹和配置文件(如 mongod.conf)。您可以直接使用以下…...
“年轻科技旗舰”爱玛A7 Plus正式发布,全国售价4999元
12月18日,备受行业瞩目的“A7上场 一路超神”爱玛旗舰新品发布会在爱玛台州智造工厂盛大举行。 作为年末“压轴产品”的“两轮豪华轿跑”爱玛A7Plus重磅上场,以“快、稳、帅、炫、智、爽”六大超神技惊艳四座,不仅践行了爱玛科技的精品战略&…...
深入探索 C++ 编程技巧:从案例中学习高效实践
深入探索 C 编程技巧:从案例中学习高效实践 C 是一门功能强大且灵活的编程语言,被广泛应用于系统开发、高性能计算、游戏引擎等领域。然而,初学者和有经验的开发者常常会在代码优化、设计模式和语言特性中面临挑战。这篇文章将通过实际案例&…...
鸿蒙操作系统简介
华为鸿蒙系统(HUAWEI HarmonyOS),是华为公司于2019年8月9日在东莞举行的华为开发者大会(HDC.2019)上正式发布的面向全场景的分布式操作系统,可以创造一个超级虚拟终端互联的世界,将人、设备、场…...
LabVIEW起落架震台检测
在现代飞机制造与维护过程中,起落架的性能测试是保障飞机安全的重要环节。通过LabVIEW开发的起落架小落震台检测系统,通过模拟飞机着陆过程,准确捕捉起落架在着陆时承受的各种动力学特性和应力响应,有效提升起落架设计的精度与可靠…...
git remote -v(--verbose)显示你的 Git 仓库配置的远程仓库的详细信息
git remote -v 是一个 Git 命令,用于显示你的 Git 仓库配置的远程仓库的详细信息。 当你执行 git remote -v 命令时,你会看到类似以下的输出: origin https://github.com/your-username/your-repo.git (fetch) origin https://github.com…...
Java基础知识(四) -- 面向对象(中)
1.包 1.3.1 包的作用 (1)可以避免类重名:有了包之后,类的全名称就变为:包.类名【便于使用】(2)分类组织管理众多的类【便于管理类】(3)可以控制某些类型或成员的可见范…...
RAG开发中,如何用Milvus 2.5 BM25算法实现混合搜索
01. 背景 混合搜索(Hybrid Search)作为RAG应用中Retrieve重要的一环,通常指的是将向量搜索与基于关键词的搜索(全文检索)相结合,并使用RRF算法合并、并重排两种不同检索的结果,最终来提高数据的召回率。全文检索与语义…...
RadiAnt DICOM - 基本主题 :从 PACS 服务器打开研究
正版序列号获取:https://r-g.io/42ZopE RadiAnt DICOM Viewer PACS 客户端功能允许您从 PACS 主机(图片存档和通信系统)搜索和下载研究。 在开始之前,您需要确保您的 PACS 服务器和 RadiAnt 已正确配置。有关配置说明,…...
使用 CFD 加强水资源管理:全面概述
探索 CFD(计算流体动力学)在增强保护人类健康的土木和水利工程实践方面的重大贡献。 挑战 水资源管理是指规划、开发、分配和管理水资源最佳利用的做法。它包括广泛的活动,旨在确保水得到有效和可持续的利用,以满足各种需求&…...
AMS1117芯片驱动电路·降压芯片的驱动电路详解
编写不易,仅供学习,请勿搬运,感谢理解 AMS1117常见封装 很常用的一种LDO降压芯片,LDO(Low Dropout Regulator)降压芯片是线性稳压器,这种IC因为内部集成的不是开关电路,只能将输入与输出的电压差值通过内部…...