数据结构(初阶7)---七大排序法(堆排序,快速排序,归并排序,希尔排序,冒泡排序,选择排序,插入排序)(详解)
排序
- 1.插入排序
- 2.希尔排序
- 3.冒泡排序
- 4.选择排序(双头排序优化版)
- 5.堆排序
- 6.快速排序
- 1). 双指针法
- 2).前后指针法
- 3).非递归法
- 7.归并排序
- 1).递归版本(递归的回退就是归并)
- 2).非递归版本(迭代版本)
计算机执行的最多的操作之一就有排序,排序是一项极其重要的技能
接下来我们来详细介绍一下,我们遇到最多的排序方法
1.插入排序
首先我们介绍的是最基本的排序方式,插入排序
给定一个数组
[2,3,5,7,6,4,1]
代码实现:如何在数组中实现插入呢,
1.先将p+1的值记住。
2.从后向前遍历,找到比它小的前一个数
3.在遍历的时候,只需要将后面的值赋值给前面的值
void insertsort(int* a, int n)
{for (int count = 0; count < n; count++){int end = count;int tmp = a[count+1];while (end >= 0){if (a[end] > tmp){a[end+1] = a[end];end--;}else{break;}}a[end+1] = tmp;}}
这是最基本的排序方式
遍历了n+(n-1)+(n-2)+…+1
共计时间复杂度为O(n^2);
2.希尔排序
希尔排序是插入排序的升级版,是一种强大的排序方式。
我们发现如果我们正常使用选择排序,如果我的极值在数组的两头,我们就需要花费更多的时间将两头的元素一步一步的移到另一端,所以希尔大佬就发明了一种跳跃式移动的方法——希尔排序
给定一个数组:[5,3,2,4,1,2,2,3,4]需要排为升序
所以我们可以去迭代gap,让gap从sz/3开始逐渐向1迭代,
这样数列逐渐有序->最终变为有序
void ShellSort(int*a,int n)
{int gap=n;while (gap > 1){gap = gap / 3 + 1;for (int count = 0; count < n - gap; count++){int end = count;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}
在实际应用中,希尔排序的平均时间复杂度通常被认为是
O(n log n)到O(n^(1.2)) 之间
3.冒泡排序
冒泡排序应该是所有初学者第一次学习的排序算法,也是效率最低的一种算法
这里就不过多赘述
通过一次次的冒泡排序,每一次都将一个数字移到正确的位置
void swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
void bubblesort(int *p,int sz)
{for (int count = 0; count < sz; count++){for (int cur = 0; cur < sz - count-1; cur++){if (p[cur] > p[cur+1]){swap(p + cur, p + cur + 1);}}}
}
4.选择排序(双头排序优化版)
选择排序应该也是一种十分常见的排序方式
这里我们就在原有基础上优化升级一下,双头选择排序优化版
从两头分别取数,左边取一个交换为较小,右边取一个交换为较大
给定一个数组:[5,3,2,4,1,2,2,3,4]需要排为升序
时间复杂度还是O(n^2)但是效率要略高一些。
5.堆排序
堆排序我已经在这篇文章中仔细地阐述了:
可以点击以下链接去访问:
数据结构(初阶5)—堆与堆排序(详解)
6.快速排序
运用最最广泛的一种排序方式,以其独特的解决思想而闻名。
他的变种和相关推论有许多,这边着重将双指针法,前后指针法
优化方式为三数取中法
快速排序的本质就是分治的思想,递归的思想
给定一个数组:[5,3,2,4,1,2,2,3,4]需要排为升序
1). 双指针法
为什么我们必须让p1先走呢,因为p1先走,最后相遇的时候,
相遇的值一定大于key,可以直接将key与相遇值交换
我们也许会想到,如果key的左边全部都大于key,这种极端的情况下,我们的快排就会变得十分的不稳定
所以我们有一个三数取中的优化方法
先将key与中间值与排头比较,最后将第二大的值与key的位置交换
void swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
int mid_inthree(int* arr, int begin, int end)
{if (arr[begin] > arr[end] && arr[begin] < arr[(begin + end) / 2])return begin;else if (arr[end] > arr[begin] && arr[end] < arr[(begin + end) / 2])return end;elsereturn (end + begin) / 2;
}
void my_qsort(int* arr, int begin, int end)//双指针快排
{if (end <= begin){return;}swap(arr+end, arr+mid_inthree(arr, begin, end));int left = begin, right = end - 1;while (left <= right){while (arr[left] <= arr[end]&&left<=right){left++;}while (arr[right] >= arr[end]&&right>=left){right--;}if (left < right){swap(arr + left, arr + right);}}swap(arr + end, arr + left);my_qsort(arr, begin, left - 1);my_qsort(arr, left + 1, end);
}
2).前后指针法
void swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
int mid_inthree(int* arr, int begin, int end)
{if (arr[begin] > arr[end] && arr[begin] < arr[(begin + end) / 2])return begin;else if (arr[end] > arr[begin] && arr[end] < arr[(begin + end) / 2])return end;elsereturn (end + begin) / 2;
}
void my_qsort2(int* arr, int begin, int end)
{if (end <= begin){return;}swap(arr + end, arr + mid_inthree(arr, begin, end));int cur = begin, prev = begin-1;while (cur<end){while (cur < end && arr[cur] >= arr[end]){cur++;}prev++;swap(arr + cur, arr + prev);}swap(arr + prev+1, arr + end);my_qsort(arr, begin, prev - 1);my_qsort(arr, prev + 1, end);
}
3).非递归法
递归的短板不言而喻,稍微大一点的数组就会导致栈溢出
所以我们这里可以在堆上面建立一个模拟栈,总所周知栈上空间只有M量级,堆上空间却有G量级
大致思路与上面类似,只是多了一个模拟栈,所以选择上面任意一种排序法就行,这里选择双指针快排作为核心
我们的模拟栈的作用是什么:用来存放和调用下标
比如说给定一个数组:[5,3,2,4,1,2,2,3,4]需要排为升序
哪么我的模拟栈中存入 (0,8)这两个区间的脚标
每进行一次快排,去掉内部的两个脚标,再放入四个脚标;
如果区间只有一个数字,就不放入模拟栈
最后栈变为空。
所以代码实现如下:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
// 定义栈节点
typedef int STDataType;typedef struct Stack {STDataType _data;struct Stack* _next;
} Stack;// 初始化栈
Stack* StackIni() {return NULL; // 空栈直接用 NULL 表示
}// 销毁栈
void Stackdestory(Stack* pst) {while (pst) {Stack* tmp = pst;pst = pst->_next;free(tmp);}
}// 入栈
void StackPush(Stack** ppst, STDataType x) {Stack* newNode = (Stack*)malloc(sizeof(Stack));newNode->_data = x;newNode->_next = *ppst; // 新节点指向当前栈顶*ppst = newNode; // 更新栈顶为新节点
}// 出栈
void StackPop(Stack** ppst) {assert(*ppst); // 确保栈非空Stack* tmp = *ppst;*ppst = (*ppst)->_next;free(tmp);
}// 判断栈是否为空
int Stackempty(Stack* pst) {return pst == NULL; // 空栈返回 1,非空返回 0
}// 获取栈顶元素
STDataType Stacktop(Stack* pst) {assert(!Stackempty(pst)); // 确保栈非空return pst->_data;
}
前面是栈的源码操作,和建立
下面实现非递归快排
void swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
int partsort(int* arr, int begin, int end)//双指针核心
{swap(arr + end, arr + mid_inthree(arr, begin, end));int left = begin, right = end - 1;while (left <= right){while (left <= right&&arr[left] <= arr[end]){left++;}while (right >= left &&arr[right] >= arr[end] ){right--;}if (left < right){swap(arr + left, arr + right);}}swap(arr + end, arr + left);return left;
}
void my_qsort3(int* arr, int begin, int end)//非递归快排
{Stack* tmp=StackIni();StackPush(&tmp, end);StackPush(&tmp, begin);while (!Stackempty(tmp)){int begin = Stacktop(tmp);StackPop(&tmp);int end = Stacktop(tmp);StackPop(&tmp);int div = partsort(arr, begin, end);if (div + 1 < end){StackPush(&tmp, end);StackPush(&tmp, div+1);}if (div - 1 > begin){StackPush(&tmp, div - 1);StackPush(&tmp, begin);}}Stackdestory(tmp);
}
这种操作可以有效规避栈溢出,但是不会提高性能。
用了三数取中的方法,我们的快排可以近似为O(nlogn)
7.归并排序
归并排序也是一个十分重要的排序,在许多场景下都有运用,其主要思想是分治
给定一个数组:[5,3,2,4,1,2,2,3]需要排为升序
主要思想如下:
递归到底,再向上归并
1).递归版本(递归的回退就是归并)
代码实现如下,在经历了二叉树便利的学习后,归并排序的代码其实并不难理解
void _MergeSort(int* a, int left, int right, int* tmp)//递归回退就是归并
{if (left >=right){return;}int mid = (left+right) / 2;_MergeSort(a, left, mid,tmp);_MergeSort(a, mid + 1, left, tmp);int begin_1 = left, end_1 = mid;int begin_2 = mid + 1, end_2 = right;int begin_tmp = begin_1;while (begin_1 <= end_1 && begin_2 <= end_2){if (a[begin_1] >= a[begin_2]){tmp[begin_tmp++] = a[begin_2++];}else {tmp[begin_tmp++] = a[begin_1++];}}while (begin_1 <= end_1)//因为是不等长的,所以我们需要考虑不等长的情况{tmp[begin_tmp++] = a[begin_1++];}while (begin_2 <= end_2){tmp[begin_tmp++] = a[begin_2++];}while (left <= end_2)//复制过去{a[left] = tmp[left];left++;}
}
void MergeSort(int* arr, int n)
{assert(arr);int* tmp = (int*)malloc(sizeof(int) * n);_MergeSort(arr,0,n-1,tmp);
}
2).非递归版本(迭代版本)
这个版本有点抽象,这种递归改非递归的题都很让人摸不着头脑qwq
创建数组int arr[ ] = {1,3,5,7,9,2,4,6,8,0};
我们创造一个gap,gap从1开始,为 2^(n-1)+1,这样代表1,3,7,15…刚好表示
代码实现:(切记要控制边界,且要处理特殊情况!!!)
void MergeSortpart(int* a, int left,int mid,int right, int* tmp)
{int begin_1 = left, end_1 = mid;int begin_2 = mid + 1, end_2 = right;int begin_tmp = begin_1;while (begin_1 <= end_1 && begin_2 <= end_2){if (a[begin_1] >= a[begin_2]){tmp[begin_tmp++] = a[begin_2++];}else{tmp[begin_tmp++] = a[begin_1++];}}while (begin_1 <= end_1)//因为是不等长的,所以我们需要考虑不等长的情况{tmp[begin_tmp++] = a[begin_1++];}while (begin_2 <= end_2){tmp[begin_tmp++] = a[begin_2++];}while (left <= right)//复制过去{a[left] = tmp[left];left++;//printf("%d ", a[left]);}
}
void MergeSort(int* arr, int n)
{assert(arr);int* tmp = (int*)malloc(sizeof(int) * n);//_MergeSort(arr,0,n,tmp);int gap = 1;for (gap = 1; gap <= n-1; gap=gap*2+1){for (int x = 0; x+gap<=n; x += gap+1){int begin_1 = x, end_1 = x + gap;int mid = (begin_1 + end_1) / 2;MergeSortpart(arr, begin_1,mid,end_1,tmp);}for (int i = 0; i < n + 1; i++){printf(" %d", arr[i]);}printf("\n");}if (gap/2 != n-1)//处理后面多出来的一小块{MergeSortpart(arr, 0, gap/2, n,tmp);}//_MergeSort(arr,0,n-1,tmp);
}
(*´∀`)~♥
创作不易,恳请留一个赞吧qwq,有留言必回 (*´∀`)~♥
相关文章:
数据结构(初阶7)---七大排序法(堆排序,快速排序,归并排序,希尔排序,冒泡排序,选择排序,插入排序)(详解)
排序 1.插入排序2.希尔排序3.冒泡排序4.选择排序(双头排序优化版)5.堆排序6.快速排序1). 双指针法2).前后指针法3).非递归法 7.归并排序1).递归版本(递归的回退就是归并)2).非递归版本(迭代版本) 计算机执行的最多的操作之一就有排序,排序是一项极其重要的技能 接下…...
题解 洛谷 Luogu P1182 数列分段 Section II 二分答案 C/C++
题目传送门: P1182 数列分段 Section II - 洛谷 | 计算机科学教育新生态https://www.luogu.com.cn/problem/P1182思路: 二分答案,每次以区间 [l, r] 中点 m 为每段和的阈值 判断在此前提下,划分段数是否不大于 M 是就记录答案…...
鸿蒙心路旅程:从实践到创新——开发者的深度技术分享
目录 1. 引言:成为HarmonyOS NEXT开发者的动机 2. 项目初始化与架构设计:从零开始的技术规划 2.1 DevEco Studio的配置与项目初始化 2.2 分层架构设计 3. 分布式应用设计:挑战与解决方案 3.1 分布式架构设计:分布式软总线 …...
elementUI非常规数据格式渲染复杂表格(副表头、合并单元格)
效果 数据源 前端代码 (展示以及表格处理/数据处理) 标签 <el-table :data"dataList" style"width: 100%" :span-method"objectSpanMethod"><template v-for"(item, index) in headers"><el-table-column prop"…...
mysl数据库(八)事务、三种读现象
事务、三种读现象 文章目录 事务、三种读现象一、事务介绍二、事务的使用三、三种读现象 一、事务介绍 事务是mysql的一种机制,一个事务里可以包含多条sql语句。执行事务相当于拍了一张快照,在事务执行完提交以前可以回滚至最初的状态,当然事…...
【DVWA】File Inclusion文件包含实战
安能有术无道有道无心,乐得仁心仁义正心行道。 1.File Inclusion(Low) 相关代码分析 <?php// The page we wish to display $file $_GET[ page ];?>可以看到,服务器端对page参数没有做任何的过滤跟检查。 服务器期望用户的操作是点击下面的…...
(免费送源码)计算机毕业设计原创定制:Java+ssm+JSP+Ajax SSM棕榈校园论坛的开发
摘要 随着计算机科学技术的高速发展,计算机成了人们日常生活的必需品,从而也带动了一系列与此相关产业,是人们的生活发生了翻天覆地的变化,而网络化的出现也在改变着人们传统的生活方式,包括工作,学习,社交…...
异常处理(4)throws
异常处理(4) throws 前言:运行时异常(RuntimeException)或它的子类可以不做处理,因为这类异常很普遍,若全部处理,可能会对程序的可读性和运行效率产生影响。此外,即使不使…...
点云欧式聚类,条件欧式聚类算法原理及推导
点云欧式聚类算法数学推导 点云欧式聚类(Euclidean Clustering for Point Clouds)是点云处理中常用的一种无监督聚类方法。它基于欧式距离将点云中的点划分为多个簇,常用于分割、目标检测等任务。以下是算法的数学推导和实现原理。 问题定义…...
每日十题八股-2024年11月27日
1.类型互转会出现什么问题吗? 2.为什么用bigDecimal 不用double ? 3.装箱和拆箱是什么? 4.Java为什么要有Integer? 5.Integer相比int有什么优点? 6.那为什么还要保留int类型? 7.说一下 integer的缓存 8.怎么…...
C++虚函数面试题及参考答案
什么是虚函数?它的作用是什么? 虚函数是在基类中使用关键字 virtual 声明的成员函数。当在派生类中重写(override)这个函数时,会根据对象的实际类型来调用相应的函数版本,而不是仅仅根据指针或引用的类型来…...
如何搭建C++环境--1.下载安装并调试Microsoft Visual Studio Previerw(Windows)
1.首先,打开浏览器 首先,搜索“Microsoft Visual Studio Previerw” 安装 1.运行VisualStudioSetup (1).exe 无脑一直点继续 然后就到 选择需要的语言 我一般python用pycharm Java,HTML用vscode(Microsoft Visual Studio cod…...
大数据新视界 -- Hive 函数应用:复杂数据转换的实战案例(下)(12/ 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
深入理解 TypeScript:联合类型与交叉类型的应用
在 TypeScript 的世界里,类型系统是核心特性之一,它提供了强大的工具来帮助开发者编写更安全、更可靠的代码。今天,我们将深入探讨 TypeScript 中的两个高级类型特性:联合类型(Union Types)和交叉类型&…...
fiddler抓包工具与requests库构建自动化报告
一. Fiddler 抓包工具 1.1 Fiddler 工具介绍和安装 Fiddler 是一款功能强大的 HTTP 调试代理工具,能够全面记录并深入检查您的计算机与互联网之间的 HTTP 和 HTTPS 通信数据。其主界面布局清晰,主要包含菜单栏、工具栏、树形标签栏和内容栏。 1.2 Fid…...
数据结构——排序算法第二幕(交换排序:冒泡排序、快速排序(三种版本) 归并排序:归并排序(分治))超详细!!!!
文章目录 前言一、交换排序1.1 冒泡排序1.2 快速排序1.2.1 hoare版本 快排1.2.2 挖坑法 快排1.2.3 lomuto前后指针 快排 二、归并排序总结 前言 继上篇学习了排序的前面两个部分:直接插入排序和选择排序 今天我们来学习排序中常用的交换排序以及非常稳定的归并排序 快排可是有多…...
Vue-常用指令
🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vue篇专栏内容:Vue-常用指令 目录 1.1 v-cloak 1.2 双向数据绑定指令 v-model 1.3 v-once 1.4 绑定属性 v-bind…...
守护进程
目录 守护进程 前台进程 后台进程 session(进程会话) 前台任务和后台任务比较好 本质 绘画和终端都关掉了,那些任务仍然在 bash也退了,然后就托孤了 编辑 守护进程化---不想受到任何用户登陆和注销的影响编辑 如何…...
GPON原理
GPON网络架构 对于OLT来说,它就相当于一个指挥官,它指挥PON口下的ONU在指定的时间段内发送数据以及发起测距过程等 而ONU则是一个士兵,按照OLT的指挥做出相应 而ODN它主要就是提供一个传输通道,主要包括分光器和光纤组成 对于PO…...
华三(HCL)和华为(eNSP)模拟器共存安装手册
接上章叙述,解决同一台PC上同时部署华三(HCL)和华为(eNSP)模拟器。原因就是华三HCL 的老版本如v2及以下使用VirtualBox v5版本,可以直接和eNSP兼容Oracle VirtualBox,而其他版本均使用Oracle VirtualBox v6以上的版本,…...
类和对象--中--初始化列表(重要)、隐式类型转化(理解)、最后两个默认成员函数
1.初始化列表 1.1作用: 通过特定的值,来初始化对象。 1.2定义: 初始化列表,就相当于定义对象(开空间)。不管写不写初始化列表,每个成员变量都会走一遍初始化列表(开出对应的空间…...
clickhouse 使用global in 优化 in查询
文章目录 in例子使用global in in例子 SELECT uniq(UserID) FROM distributed_table WHERE CounterID 101500 AND UserID IN (SELECT UserID FROM distributed_table WHERE CounterID 34)对于in 查询来说,本来查询的就是分布式表,假设这个表有100 个…...
macos 14.0 Monoma 修改顶部菜单栏颜色
macos 14.0 设置暗色后顶部菜单栏还维持浅色,与整体不协调。 修改方式如下:...
鸿蒙动画开发07——粒子动画
1、概 述 粒子动画是在一定范围内随机生成的大量粒子产生运动而组成的动画。 动画元素是一个个粒子,这些粒子可以是圆点、图片。我们可以通过对粒子在颜色、透明度、大小、速度、加速度、自旋角度等维度变化做动画,来营造一种氛围感,比如下…...
Matlab 2016b安装教程附安装包下载
软件介绍 MATLAB(矩阵实验室)是MathWorks公司推出的用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境的商业数学软件。MATLAB具有数值分析、数值和符号计算、工程与科学绘图、控制系统的设计与仿真、数字图像处理、数字信…...
Container image .... already present on machine 故障排除
故障现象: Normal Pulled 12s (x2 over 15s) kubelet Container image “registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1” already present on machine kubectl get pods NAME READY STATUS RESTARTS AGE two-pod 1/2 Error …...
力扣 二叉树的层序遍历-102
二叉树的层序遍历-102 class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res; // 二维数组用来存储每层节点if (root nullptr)return res;queue<TreeNode*> q; // 队列用来进行层序遍历q.push(r…...
Java 平衡二叉树 判断 详解
判断平衡二叉树的详解(Java 实现) 平衡二叉树的定义: 平衡二叉树(Balanced Binary Tree)是指一棵二叉树中任意节点的左右子树高度差不超过 1。即: ∣ h e i g h t ( l e f t ) − h e i g h t ( r i g h …...
Java设计模式笔记(一)
Java设计模式笔记(一) (23种设计模式由于篇幅较大分为两篇展示) 一、设计模式介绍 1、设计模式的目的 让程序具有更好的: 代码重用性可读性可扩展性可靠性高内聚,低耦合 2、设计模式的七大原则 单一职…...
【人工智能学习之yolov8改进的网络怎么指定规模】
yolov8改进的网络怎么指定规模 在你更换主干网络或者做了其他修改之后,发现模型总是默认使用的n规模,而n规模有可能无法完成任务,怎么办呢,有什么办法指定规模大小呢? WARNING ⚠️ no model scale passed. Assuming …...
网络安全概述
网络安全 物理安全 网络的物理安全是整个网络系统安全的前提。在 校园网工程建设中,由于网络系统属于 弱电工程,耐压值很低。因此,在 网络工程的设计和施工中,必须优先考虑保护人和 网络设备不受电、火灾和雷击的侵害࿱…...
[MySQL#2] 库 | 表 | 详解CRUD命令 | 字符集 | 校验规则
目录 一. 库操作 1. 创建数据库 2. 字符集和校验规则 校验规则对数据库的影响 显示创建数据库时对应的命令 3. 修改数据库 4. 数据库删除 备份和恢复 还原 查看连接情况 二. 表操作 1. 创建表(定义实例化格式 2. 创建表案例 (实例化数据类型…...
【Unity基础】如何查看当前项目使用的渲染管线?
在 Unity 中,你可以通过以下几种方式查看当前项目使用的是哪个渲染管线: 1. 检查 Graphics Settings 打开 Unity 编辑器,进入顶部菜单:Edit → Project Settings → Graphics。在 Graphics Settings 窗口中,找到 Scr…...
什么是域名监控?
域名监控是持续跟踪全球域名系统(DNS)中变化以发现恶意活动迹象的过程。组织可以对其拥有的域名进行监控,以判断是否有威胁行为者试图入侵其网络。他们还可以对客户的域名使用这种技术以执行类似的检查。 你可以将域名监控比作跟踪与自己实物…...
apache中的Worker 和 Prefork 之间的区别是什么?
文章目录 内存使用稳定性兼容性适用场景 Apache中的Worker和Prefork两种工作模式在内存使用、稳定性以及兼容性等方面存在区别 内存使用 Worker:由于使用线程,内存占用较少。Prefork:每个进程独立运行,内存消耗较大。 稳定性 W…...
解决SSL VPN客户端一直提示无法连接服务器的问题
近期服务器更新VPN后,我的win10电脑一致无法连接到VPN服务器, SSL VPN客户端总是提示无法连接到服务端。网上百度尝试了各种方法后,终于通过以下设置方式解决了问题: 1、首先,在控制面板中打开“网络和共享中心”窗口&…...
网络基础概念
1.网络协议 网络协议是一组标准和规则,用于定义电子设备如何在网络上通信。这些规则涵盖了数据如何格式化,传输,路由以及接收。网络协议确保了不同制造商的设备能够相互理解和交换数据 协议分层 协议也是软件,在设计上为了更好…...
sunshine和moonlight串流网络丢失帧高的问题(局域网)
注:此贴结果仅供参考 场景环境:单身公寓 路由器:2016年的路由器 开始:电脑安装sunshine软件,手机安装moonlight软件开始串流发现网络丢失帧发现巨高 一开始怀疑就是路由器问题,因为是局域网,而…...
远程视频验证如何改变商业安全
如今,商业企业面临着无数的安全挑战。尽管企业的形态和规模各不相同——从餐厅、店面和办公楼到工业地产和购物中心——但诸如入室盗窃、盗窃、破坏和人身攻击等威胁让安全主管时刻保持警惕。 虽然传统的监控摄像头网络帮助组织扩大了其态势感知能力,但…...
CTO 实际上是做什么的?
https://vadimkravcenko.com/shorts/what-cto-does/ 有刪節 本文旨在为软件工程师解密CTO的角色,并为那些渴望担任这一职位的人提供路线图。 “他们是技术团队与公司其他部门之间的桥梁,确保技术支持并推动业务发展。” CTO的角色经常被误解。CTO有时是…...
【软考速通笔记】系统架构设计师④——系统工程基础知识
文章目录 一、前言二、系统工程方法2.1 霍尔的三维结构2.2 切克兰德法2.3 并行工程2.4 综合集成法 三、系统工程生命周期四、系统生命周期方法五、系统性能5.1 计算机的性能指标5.2 路由器的性能指标5.3 交换机的性能指标5.4 网络的性能资料5.5 操作系统的性能指标5.6 数据库的…...
2024赣ctf-web -wp
1.你到底多想要flag??? 首先来解决第一关: 先了解一下stripos(); 并且此函数处理数组返回false。而且pre_match同样遇见数组是返回false(解释一下正则 i:这是正则表达式的修饰符,代表“不区…...
Android Framework AudioFlinge 面试题及参考答案
目录 请解释什么是 AudioFlinger? AudioFlinger 在 Android 系统中的位置是什么? AudioFlinger 的主要职责有哪些? AudioFlinger 如何管理音频流? 在 AudioFlinger 中,什么是音频会话? 请简述 AudioFlinger 的工作流程。 AudioFlinger 是如何与硬件交互的? 在 A…...
英语知识在线平台:Spring Boot技术应用
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
Qt5.14.2的安装与环境变量及一些依赖库的配置
目录 1.Qt5.14.2安装 2.Qt环境变量及一些依赖库的配置 1.Qt5.14.2安装 QT从入门到入土(一)——Qt5.14.2安装教程和VS2019环境配置 - 唯有自己强大 - 博客园 2.Qt环境变量及一些依赖库的配置 假设QT安装目录为: D:\Qt\Qt5.14.2 将目录: D:\Qt\Qt5.14.…...
2024年9月中国电子学会青少年软件编程(Python)等级考试试卷(六级)答案 + 解析
一、单选题 1、下面代码运行后出现的图像是?( ) import matplotlib.pyplot as plt import numpy as np x np.array([A, B, C, D]) y np.array([30, 25, 15, 35]) plt.bar(x, y) plt.show() A. B. C. D. 正确答案:A 答案…...
go编程中yaml的inline应用
下列代码,设计 Config 和 MyConfig 是为可扩展 Config,同时 Config 作为公共部分可保持变化。采用了匿名的内嵌结构体,但又不希望 yaml 结果多出一层。如果 MyConfig 中的 Config 没有使用“yaml:",inline"”修饰,则读取…...
Springboot自带注解@Scheduled实现定时任务
基于Scheduled注解实现简单定时任务 原理 Spring Boot 提供了Scheduled注解,通过在方法上添加此注解,可以方便地将方法配置为定时任务。在应用启动时,Spring 会自动扫描带有Scheduled注解的方法,并根据注解中的参数来确定任务的…...
VSCode【下载】【安装】【汉化】【配置C++环境(超快)】(Windows环境)
目录 一、VSCode 下载 & 安装 二、VSCode 汉化 三、VSCode C配置 配置环境变量 如何验证是否成功 接着在VSCode中配置编辑 一、VSCode 下载 & 安装 VSCode 下载 & 安装-CSDN博客https://blog.csdn.net/applelin2012/article/details/144009210Download Visual St…...
【八股文】小米
文章目录 一、vector 和 list 的区别?二、include 双引号和尖括号的区别?三、set 的底层数据结构?四、set 和 multiset 的区别?五、map 和 unordered_map 的区别?六、虚函数和纯虚函数的区别?七、extern C …...