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

进阶-数据结构部分:​​​​​​​2、常用排序算法

飞书文档https://x509p6c8to.feishu.cn/wiki/FfpIwIPtviMMb4kAn3Sc40ABnUh

常用排序算法

这几种算法都是常见的排序算法,它们的优劣和适用场景如下:

冒泡排序(Bubble Sort):简单易懂,时间复杂度较高,适用于小规模数据排序。

选择排序(Selection Sort):简单易懂,时间复杂度较高,适用于小规模数据排序。

插入排序(Insertion Sort):对于部分有序的数据,插入排序的效率比较高,适合排序部分有序的小规模数据。

快速排序(Quick Sort):时间复杂度较低,适合排序大规模的数据,但对于有序数据排序,时间复杂度较高。

归并排序(Merge Sort):时间复杂度稳定,适用于大规模数据排序。

堆排序(Heap Sort):时间复杂度较低,但需要额外的空间存储堆。

计数排序(Counting Sort):时间复杂度较低,但需要额外的空间存储计数数组,适用于数据范围较小的排序。

桶排序(Bucket Sort):时间复杂度较低,但需要额外的空间存储桶,适用于数据范围较小的排序。

基数排序(Radix Sort):时间复杂度较低,但需要额外的空间存储桶,适用于数据范围较小的排序。

时间复杂度和空间复杂度

算法时间/空间复杂度是用来衡量算法执行时间和所需空间的一个指标。

它描述了算法在处理数据时所需的时间/空间量随着数据规模的增加而增加的速度。通常用大O符号(O)来表示。

时间复杂度是指算法执行所需的时间与问题规模之间的关系。
例如:
如果一个算法的时间复杂度是O(n^2),那么执行该算法所需的时间将随着问题规模n的增加而呈平方级增长。
如果一个算法的时间复杂度是O(n),那么执行该算法所需的时间将随着问题规模n的增加而线性增加。
如果一个算法的时间复杂度是O(logn),logn表示以2为底n的对数,比如,当数据增大256倍时,耗时只增大8倍,256/2除尽的次数。
如果一个算法的时间复杂度是O(1),也就是耗时与输入数据大小无关,无论输入数据增大多少倍,耗时都不变。

对数是一种数学函数,用来描述一个数在另一个数的幂次方中的指数。
具体来说,如果我们有一个正数 b(称为“底数”)和一个正数 x(称为“真数”),
那么 b 的 y 次幂等于 x,即 b^y = x。这时,我们就可以用对数函数来表示 y,即 y = logb(x)。
这里的“log”表示对数,“b”表示底数,“x”表示真数,“y”表示指数。
 log₂256=log₂(2^8)=8*(log₂2)=8*1=8 利用的是公式:log₂M^N=N*(log₂M)

算法的稳定性什么意思?

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,A1=A2,且A1在A2之前,而在排序后的序列中,A1仍在A2之前,则称这种排序算法是稳定的;否则称为不稳定的。

1、6、3、a1、9、a2、5、0,假设a1=a2 ;排序后:0、1、3、a1、a2、5、6、9

稳定也可以理解为一切皆在掌握中,元素的位置处在你在控制中.而不稳定算法有时就有点碰运气,随机的成分.当两元素相等时它们的位置在排序后可能仍然相同.但也可能不同.是未可知的.

综上所述,不同的排序算法适用于不同的场景。在实际应用中,应根据数据规模、排序稳定性、时间复杂度、空间需求等因素选择合适的排序算法。

冒泡排序

比较相邻的元素,把大的交换到右边,从第一对到最后一对,这步做完后,最后的元素会是最大的数。

对剩余数据重复以上步骤,找第二大的数、第三大的数直至最后。


#include <stdio.h>void exportArray(int arr[], int n){for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");
}//冒泡排序的基本思想是逐次判断相邻数值大小,把大的交换到右边。
//该函数中使用了两个嵌套的for循环来实现冒泡排序。
void bubbleSort(int arr[], int n) {int i, j, temp, step;//遍历整个数组for (i = 0; i < n - 1; i++) {//每一轮冒泡比较的次数,i越大比较次数越少//因为每次i++前,都会确定一个最大的值,完成的不需要再比较,所以判断条件变为j < n-i-1for (j = 0; j < n - i - 1; j++) {step ++;//step表示排序的步数//若左边值大于右边值,则交换两个值if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}//exportArray函数用于输出每一步排序后的结果printf("Sorted step %d:",step);exportArray(arr,n);}}
}int main() {int arr[] = {64, 34, 25, 12, 22};int n = sizeof(arr) / sizeof(arr[0]);bubbleSort(arr, n);printf("Sorted end: \n");exportArray(arr,n);return 0;
}

选择排序

  • 首先在未排序序列中找到最小元素,存放到排序序列的起始位置。
  • 再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。
  • 重复第二步,直到所有元素均排序完毕。

#include <stdio.h>void exportArray(int arr[], int n){for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");
}//遍历数组,每轮遍历时查找到最小的元素,放置左边
void selectionSort(int arr[], int n) {int i, j, min_idx;// 遍历整个数组for (i = 0; i < n-1; i++) {//设置当前数组第i个元素为假设最小值,其它元素会与其对比min_idx = i;// 遍历未排序的数组(未排序从i+1开始),找到数组中最小元素,记录它的索引for (j = i+1; j < n; j++) {printf("Find & Contrast %d\n",j);//如果当前元素小于假设最小值,则认为当前值是最小的元素,记录当前元素位置位置if (arr[j] < arr[min_idx])min_idx = j;}// 将最小元素与未排序部分的第一个元素交换,每轮遍历都会记录一次当前轮最小值int temp = arr[min_idx];arr[min_idx] = arr[i];arr[i] = temp;//exportArray函数用于输出每一步排序后的结果printf("Sorted step %d:",i);exportArray(arr,n);}
}int main() {int arr[] = {64, 25, 12, 22, 11};int n = sizeof(arr)/sizeof(arr[0]);selectionSort(arr, n);printf("Sorted end: \n");exportArray(arr,n);return 0;
}

插入排序

插入排序,只要打过扑克牌的人都应该能够秒懂,它的步骤如下:

  • 将第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
  • 依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。


#include <stdio.h>void exportArray(int arr[],int n){for(int i = 0; i < n; i++){printf("%d ",arr[i]);}printf("\n");
}void insertionSort(int arr[],int n){for(int i = 1;i < n;i ++){int key = arr[i];for(int j = i - 1;j >= 0; j--){int compara_value = arr[j];if(compara_value > key){arr[j + 1] = arr[j];arr[j] = key;}else{//key为当前轮最大值,不需要往前插入break;}}printf("第%d轮插入\n",i);exportArray(arr,n);}
}int main(){int arr[] = {12,11,1,5,6};int len = sizeof(arr)/sizeof(arr[0]);printf("main init\n");exportArray(arr,len);insertionSort(arr,len);
}

快速排序

快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!它是处理大数据最快的排序算法之一了。

  1. 从数列中挑出一个元素,称为 "基准值";
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作;
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;


#include <stdio.h>void exportArray(int arr[], int n){for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");
}//交换两个值
void swap(int *a, int *b) {int tmp = *a;*a = *b;*b = tmp;
}//对比区间内,从第一个数开始与基准值的大小,如果比基准小,则把当前数与前面(比基准大的值)逐个交换
int partition(int arr[], int low, int high, int n) {//选择基准元素为当前区间最后位置的元素int pivot = arr[high];//记录当前区间首个元素的位置int i = low;//统计交换次数int times = 0;printf("本轮区间 %d-%d 基准值:%d\n",low, high ,pivot);//从第当前区间一个元素开始,到最后一个元素,与基准值比较for (int j = low; j < high ; j++) {if (arr[j] < pivot) {//如果当前元素小于基准值,则把当前元素交换至当前区间的前面swap(&arr[i], &arr[j]);//从当前区间首个位置开始存放,每次存放完加1i++;//统计交换次数,打印交换后的数组times++;printf("Sorted step %d:",times);exportArray(arr,n);}}//结束一轮后,把基准值放到比它小的所有元素后方,也就是位置i后方swap(&arr[i], &arr[high]);//统计交换次数,打印交换后的数组times++;printf("Sorted step %d:",times);exportArray(arr,n);//返回当前基准值位置return i;
}void quicksort(int arr[], int low, int high, int n) {//首次排序时,low等于数组首个元素位置(0),high等于数组最后一个元素的位置(数组长度)//排序结束时,low>=highif (low < high) {//开始执行区间排序,选择最后一个元素作为基准元素//排序后,数组分为两部分,左边比基准元素小,右边比基准元素大int pi = partition(arr, low, high, n);//根据上次排序划分的基准值位置,对左边区间排序quicksort(arr, low, pi - 1, n);//根据上次排序划分的基准值位置,对右边区间排序quicksort(arr, pi + 1, high, n);}
}/**
快速排序(Quicksort)是一种高效的排序算法,
它的基本思想是通过一趟排序将待排序的数据分割成两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行。
具体实现过程如下:
选择一个基准元素,通常选择第一个元素或者最后一个元素,本程序选择最后一个为6;
通过一趟排序将待排序列分成两部分,一部分比基准元素小,一部分比基准元素大;
将基准元素和两个子序列分别递归地进行快速排序。*/
int main() {int arr[] = {10, 7, 8, 9, 1, 5, 6};int n = sizeof(arr) / sizeof(arr[0]);quicksort(arr, 0, n - 1,n);printf("Sorted end: \n");exportArray(arr,n);return 0;
}

相关文章:

进阶-数据结构部分:​​​​​​​2、常用排序算法

飞书文档https://x509p6c8to.feishu.cn/wiki/FfpIwIPtviMMb4kAn3Sc40ABnUh 常用排序算法 这几种算法都是常见的排序算法&#xff0c;它们的优劣和适用场景如下&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a;简单易懂&#xff0c;时间复杂度较高&…...

人工智能-自然语言与语音产品实现

一、语义相似度 &#xff08;一&#xff09;、文本向量化 1、文本向量化&#xff08;Text Vectorization&#xff09; 是自然语言处理&#xff08;NLP&#xff09;中的核心预处理步骤&#xff0c;旨在将人类语言的文本转换为计算机可处理的数值向量&#xff08;数学表达&…...

阿里巴巴开源移动端多模态LLM工具——MNN

MNN 是一个高效且轻量级的深度学习框架。它支持深度学习模型的推理和训练&#xff0c;并在设备端的推理和训练方面具有行业领先的性能。目前&#xff0c;MNN 已集成到阿里巴巴集团的 30 多个应用中&#xff0c;如淘宝、天猫、优酷、钉钉、闲鱼等&#xff0c;覆盖了直播、短视频…...

SpringBootAdmin:全方位监控与管理SpringBoot应用

监控的意义 1. 监控服务状态是否宕机 2. 监控服务运行指标 (内存,虚拟机,线程,请求等) 3. 监控日志 4. 管理服务 (服务下线) 可视化监控平台 Spring Boot Admin, 开源社区项目, 用于管理和监控SpringBoot应用程序. 客户端注册到服务端, 通过HTTP请求方式, 服务端定期从客…...

SAP HCM 0008数据存储逻辑

0008信息类型&#xff1a;0008信息类型是存储员工基本薪酬的地方&#xff0c;因为很多企业都会都薪酬带宽&#xff0c;都会按岗定薪&#xff0c;所以在上线前为体现工资体系的标准化&#xff0c;都会在配置对应的薪酬关系&#xff0c;HCM叫间接评估&#xff0c;今天我们就分析下…...

【springcloud学习(dalston.sr1)】Config配置中心-ConfigServer端与Git通信(含源代码)(十三)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; springcloud学习&#xff08;dalston.sr1&#xff09;系统文章汇总如下&#xff1a; 【springcloud学习(dalston…...

2020CCPC河南省赛题解

A. 班委竞选 签到题&#xff0c;模拟。 #include <bits/stdc.h> #define x first #define y second #define int long long //#define double long doubleusing namespace std; typedef unsigned long long ULL ; typedef pair<int,int> PII ; typedef pair<d…...

C语言输入函数对比解析

目录 C语言输入函数全家福&#xff08;和它们的秘密&#xff09;fgetsgetsscanfgetcharfscanf函数对比表灵魂总结 哈哈&#xff0c;看来你正在和C语言的输入函数们玩“大家来找茬”&#xff01;放心&#xff0c;我会用最接地气的方式给你讲明白&#xff0c;保证比看《甄嬛传》还…...

python四则运算计算器

python四则运算计算器 是谁说&#xff0c;python不好写计算器的&#xff0c;我亲自写个无ui的计算器功能&#xff0c;证明这是谣言 step1:C:\Users\wangrusheng\Downloads\num.txt 15 - 4 * 3 10 / 2(5 3) * 2 6 / 31/2 * 8 3/4 * 4 - 0.52.5 * (4 1.6) - 9 / 3-6 12 * (…...

BUUCTF——Nmap

BUUCTF——Nmap 进入靶场 类似于一个nmap的网站 尝试一下功能 没什么用 看看数据包 既然跟IP相关 伪造一个XXF看看 拼接了一下没什么用 果然没这么简单 尝试一下命令注入 构造payload 127.0.0.1 | ls 应该有过滤 加了个\ 直接构造个php木马上传试试 127.0.0.1 | <?…...

【Changer解码头详解及融入neck层数据的实验设计】

Changer解码头详解 ChangerEx中的 Changer 解码头&#xff08;定义在 [changer.py](file://opencd\models\decode_heads\changer.py)&#xff09;是基于双时相输入的&#xff0c;用于遥感变化检测任务。下面我将详细解释&#xff1a; &#x1f3af; 一、解码头输入数据来源 输…...

深度学习推理引擎---OpenVINO

OpenVINO&#xff08;Open Visual Inference & Neural Network Optimization Toolkit&#xff09;是英特尔开发的开源工具套件&#xff0c;旨在优化和加速深度学习模型在英特尔硬件&#xff08;CPU、GPU、VPU、FPGA等&#xff09;上的推理性能&#xff0c;同时支持从训练到…...

JavaScript splice() 方法

1. JavaScript splice() 方法 1.1. 定义和用法 splice() 方法用于添加或删除数组中的元素。   注意&#xff1a;这种方法会改变原始数组。   返回值&#xff1a;如果删除一个元素&#xff0c;则返回一个元素的数组。 如果未删除任何元素&#xff0c;则返回空数组。 1.2. …...

数据库故障排查指南:解决常见问题,保障数据安全与稳定

数据库故障排查指南&#xff1a;解决常见问题&#xff0c;保障数据安全与稳定 &#x1f4d6; 前言 数据库作为现代应用的核心组件&#xff0c;其稳定性直接影响业务连续性。本文总结六大常见数据库故障场景&#xff0c;提供快速排查思路与解决方案&#xff0c;助你化身"…...

gem5-gpu教程 第十章 关于topology 的Mesh network

问题一、L1和L2缓存之间的VI_hammer_fusion中指定了互连延迟,如何更改这些数字吗? 我已经实现了一个网格拓扑来连接cpu内核和GPU SM,并对VI_hammer*和网格文件进行了所有必要的更改。我的问题是: 1. There is interconnect latency specified in VI_hammer_fusion betwee…...

【C/C++】C++返回值优化:RVO与NRVO全解析

文章目录 C返回值优化&#xff1a;RVO与NRVO全解析1 简介2 RVO vs NRVO3 触发条件4 底层机制5 应用场景6 验证与限制7 性能影响8 补充说明9 总结 C返回值优化&#xff1a;RVO与NRVO全解析 返回值优化&#xff08;Return Value Optimization, RVO&#xff09;是编译器通过消除临…...

使用 Kaniko来构建镜像

使用 Kaniko来构建镜像 Kaniko 是一种专注于容器镜像构建的开源工具&#xff0c;其核心设计理念与 Docker 存在显著差异。以下从功能定位、技术实现和适用场景三方面进行对比分析&#xff1a; 一、Kaniko 的核心特性 无需 Docker 守护进程 Kaniko 直接在容器或 Kubernetes 集…...

2025.05.17淘天机考笔试真题第三题

&#x1f4cc; 点击直达笔试专栏 &#x1f449;《大厂笔试突围》 &#x1f4bb; 春秋招笔试突围在线OJ &#x1f449; 笔试突围OJ 03. 奇偶平衡树分割问题 问题描述 K小姐是一位园林设计师&#xff0c;她设计了一个由多个花坛组成的树形公园。每个花坛中种植了不同数量的花…...

history模式:让URL更美观

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…...

算法:分治法

实验内容 在一个2kⅹ2k个方格组成的棋盘中&#xff0c;若恰有一个方格与其他方格不同&#xff0c;则称该方格为特殊方格&#xff0c;且称该棋盘为一特殊棋盘。 显然&#xff0c;特殊方格出现的位置有4k 种情况&#xff0c;即k>0,有4k 种不同的特殊棋盘 棋盘覆盖&#xff1a…...

豆粕ETF投资逻辑整理归纳-20250511

目录 一、什么是豆粕 基本概念 豆粕上游生产国 豆粕下游消耗方 二、豆粕ETF 概念 策略 展期操作 超额收益 行情波动 豆粕资产的低相关性 三、展期收益 Contango升水结构和Backwardation贴水结构 豆粕的贴水逻辑 还有哪些品种拥有长期的展期收益 四、其他相关信…...

使用 Python 连接 Oracle 23ai 数据库完整指南

方法一:使用 oracledb 官方驱动(推荐) Oracle 官方维护的 oracledb 驱动(原 cx_Oracle)是最新推荐方案,支持 Thin/Thick 两种模式。 1. 环境准备 pip install oracledb2. 完整示例代码 import oracledb import getpass from typing import Unionclass Oracle23aiConn…...

构建集成差异化灵巧手和先进机器人控制技术的自动化系统

介绍程序 1.流程分析 通过流程分析审查应用机器人自动化的可行性。 2.系统设计 选择合适的机器人&#xff08;机械臂、夹持器、视觉系统等&#xff09;&#xff0c;并通过详细的任务分析设计最佳系统。 3.内部测试 建立内部测试平台并解决任何问题。 4.现场测试 现场设…...

题单:汉诺塔问题

题目描述 如下图所示&#xff0c;设有 nn 个大小不等的中空圆盘&#xff0c;按照从小到大的顺序叠套在立柱 A 上&#xff0c;另有两根立柱 B 和 C 。 现在要求把全部圆盘从 A 柱&#xff08;称为源柱&#xff09;移到 C 柱&#xff08;称为目标柱&#xff09;&#xff0c;移动…...

Unable to get end effector tips from jmg

这个错误信息表明在使用MoveIt2时&#xff0c;moveit_visual_tools无法从关节模型组&#xff08;Joint Model Group&#xff0c;简称JMG&#xff09;中获取末端执行器&#xff08;End Effector&#xff0c;简称EE&#xff09;的尖端信息。这通常是因为配置文件中缺少相关信息&a…...

flutter flutter run 运行项目卡在Running Gradle task ‘assembleDebug‘...

flutter run --verbose在运行flutter run 可以看到是卡在哪一步 最重要的就是自己查看日志&#xff0c;具体哪一步有问题flutter run --verbose使用这个&#xff0c;运行了项目会将错误信息放在控制台 可能原因 静态资源问题如果&#xff1a;图片、字体文件等没有在pubspec.yam…...

STM32烧录程序正常,但是运行异常

一、硬件配置问题 BOOT引脚设置错误 STM32的启动模式由BOOT0和BOOT1引脚决定。若设置为从RAM启动&#xff08;BOOT01&#xff0c;BOOT10&#xff09;&#xff0c;程序在掉电后无法保存&#xff0c;导致复位后无法正常运行。应确保BOOT00&#xff08;从Flash启动&#xff09;15。…...

TTS:F5-TTS 带有 ConvNeXt V2 的扩散变换器

1&#xff0c;项目简介 F5-TTS 于英文生成领域表现卓越&#xff0c;发音标准程度在本次评测软件中独占鳌头。再者&#xff0c;官方预设的多角色生成模式独具匠心&#xff0c;能够配置多个角色&#xff0c;一次性为多角色、多情绪生成对话式语音&#xff0c;别出心裁。 最低配置…...

ecmascript 第6版特性 ECMA-262 ES6

https://blog.csdn.net/zlpzlpzyd/article/details/146125018 在之前写的文章基础上&#xff0c;ES6在export和import的基础外&#xff0c;还有如下特性 特性说明let/const块级作用域变量声明>箭头函数Promise异步编程...

2024 山东省ccpc省赛

目录 I&#xff08;签到&#xff09; 题目简述&#xff1a; 思路&#xff1a; 代码&#xff1a; A&#xff08;二分答案&#xff09; 题目简述&#xff1a; 思路&#xff1a; 代码&#xff1a; K&#xff08;构造&#xff09; 题目&#xff1a; 思路&#xff1a; 代…...

角点特征:从传统算法到深度学习算法演进

1 概述 图像特征是用来描述和分析图像内容的关键属性&#xff0c;通常包括颜色、纹理和形状等信息。颜色特征能够反映图像中不同颜色的分布&#xff0c;常通过 RGB 值或色彩直方图表示。纹理特征则关注图像表面的结构和细节&#xff0c;例如通过灰度共生矩阵或局部二值模式&…...

免费代理IP服务有哪些隐患?如何安全使用?

代理IP已经成为互联网众多用户日常在线活动中不可或缺的一部分。无论是为了保护个人隐私、突破地理限制&#xff0c;还是用于数据抓取、广告投放等商业用途&#xff0c;代理IP都扮演着关键角色。然而&#xff0c;市场上存在大量的免费代理IP服务&#xff0c;尽管它们看起来颇具…...

深入了解 VPC 端点类型 – 网关与接口

什么是VPC 端点 VPC 端点&#xff08;VPC Endpoint&#xff09;是 Amazon Web Services (AWS) 提供的一种服务&#xff0c;允许用户在 Virtual Private Cloud (VPC) 内部安全地访问 AWS 服务&#xff0c;而无需通过公共互联网。VPC 端点通过私有连接将 VPC 与 AWS 服务直接连接…...

Android屏幕采集编码打包推送RTMP技术详解:从开发到优化与应用

在现代移动应用中&#xff0c;屏幕采集已成为一个广泛使用的功能&#xff0c;尤其是在实时直播、视频会议、远程教育、游戏录制等场景中&#xff0c;屏幕采集技术的需求不断增长。Android 平台为开发者提供了 MediaProjection API&#xff0c;这使得屏幕录制和采集变得更加简单…...

信息系统项目管理师高级-软考高项案例分析备考指南(2023年案例分析)

个人笔记整理---仅供参考 计算题 案例分析里的计算题就是进度、挣值分析、预测技术。主要考査的知识点有:找关键路径、求总工期、自由时差、总时差、进度压缩资源平滑、挣值计算、预测计算。计算题是一定要拿下的&#xff0c;做计算题要保持头脑清晰&#xff0c;认真读题把PV、…...

全栈项目搭建指南:Nuxt.js + Node.js + MongoDB

全栈项目搭建指南&#xff1a;Nuxt.js Node.js MongoDB 一、项目概述 我们将构建一个完整的全栈应用&#xff0c;包含&#xff1a; 前端&#xff1a;Nuxt.js (SSR渲染)后端&#xff1a;Node.js (Express/Koa框架)数据库&#xff1a;MongoDB后台管理系统&#xff1a;集成在同…...

Linux:基础IO

一&#xff1a;理解文件 1-1 狭义理解 文件存储在磁盘中&#xff0c;由于磁盘是永久性存储介质&#xff0c;因此文件在磁盘上的存储是永久性的&#xff1b;磁盘也是外设&#xff0c;因此磁盘上对文件的所有操作本质是对外设的输入和输出 1-2 广义理解 Linux下一切皆文件&am…...

MySQL 索引优化以及慢查询优化

在数据库性能优化中&#xff0c;索引优化和慢查询优化是两个关键环节。合理使用索引可以显著提高查询效率&#xff0c;而识别和优化慢查询则能提升整体数据库性能。本文将详细介绍MySQL索引优化和慢查询优化的方法和最佳实践。 一、MySQL 索引优化 1.1 索引的基本概念 索引是…...

Leaflet使用SVG创建动态Legend

接前一篇文章&#xff0c;前一篇文章我们使用 SVG 创建了带有动态文字的图标&#xff0c;今天再看看怎样在地图上根据动态图标生成相关的legend&#xff0c;当然这里也还是使用了 SVG 来生成相关颜色的 legend。 看下面的代码&#xff0c;生成了一个 svg 节点&#xff0c;其中…...

使用 Vue Tour 封装一个统一的页面引导组件

项目开发过程中需要实现用户引导功能&#xff0c;经过调研发现一个好用的 Vue 插件 vue-tour&#xff0c;今天就来分享一下我是如何基于 vue-tour 封装一个统一的引导组件&#xff0c;方便后续在多个页面复用的。 &#x1f4e6; 第一步&#xff1a;安装 vue-tour 插件 首先安装…...

OpenResty 深度解析:构建高性能 Web 服务的终极方案

引言 openresty是什么&#xff1f;在我个人对它的理解来看相当于嵌入了lua的nginx; 我们在nginx中嵌入lua是为了不需要再重新编译,我们只需要重新修改lua脚本,随后重启即可; 一.lua指令序列 我们分别从初始化阶段&#xff0c;重写/访问阶段&#xff0c;内容阶段&#xff0c;日志…...

赋能企业级移动应用 CFCA FIDO+提升安全与体验

移动办公与移动金融为企业有效提升业务丰富性、执行便捷性。与此同时&#xff0c;“安全”始终是移动办公与移动金融都绕不开的话题。随着信息安全技术的发展&#xff0c;企业级移动应用中安全与便捷不再是两难的抉择。 中金金融认证中心&#xff08;CFCA&#xff09;作为经国…...

Redis 数据类型与操作完全指南

Redis 是一个开源的、内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。与传统的关系型数据库不同&#xff0c;Redis 提供了丰富的数据类型和灵活的操作方式&#xff0c;这使得它能够高效地解决各种不同场景下的数据存储和处理问题。本文将全面介绍 R…...

ArrayList-集合使用

自动扩容&#xff0c;集合的长度可以变化&#xff0c;而数组长度不变&#xff0c;集合更加灵活。 集合只能存引用数据类型&#xff0c;不能直接存基本数据类型&#xff0c;除非包装 ArrayList会拿[]展示数据...

深入解析Spring Boot与Redis集成:高效缓存实践

深入解析Spring Boot与Redis集成&#xff1a;高效缓存实践 引言 在现代Web应用开发中&#xff0c;缓存技术是提升系统性能的重要手段之一。Redis作为一种高性能的键值存储数据库&#xff0c;广泛应用于缓存、会话管理和消息队列等场景。本文将详细介绍如何在Spring Boot项目中…...

8天Python从入门到精通【itheima】-11~13

目录 11节-PyCharm的安装和基础使用&#xff1a; 1.第三方IDE&#xff08;集成开发工具&#xff09; 2.PyCharm的所属——jetbrains公司 3.进入jetbrains的官网&#xff0c;搜索下载【官网自带中文&#xff0c;太友好了&#xff0c;爱你&#xff08;づ&#xffe3;3&#x…...

day33-网络编程

1. 网络编程入门 1.1 网络编程概述 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统…...

CMake基础及操作笔记

CMake 基础与操作&#xff1a;从入门到精通 前言 CMake 是一个功能强大、跨平台的构建工具&#xff0c;广泛用于 C 项目管理。它通过简洁的配置文件&#xff08;CMakeLists.txt&#xff09;描述编译过程&#xff0c;生成适用于不同平台的构建脚本&#xff08;如 Makefile 或 …...

使用lvm进行磁盘分区

使用lvm进行磁盘分区 目的&#xff1a; 使用/dev/vdb创建一个5g的逻辑卷挂载到/mnt/lvmtest 前提&#xff1a; /dev/vdb是一块干净的空磁盘&#xff0c;数据会被清空&#xff01;&#xff01;&#xff01; 1. 创建物理卷(PV)&#xff1a; pvcreate /dev/sdb2. 验证&#xf…...

Java的线程通信机制是怎样的呢?

核心观点:线程通信本质是状态同步与数据传递的协同控制 (类比测试团队协作:如同测试用例执行需要同步进度,测试数据需要跨线程传递) 一、基础通信机制(附测试验证方法) 1. 共享内存(最常用但最危险) // 测试典型场景:多线程统计测试用例通过率 public class Share…...