数据结构——排序4
上次我们讲解了快速排序的递归的几种做法。
那么,作为一名合格的程序员,改递归为非递归是必要的,现在我们来学习一下非递归的做法:
快速排序非递归:
首先,我们先了解一下,为什么要改为非递归?它有什么弊端?
1.递归有以下劣处:
1)效率问题(但是影响不是太大)对于排序。
2)递归太多会发生栈溢出。
我们举个例子来说明一下:
int Test(int n)
{if (n <= 1)return 1;return n + Test(n);
}int main()
{printf("%d", Test(10000000));return 0;
}
看,当 递归的深度太深的话,它就会出现上面的情况(栈溢出)。
那么,我们改怎么改成非递归呢?
这里我们利用到之前写过的栈来辅助完成
数据结构——栈的实现-CSDN博客
我们知道,栈是后进先出的规则
那么,我们以下面的数据来举例:
第一步:先入栈,两边的位置第一次也就是0和9的下标,这里要注意的是要先入右边right的下标,再入左边left的下标。
入完了之后,出数据(栈是只能栈顶出)
这样,我们就得到了这次使用的范围了,接着使用我们上章节讲过的快速排序的任意一种:取基准值,区分成两部分,一边比基准值小,一边比基准值大的那个过程的代码了,这里有写到。
数据结构——排序3-CSDN博客
这里为了方便,我直接封装成一个函数了,最后用返回值来记录每次基准值的下标位置。
int PartSort3(int* a, int left, int right)
{if (left >= right)return;int midi = GetMidNum(a, left, right);if (midi != left){Swap(&a[left], &a[midi]);}int keyi = left;int prev = left, cur = left + 1;while (cur < right + 1){if (a[cur] < a[keyi] && prev++ != cur)Swap(&a[cur], &a[prev]);cur++;}Swap(&a[keyi], &a[prev]);keyi = prev;return keyi;}
返回keyi基准值的下标位置后,如下图:
出栈时,我们记录下来当前栈顶的数据,分别为begin和end
那我们是不是有得到了一个范围了:[begin,keyi-1] keyi [keyi+1,end]
我们就继续来入栈(还是先入右边,看作整体)即: [keyi+1,right]
入完了之后再两个两个出
结束条件:left>keyi-1和 keyi+1>right
按照此过程循环就可以完成了。
void QuickSort4(int* a, int left, int right)
{ST st;STInit(&st);STPush(&st, right);STPush(&st, left);while (!STEmpty(&st)){int begin = STTop(&st);STPop(&st);int end = STTop(&st);STPop(&st);int keyi = PartSort3(a, begin, end);//[begin,keyi-1]keyi[keyi+1,right]if(keyi + 1 < end){STPush(&st, end);STPush(&st, keyi+1);}if(keyi - 1 > begin){STPush(&st, keyi - 1);STPush(&st, begin);}}Destory(&st);
}
要注意:调用栈时,我们要注意栈的STTypeData的类型是否与此匹配。
归并排序
概念:
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并
它的动图:
我们根据动图知道,它需要一个临时的数组存数据。
所以先开辟临时数组吧:
void MergeSort(int* a,int n)
{int* temp =(int*)malloc(sizeof(int) * n);if (temp == NULL){perror("malloc fail");return;}_MergeSort(a,0,n-1, temp);free(temp);}
步骤:
1.第一张图我们知道,它本来是一个数组的,然后每次将数组拆分成两部分。---拆解
这里我们就可以使用递归的方法,进行拆分,一步一步拆分,直到最后只剩下一下无法再拆分时,结束返回。
2.
这里,拆解的过程,我们看到,拆解成的两个数组是不是都得有开始和结尾。
所以,我们这里肯定不能只定义一个begin和end的,我们要定义begin1,begin2,end1,end2
那么,我们又怎么划分它们各自的范围呢?
我们看上图,发现分解的过程,是不是相当于一个面包分成两个,那我们是不是得找到数组的中间位置下标mid,有了mid后,看这图,我们可以写出他们的范围了
begin1=begin,end1=mid
begin2=mid+1,end2=end;
这里,我们比较数组的值大小,哪个小,就先存到临时数组里面去,以上图为例:
begin1与begin2比较,begin2小,先存到临时数组,然后begin2++,到9那个位置,继续比较,直到全部比完。
当某一个数组的数都完了,另一个数组就直接放到临时数组的后面了(因为单一的数组已经有序了)
当两个数组比完,排好序了,这是只是在临时数组里,我们还要再复制到原来的数组了。这里我们用memcopy这个函数来直接实现了。
下面给出之前写过的相关字符串的知识点,忘的话可以去复习复习。
字符串与内存函数的知识点总结-CSDN博客
代码:
void _MergeSort(int* a, int begin, int end,int* temp)
{//结束条件if (begin >= end)return;//中间数的下标int mid = (begin + end) / 2;//范围//[begin,mid][mid+1,end]_MergeSort(a, begin, mid,temp);_MergeSort(a, mid+1,end,temp);int begin1 = begin, end1 = mid;int begin2 = mid + 1, end2 = end;int i = begin;//printf("[%d,%d][%d,%d]", begin1, end1, begin2, end2);//printf("\n");while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){temp[i++] = a[begin1++];}else{temp[i++] = a[begin2++];}}//比完,另一个数组还有值的情况while (begin1 <= end1){temp[i++] = a[begin1++];}while (begin2 <= end2){temp[i++] = a[begin2++];}//复制memcpy(a+begin, temp+begin, sizeof(int) * (end - begin + 1));}
归并排序的非递归
我们可以看到,每次的变化是不是从1->2->4->8
呈两倍的增长速度,那么我们的递归改非递归,无非就是改成循环。
我们不妨来设置一个gap(间隔)来弄 成循环,每次二倍增长。如下
首先,我们内部的原理肯定是不变的,所以我们直接就以上面的为搬下来就可以了。
int begin1 , end1 ;int begin2 end2 = ;int i = begin;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){temp[i++] = a[begin1++];}else{temp[i++] = a[begin2++];}}//比完,另一个数组还有值的情况while (begin1 <= end1){temp[i++] = a[begin1++];}while (begin2 <= end2){temp[i++] = a[begin2++];}
那么好了之后,我们来写一下外部的循环,即呈两倍增长的过程
int gap=1;
for (int i = 0; i < n; i += 2 * gap){//单趟int begin1=i, end1=i+gap-1;int begin2=gap+i, end2=i+2*gap-1;int j = i;……………………………… }
注意:这里i初始化的值不同,会导致下面begin1,end1,begin2,end2也不同,可以按照自己不同的情况来定begin1,end1,begin2,end2。
这里我采用的是i=0时,我们可以代进去数据来看。
i=0时,begin1=0,end1=0+1-1=0;
begin2=1+0=1,end2=0+2*1-1=1
这是不是就符合我们上面所说的分组的位置逻辑了。
什么时候结束?当gap的增长超过n长度时
int gap=1;
while(gap<n)
{for (int i = 0; i < n; i += 2 * gap){//单趟int begin1=i, end1=i+gap-1;int begin2=gap+i, end2=i+2*gap-1;int j = i;……………………………… }gap*=2;
}
坑:
这里有一个很容易掉坑的细节:memcpy放的位置,是放在for循环里面,还是外面呢?
那么,这又有什么区别呢?
放在for循环里面:归并一部分拷贝一部分
放在for循环外面:间距为gap的多组数据,归并完之后,再一下子拷贝下来。
memcpy(a, temp, sizeof(int) * (end2-i+1));
现在,我们先来讲放在for循环外面的情况先:
我们按照这种运行后,会发现程序崩了
这里有一种非常实用的技巧:
调试技巧:
就是打印出来他们的下标
printf("[%d,%d][%d,%d]", begin1, end1, begin2, end2);
void _MergeSortNon(int* a, int n, int* temp)
{int gap = 1;while (gap < n){for (int i = 0; i < n; i += 2 * gap){//单趟int begin1=i, end1=i+gap-1;int begin2=gap+i, end2=i+2*gap-1;int j = i;观察---------------------------------------------------printf("[%d,%d][%d,%d]", begin1, end1, begin2, end2);-------------------------------------------------------while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){temp[j++] = a[begin1++];}else{temp[j++] = a[begin2++];}}while (begin1 <= end1){temp[j++] = a[begin1++];}while (begin2 <= end2){temp[j++] = a[begin2++];}}memcpy(a, temp, sizeof(int) * (end2-i+1));gap *= 2;//printf("\n");}
}
观察后,我们得到下图: 发现9个数,那么它的下标范围就是0-8,可是我们打印出来的却有9以上的,说明这问题就出现在越界的情况。
现在我们来分析分析:讲复杂问题简单化:分类处理:
1.end1越界了,我们该怎么办?就不归并了。因为ta
2.end1没有越界,但begin2越界了,该怎么办?就不归并了。
3.end2越界了,该怎么办?继续归并,修改end2.
现在,你是把memcpy放到外面,归并完之后,再一下子拷贝下来的。
我们来修正路线:
很多人认为,应该这样子修正:
if (end1 >= n)
{end1=n-1;begin2=n-1;end2 = n - 1;
}
可是,这不就成了这样子了吗?而你是一下拷贝下来的
相当于,你把这蓝色部分也算上了,你memcpy时,临时数组的蓝色位置是随机值,如果你直接拷贝的话,你会把原来数组蓝色部分的地方覆盖了,也会变成随机值。也会发生错误。
所以,我们正确的应该是:
if (end1 >= n)
{end1=n-1;begin2=n;end2 = n - 1;
}
else if (begin2 >= n)
{begin2=n;end2 = n - 1;
} else if (end2 >= n)
{end2 = n - 1;
}
这样begin2-end2的范围:[n,n-1],不符合条件,进不去。
看到了放到外面的繁杂了吧,所以一般说,我们不会采用这种,通常是放到for循环里面,一部分一部分拷贝,更可靠。
放到里面:
这样,我们修改路线:
if (end1 >= n && begin2>=n)
{break;
} else if (end2 >= n)
{end2 = n - 1;
}
因为,我们是一部分一部分拷贝的,所以我们 遇到第一种情况,就break就行了,不用担心它会不会覆盖情况。
完整代码:
void _MergeSortNon(int* a, int n, int* temp)
{int gap = 1;while (gap < n){for (int i = 0; i < n; i += 2 * gap){//单趟int begin1=i, end1=i+gap-1;int begin2=gap+i, end2=i+2*gap-1;int j = i;if (end1 > n || begin2>n){break;}if (end2 > n){end2 = n - 1;} //printf("[%d,%d][%d,%d]", begin1, end1, begin2, end2);while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){temp[j++] = a[begin1++];}else{temp[j++] = a[begin2++];}}while (begin1 <= end1){temp[j++] = a[begin1++];}while (begin2 <= end2){temp[j++] = a[begin2++];}memcpy(a, temp, sizeof(int) * (end2-i+1));}gap *= 2;//printf("\n");}
}
void MergeSortNon(int* a, int n)
{int* temp = (int*)malloc(sizeof(int) * n);if (temp == NULL){perror("malloc fail");return;}_MergeSortNon(a, n,temp);free(temp);
}
相关文章:
数据结构——排序4
上次我们讲解了快速排序的递归的几种做法。 那么,作为一名合格的程序员,改递归为非递归是必要的,现在我们来学习一下非递归的做法: 快速排序非递归: 首先,我们先了解一下,为什么要改为非递归…...
Pycharm中怎么加快下载三方包速度
Pycharm中怎么加快下载三方包速度 使用命令行下载,-i pip install transformers -i https://mirrors.aliyun.com/pypi/simple/ 在Windows系统的PyCharm中使用Python 3.12环境时,可通过以下几种方式配置不同镜像源来加快下载包的速度。 方式一:在PyCharm界面中直接配置镜…...
Spring MVC框架二:创建第一个MVC程序
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 有两种方式 利用配置 1、利用IDEA新建一个Maven项目,添加一个web支持 2、导入常用的依赖 <dependencies><dependency><groupId…...
Netty为什么性能很高?
大家好,我是锋哥。今天分享关于【Netty为什么性能很高?】面试题。希望对大家有帮助; Netty为什么性能很高? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Netty是一款高性能的网络通信框架,主要用于构建高性能的网络应用程序。…...
目标检测tricks
A. Stochastic Weight Averaging (SWA) 1. 基本思想 SWA 的核心思想是通过对训练过程中不同时间点的模型参数进行加权平均,从而获得一个更好的模型。具体来说,SWA 在训练过程的后期阶段对多个不同的模型快照(snapshots)进行平均…...
ai-2、机器学习之线性回归
机器学习之线性回归 1、机器学习2、线性回归2.1、梯度下降法 3、python下调用scikit-learn 1、机器学习 2、线性回归 ####所以y可以当成我们需要的结果,根据公式可以求的y一撇的值更小,所以更接近需要的结果,所以y一撇拟合性更好 2.1、梯度下…...
版图自动化连接算法开发 00001 ------ 直接连接两个给定的坐标点
版图自动化连接算法开发 00001 ------ 直接连接两个给定的坐标点 引言正文定义坐标点的类绘图显示代码直接连接两个坐标点引言 由于人工智能的加速普及,每次手动绘制版图都会觉得特别繁琐,作者本人在想可否搞一个自动化连接器件端口的算法,后期可以根据一些设定的限制进行避…...
删除变慢问题
问题: 有一个场景,每天都会删除数据,SQL为delete from xxx where record_date < DATE_SUB(now(), INTERVAL ? DAY) limit 1000 ,一直循环执行,当执行到最后一次满足条件的时候,就会很慢 原理分析 索引与…...
第十四届蓝桥杯Scratch11月stema选拔赛真题——小猫照镜子
编程实现: 小猫照镜子。(背景非源素材) 具体要求: 1). 运行程序,角色、背景如图所示; 完整题目可点击下方链接查看,支持在线编程~ 小猫照镜子_scratch_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/s…...
Python标准库【os.path】操作路径
文章目录 1 该模块的源文件2 提取路径信息3 获取文件信息4 判定路径状态5 变换路径6 路径拆分 os.path模块实现了一些操作路径相关的函数。它们都接收字符串、字节串格式的路径或类路径对象(实现os.PathLike协议)为参数。 接收字符串时,函数返回的结果也是字符串&am…...
vue3 keep-alive 页面切换不触发onActivated和onDeactivated方法周期
<script setup lang"ts"> import { onActivated, onDeactivated, shallowRef } from vue import CompA from ../components/CompA.vue import CompB from ../components/CompB.vue const current shallowRef(CompA) onActivated(() > {console.log(组件被激…...
Qt 中集成mqtt协议
一,引入qmqtt 库 我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台时 方便,直接编译就行了。 原始仓库路径:https://github.com/emqx/qmqtt/tree/master 二,使用 声明一个单例类,将订阅到…...
JAVA面试_进阶部分_23种设计模式总结
1. 单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这 个实例。 (1)懒汉式 public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载…...
初阶数据结构(C语言实现)——3顺序表和链表(3)
3.链表 3.1 链表的概念及结构 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表的物理结构 1.从上图可看出,链式结构在逻辑上是连续的,但是在物理上不一定连续…...
Vue打包(webpack)缓存
解决方法: 1、修改vue.config.js文件 const Timestamp new Date().getTime();module.exports defineConfig({configureWebpack{output: {filename: [name].${Timestamp}.js,chunkFilename: [name].${Timestamp}.js},},css: {extract: { // 打包后css文件名称添加…...
磁盘阵列新秀GSx并行文件存储是HPC高性能计算/AI 大模型-1替3好省预算
Infortrend 普安存储GSx 并行文件存储系统凭一体化设计,颠覆了传统存储系统的复杂配置模式。内置并行文件系统,支持私有协议或 CIFS 协议,实现客户端/服务器与存储设备的直接连接,无需额外配置I/O节点、元数据服务器及并行系统软件࿰…...
数据基础4: 线性代数基础行列式(矩阵)
二阶 三阶 矩阵和数据之间的关系。 行列式 n,n ;矩阵m行,n列 逆序数 在行列式的计算中,逆序数用于决定每一项前面的符号。 如果一个排列的逆序数是偶数,则该项前面的符号为正; 如果是奇数,则符号为负。 …...
【Project】基于Prometheus监控docker平台
一、设计背景 1.1项目简介 本项目旨在创建一个全面的容器化应用程序监控解决方案,基于Prometheus监控Docker平台上的各种服务。在当今的软件开发环境中,容器化技术已成为一种关键的工具,使应用程序能够更快速、可靠地交付和扩展。然而&…...
AcWing 蓝桥杯集训·每日一题2025·密接牛追踪2
密接牛追踪2 农夫约翰有 N 头奶牛排成一排,从左到右依次编号为 1∼N。 不幸的是,有一种传染病正在蔓延。 最开始时,只有一部分奶牛受到感染。 每经过一个晚上,受感染的牛就会将病毒传染给它左右两侧的牛(如果有的话…...
面试(进阶) —虚拟列表在什么场景使用,如何实现?
面试(进阶) —虚拟列表在什么场景使用,如何实现? 在前端开发中,当需要渲染大量数据时,传统的渲染方式往往会遇到性能瓶颈。一次性将大量数据渲染到DOM中,不仅会导致页面加载缓慢,还可能占用大量内存&#x…...
Linux基础 -- ARM 32位常用机器码(指令)整理
ARM 32位常用机器码(指令)整理 1. 数据处理指令(运算、逻辑、比较) 指令含义示例备注MOV赋值(寄存器传输)MOV R0, R1直接将 R1 复制到 R0MVN取反MVN R0, R1R0 ~R1ADD加法ADD R0, R1, R2R0 R1 R2ADC带进…...
【JAVA】阿里云百炼平台对接DeepSeek-V3大模型使用详解
1、DeepSeek简介 DeepSeek的火热让全世界见证了一场国产AI大模型走向巅峰的盛宴。DeepSeek的横空出世一方面让AI大模型的格局得到重塑,另一方面,对于普通人来说,也有机会零距离的体验到更懂国人的AI大模型。从很多使用过后的小伙伴们的反馈来…...
STM32之时钟树
左边是时钟产生电路,右边是时钟分配电路。中间的SYSCLK就是系统时钟72MHz,在产生电路有四个时钟源,分别是内部8MHz高速RC振荡器,外部的4-16MHz高速石英晶体振荡器,这个一般接8MHz,第三个是外部的32.768kHz低速晶振&…...
QT day1
作业 代码 class Widget: public QWidget {QPushButton* button; //按钮Widget* other; //显示对面 public:Widget(){button new QPushButton("按钮",this); //控件 认this作父this->resize(300,300); //界面大小button->resize(100,10…...
【机器学习】梯度下降法及使用一元二次方程模拟使用梯度下降法的代码实现
梯度下降法 一、摘要二、梯度下降法三、线性方程中使用梯度下降法 一、摘要 文本主要讲述了梯度下降法作为机器学习中的一种优化方法,用于最小化损失函数。它并非直接解决机器学习问题,而是作为求解最优参数的工具。通过二维坐标图直观展示了梯度下降法…...
Hive配置
目录 1. 引言2. 通过docker-compose联动启动Hadoop和MySQL容器3. 配置Hive3.1 下载并解压Hive-4.0.12.2 配置环境变量2.3 安装mysql-connector的jar包2.4 配置Hive2.4.1 hive-env.sh2.4.2 hive-site.xml2.4.2.1 javax.jdo.option.ConnectionURL2.4.2.2 javax.jdo.option.Connec…...
网络安全 越权分为几种
1. 权限查看 Linux 系统中的每个文件和目录都有访问许可权限,通过其确定谁可以通过何种方式对文件和目录进行访问和操作。 文件或目录的访问权限分为只读、只写和可执行3种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改…...
PHP面试题--后端部分
本文章持续更新内容 之前没来得及整理时间问题导致每次都得找和重新背 这次整理下也方便各位小伙伴一起更轻松的一起踏入编程之路 欢迎各位关注博主不定期更新各种高质量内容适合小白及其初级水平同学一起学习 一起成为大佬 数组函数有那些 ps:本题挑难的背因为…...
HTTP~文件 MIME 类型
MIME(Multipurpose Internet Mail Extensions)类型,即多用途互联网邮件扩展类型,是一种标准,用来表示文档、文件或字节流的性质和格式。最初是为了在电子邮件系统中支持非 ASCII 字符文本、二进制文件附件等而设计的&a…...
工程化与框架系列(4)--Webpack 高级配置详解
Webpack 高级配置详解 🛠️ Webpack 是前端工程化中最流行的构建工具之一,掌握其高级配置可以帮助我们构建更高效、更优化的应用。本文将深入探讨Webpack的高级配置技巧和最佳实践。 Webpack 核心概念回顾 🌟 💡 小知识…...
Let‘s Encrypt免费证书的应用示例
文章目录 前言证书申请证书介绍cert.pemchain.pemfullchain.pemprivkey.pem 使用步骤搭建简易demo应用新建nginx配置文件测试SSL是否生效 总结 前言 最近在搞苹果应用上架的问题,据说用HTTP会被拒,但貌似不绝对,2017年苹果曾发公告说必须要求…...
线性模型 - 支持向量机
支持向量机(SVM)是一种用于分类(和回归)的监督学习算法,其主要目标是找到一个最佳决策超平面,将数据点分为不同的类别,并且使得分类边界与最近的数据点之间的间隔(margin)…...
455. 分发饼干(LeetCode)
题目来源: 455. 分发饼干 - 力扣(LeetCode) 题目内容: 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i]…...
Harmony os next~鸿蒙应用开发入门教程
鸿蒙应用开发入门教程 基础准备与环境搭建 1. 了解鸿蒙系统 1.1 核心理念学习 HarmonyOS(鸿蒙系统)是华为推出的全场景分布式操作系统,其核心特点如下: 分布式能力 设备协同:手机、平板、智能手表、IoT设备等可无…...
数据库数据恢复—SQL Server附加数据库报错“错误 823”怎么办?
SQL Server数据库附加数据库过程中比较常见的报错是“错误 823”,附加数据库失败。 如果数据库有备份则只需还原备份即可。但是如果没有备份,备份时间太久,或者其他原因导致备份不可用,那么就需要通过专业手段对数据库进行数据恢复…...
树莓派安装ros docker
系统:bookworm或者ubuntu24都行 一、下载docker和拉取ros:noetic镜像 ubuntu 用鱼香ros脚本安装docker并拉取ros:noetic镜像: https://fishros.org.cn/forum/topic/20/小鱼的一键安装系列 wget http://fishros.com/install -O fishros && . …...
MyBatis-Plus 自动填充功能
MyBatis-Plus(MP) 提供了一个非常强大的功能——自动填充功能。该功能可以在执行插入或更新操作时,自动为某些字段赋值,免去手动设置这些字段的麻烦。常见的应用场景包括 创建时间 和 更新时间 字段的自动填充,帮助开发…...
折半搜索笔记
前言 01 01 01 爆搜的时间复杂度通常为 O ( 2 n ) O(2^n) O(2n),只能应付 N N N 为 20 20 20 左右的题目,但是折半搜索可以应付 N N N 为 30 30 30 ~ 40 40 40 的题目。 思想 将 N N N 个数分为前后两半,先搜索前一半的状态…...
vue 项目部署到nginx 服务器
一 vue 项目打包 1 本地环境 npm run build 2 打包完成生成一个dist 文件夹,将其放到服务器指定的文件夹,此文件夹可以在nginx 配置文件中配置 二 nginx 1 根据对应的系统搜索安装命令 sudo yum install nginx 2 查看conf位置 如果不知道的话 ng…...
JavaWeb基础专项复习6——AJAX
系列文章目录 1、JavaWeb基础专项复习1——XML文件-CSDN博客 2、JavaWeb基础专项复习2——JSP文件-CSDN博客 3、JavaWeb基础专项复习2——Servlet相关知识-CSDN博客 4、JavaWeb基础专项复习4——会话对象Session and Cookie-CSDN博客 5、JavaWeb基础专项复习5——请求对象…...
RabbitMQ快速入门
目录 MQ简介 1、同步通信 图片 2、异步通信 图片 RabbitMQ快速上手 基本介绍: Producer和Consumer Connection和Channel Virtual host Queue Exchange 工作流程 AMQP Java编写RabbitMQ生产者消费者 生产者 1.建立连接 2.开启信道 3.声明交换机 4.声…...
内存中的缓存区
在 Java 的 I/O 流设计中,BufferedInputStream 和 BufferedOutputStream 的“缓冲区”是 内存中的缓存区(具体是 JVM 堆内存的一部分),但它们的作用是优化数据的传输效率,并不是直接操作硬盘和内存之间的缓存。以下是详…...
快速列出MS Word中所有可用字体
Word中有很多字体,虽然在字体下拉列表中提供了字体的样例,但是并不全面,例如使用Batang字体的话,数字会显示成什么效果,就无法直观的看到。 打开Word应用程序,新建一个空白文档,按AltF11打开VBE…...
《机器学习数学基础》补充资料:矩阵的LU分解
本文是对《机器学习数学基础》第2章2.3.3节矩阵LU分解的拓展。 判断是否可LU分解 并非所有矩阵都可以实现LU分解。 定理1: 若 n n n 阶可逆矩阵 A \pmb{A} A 可以进行LU分解,则 A \pmb{A} A 的 k k k 阶顺序主子阵(leading principal s…...
seasms v9 注入漏洞 + order by注入+information_schema解决方法
目录 一、当注入时,information_schema被禁用的解决方法 1.通过sys库可以获取到表名和库名 2.通过无列名注入join获取列名 二、seasms v9 注入漏洞 三、order by注入 一、当注入时,information_schema被禁用的解决方法 information_schema数据库是My…...
跨端方案选型:对比Uni-app与Taro在复杂电商项目中的技术选型依据参考
跨端方案选型:对比Uni-app与Taro在复杂电商项目中的技术选型依据参考 请赏析: Uni-app与Taro复杂电商项目选型对比指南 一、核心选型维度速记 技术栈匹配 → 跨端能力 → 性能优化 → 开发效率 → 生态支持 → 长期维护二、关键维度对比分析 1. 技术栈匹配性 框架技术栈适…...
C语言32个关键字
32个关键字 1.基本数据类型 signed unsigned char int float double short long void 2.构造数据类型 struct union enum 3.数据存储类别 auto static extern register 4.数据优化 const volatile 5. 9条基本语句 if else switch case break default while do for…...
音乐游戏Drummania(GITADORA)模拟器
文章目录 (一)Drummania和GITADORA(1.1)基本情况(1.2)机体 (二)模拟器(2.1)主程序(2.2)模拟器主题 (三)曲谱文…...
WPF中对滚动条进行平滑滚动
有时候我们在动态添加内容时,需要将滚动条滚动到指定内容处。 一般我们会调用ScrollViewer的ScrollToVerticalOffset(垂直方向)函数和ScrollToHorizontalOffset(水平方向)函数来控制滚动条滚动到指定位置。 正常滚动效…...
【通俗讲解电子电路】——从零开始理解生活中的电路(一)
导言:电子电路为什么重要? ——看不见的“魔法”,如何驱动你的生活? 清晨,当你的手机闹钟响起时,你可能不会想到,是电子电路在精准控制着时间的跳动;当你用微波炉加热早餐时&#…...