算法全面剖析

news2024/11/30 0:50:01

算法

查找算法:

顺序查找:

基本思想:

顺序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败(-1)

时间复杂度:

查找成功时的平均查找长度为:(假设每个数据元素的概率相等) ASL = 1/n(1+2+3+…+n) = (n+1)/2 ;当查找不成功时,需要n+1次比较,时间复杂度为O(n);

所以,顺序查找的时间复杂度为O(n)。

基本程序:
int SequenceSearch(int a[], int value, int n){
for(int i=0; i<n; i++){
    if(a[i] == value){
        return i;
    }
}
return -1;
}

二分查找:

前提条件:

元素必须是有序的,如果是无序的则要先进行排序操作

基本思想:

二分查找也称为是折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行直到查找到或查找结束发现表中没有这样的结点

时间复杂度:

最坏情况下,关键词比较次数为log2(n+1),且期望时间复杂度为O(log2n);

基本程序:
int BinarySearch1(int a[], int value, int n){
	int low, high, mid;
	low = 0;
    high = n-1;
    while(low<=high){
    	mid = (low+high)/2;
    	if(a[mid]==value){
    		return mid;
		}else if(a[mid]>value){
			high = mid-1;
		}else if(a[mid]<value){
			low = mid+1;
		}
	}
	return -1;
}

注:折半查找的前提条件是需要有序表顺序存储,对于静态查找表,一次排序后不再变化,折半查找能得到不错的效率。但对于需要频繁执行插入或删除操作的数据集来说,维护有序的排序会带来不小的工作量,那就不建议用 ——《大话数据结构》

排序算法:

比较排序:

冒泡排序:
简介:

冒泡排序(英语:Bubble Sort)又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端

时间/空间复杂度:

时间复杂度最坏情况下为O(n2),最坏情况下为O(n),平均下来约为O(n2)

空间复杂度为O(1);

稳定性:

因排序后相同数字的顺序不变,所以为稳定

代码:

基础法:

void bubblesort(int a[],int n){
   	for (int i = n - 1; i > 0; i--) {
		for (int j = 0; j < i; j++) {
			if (a[j] > a[j + 1])
				swap (a[j], a[j + 1]);
		}
	}
}

提速法:

void bubble_sort(int a[],int n){
    bool flag=true;
    while (flag){
        flag=false;
        for (int i=1;i<n;i++){//检查一遍
            if (a[i]>a[i-1]){//如果当前数大于前一个
                falg=true;
                swap(a[i],a[i-1]);//调换位置
            }else {//如果不是,就将falg设为false,然后就会跳出循环
                falg=false;
            }
        }
    }
}
选择排序:
简介:

选择排序( Selection sort)是一种简单直观的排序算法。一般是初学者接触的第一个排序算法,简称为选排。它的工作原理是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完

时间/空间复杂度:

时间复杂度在最好的情况下为O(n2),在最坏得到情况下也是O(n2),所以平均时间复杂度也是O(n^2)

空间复杂度为O(1)

稳定性:

因为排序完成后,两个相同数字的数的顺序变了,所以为不稳定

代码:
void selection_sort(int a[],int n){
    int k;
    for (int i=0;i<n;i++){
        k=i;
        for (int j=i;j<n;j++){
            if (a[j]<a[k]){//在未排序区域找最小值
                k=j;//并将k设为当前的编号
            }
        }
        swap(a[i],a[k]);
    }
}
插入排序:
简介:

直接插入排序是将无序序列中的数据插入到有序的序列中,在遍历无序序列时,首先拿无序序列中的首元素去与有序序列中的每一个元素比较并插入到合适的位置,一直到无序序列中的所有元素插完为止,即每一步将一个待排序的数据插入到前面已经排好序的有序序列中,直到插完所有元素为止

时间/空间复杂度:

在最好的情况下,时间复杂度为O(n),最坏情况下为O(n2),所以平均时间复杂度为O(n2)

空间复杂度为O(1)

稳定性:

因为排序后相同的数字的位置不变,所以为稳定

代码:
void insertsort(int a[],int n){
    for (int i=1;i<n;i++){
        int key=a[i];
        int j=i-1;
        while (j>=0&&a[j]>key){//寻找位置,并挪移
            a[j+1]=a[j];
            j--;
        }
        a[j+1]=key;//储存
    }
}

非比较排序:

计数排序:
简介:

对于每一个输入元素 x,确定小于 x 的元素个数,利用这一信息,就可以直接把 x 放到它在输出数组中的位置上了。例如,如果有 17 个元素小于 x, 则 x就应该在第 18 个输出位置上。当有几个元素相同时,这一方案要略做修改,因为不能把他们放在同一个输出位置上

时间/空间复杂度:

时间复杂度在最好情况和最坏情况下都为O(n+k),所以平均时间复杂度也为O(n+k)

空间复杂度为o(k)

稳定性:

因为排序完成后相同数字的位置不变,所以为稳定

代码:
void counting_sort(int a[],n){
    int b[100000],cnt[100000];//b为顺序
    for (int i = 0; i < n; i++) {
		b[a[i]]++;//存储每一个数比他小的数的个数
	}
    for (int i=1;i<=n;i++){
        b[i]+=b[i-1];
    }//计算前缀和
    for (int i=n-1;i>=0;i--){
        cnt[b[a[i]]--]=a[i];//放入对应的位置
    }
}

贪心算法:

本质:

利用贪心算法对问题求解时,考虑的并不是对于整体最好的策略,而是总是做出当前看来最好的选择,即贪心算法所作出的选择仅仅是在某种情况下的局部最优解

思路:

1.建立数学模型来解决问题

2.把求解的问题分解成多个子问题(类似于递归)

3.对每个子问题进行求解局部最优解

4.将数据归纳,合并成原来问题的一个解

实现框架:

while/* 或 for */(/*所写内容:向给定的总目标前进一步*/){
    
    //利用可行的策略,求解出一个可行的元素,并保存
    
}
//由所有可行的元素合成一个可行的解

注意事项:

贪心算法并不能一定得到最优解,它只是局部的最优解,所以使用贪心算法有一个大前提,就是局部的最优策略可以产生全局的最优解,除此之外,任何情况都不能完全的使用贪心算法,但有些时候可以利用贪心算法的部分思想

例题分析:

简单贪心算法:

小明去购物,想要买的食品如下,当前小明能拎回的重量不超过15斤,那么小明能拎回的食品的数量最多为?

食物牛奶面包方便面苹果饼干榴莲西瓜
重量/斤4.5123.32.86.28.4
分析思路:

想要得到最多的食品,那么利用贪心算法的策略就应该是每次都选择当前最轻的,这样最后拿到的总数才最多

实现过程:

首先对当前食品按照重量从小到大的顺序进行排序,排序结果如下

i0123456
食物面包方便面饼干苹果牛奶榴莲西瓜
重量/斤122.83.34.56.28.4

然后按照贪心策略进行选择,过程如下

i=0,放入后当前重量为1,不超过15,可以,现在的总数量加1

i=1,放入后当前重量为3,不超过15,可以,现在的总数量加1

i=2,放入后当前重量为5.8,不超过15,可以,现在的总数量加1

i=3,放入后当前重量为9.1,不超过15,可以,现在的总数量加1

i=4,放入后当前重量为13.6,不超过15,可以,现在的总数量加1

i=5,放入后当前重量为19.8,超过15,不可以,现在的总数量不变

i=6,放入后当前重量为22,超过15,不可以,现在的总数量不变

综上可以得知,最多可以带回去的数量为5

样例代码:
double w;//能拎动的的食品的总重量
int n,sum=0,tmp=0;//n为想买的总数量,sum为能拎回去的总数量,tmp为当前准备拎回去的食品的重量
double wg[10];//想买的每件食品的重量
sort(wg,wg+n);//按照从小到大的顺序进行排序
for (int i=0;i<n;i++){//贪心算法
    tmp+=wg[i];
    if (tmp<=tw){//如果当前重量小于或等于能拎动的总数量
        sum++;//就将能拎回去的总数量加1
    }else{
        break;//否则就跳出循环
    }
}
复杂贪心算法:

如果这时小明想要让拎回去的价值最高,那么这个价格又是多少呢?(其他条件与上题一样)

食物牛奶面包方便面苹果饼干榴莲西瓜
价格/元1837.815.8899.220.2
重量/斤4.5123.32.86.28.4
分析思路:

根据贪心算法,现在每一次所选择的食品的价格必须是最高的,但是价格高的食物也有可能很重,所以这时我们就要考虑一个新的东西——性价比(或单价),即价格/重量,那么由此就可以按照性价比从大到小进行排序,然后按照贪心算法进行选择每一次性价比最高的食品,并进行比较,看看重量增加后是否还能拎回去

实验过程:

首先按照性价比由大到小进行排序,结果如下

食物榴莲苹果牛奶方便面饼干面包西瓜
价格/元99.215.8187.88320.2
重量/斤6.23.34.522.518.4
性价比164.843.93.232.4
i0123456

然后按照贪心策略进行选择,过程如下

i=0,放入后重量为6.2,不超过15,可以,此时总价值为99.2

i=1,放入后重量为9.5,不超过15,可以,此时总价值为115

i=2,放入后重量为14,不超过15,可以,此时总价值为133

i=3,放入后重量为16,超过15,不可以,此时总价值为133

i=4,放入后重量为16.5,超过15,不可以,此时总价值为133

i=5,放入后重量为15,不超过15,可以,此时总价值为136

i=6,放入后重量为23.4,超过15,不可以,此时总价值为136

综上可知,小明能够带回去的食品的最大价值为136元

样例代码:
struct food{
    double w,p,j;//w为重量,p为价格,j为性价比
}wg[10];
double k,tmp;//k能拎动的的食品的总重量,tmp为当前准备拎回去的食品的重量
int n,sum;//n为想买的总数量,sum为能拎回去的总资产
sort (wg,wg+n,cmp);//按照性价比从大到小进行排序
for (int i=0;i<n;i++){//贪心算法
    tmp+=w[i].w;
    if (tmp<=k){//如果可以拎动
        sum+=w[i].p;//就将总资产加上当前这个食品的价格
    }else {
        tmp-=w[i].w;//否则就从准备拎回去的食品的重量里删除当前食品的重量
    }
}
洛谷例题:【深基12.例1】部分背包问题

题目描述

阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 N(N<= 100)堆金币,第 i 堆金币的总重量和总价值分别是 mi,vi(1<=mi,vi<= 100)。阿里巴巴有一个承重量为 T(T <= 1000)的背包,但并不一定有办法将全部的金币都装进去。他想装走尽可能多价值的金币。所有金币都可以随意分割,分割完的金币重量价值比(也就是单位价格)不变。请问阿里巴巴最多可以拿走多少价值的金币?

输入格式

第一行两个整数 N,T。

接下来 N行,每行两个整数 mi,vi。

输出格式

一个实数表示答案,输出两位小数

样例输入 #1

4 50
10 60
20 100
30 120
15 45

样例输出 #1

240.00
分析思路:

因为金币可以分割,所以可以用性价比来排序(从大到小),从而获得结果

样例代码:
#include <bits/stdc++.h>
using namespace std;

double value;
struct gold{
	double m,v,o;
}a[120];

bool cmp(gold a1,gold a2){
	return a1.o>a2.o;
}

int main() {
	int n,t;
	cin>>n>>t;
	for (int i=0;i<n;i++){
		cin>>a[i].m>>a[i].v;
		a[i].o=a[i].v/a[i].m;
	}
    sort(a,a+n,cmp);
    for (int i=0;i<n;i++){
    	if (a[i].m<=t){
    		t-=a[i].m;
    		value+=a[i].v;
		}else if (t>0&&t<a[i].m){
			value+=t*a[i].o;
			break;
		}
	}
	printf("%.2lf",value);
	return 0;
}

分治算法:

本质:

分治算法如同字面上说的一样,就是把一个大问题分解成多个小问题,再把每个小问题再分解成更小的问题,直到每一个问题都能够简单的求解为止,向上归纳,就可以得出原问题的答案为所有小问题的解的合并

思路:

(1)建立二叉树模型

(2)将求解的问题分解成多个子问题,然后继续分解,直到能简单求解为止

(3)从最后一层开始向上递推,直到求出原问题的解

实现框架:

int que(int q){//建立函数
    if (){//如果条件成立,即可以简单求解
        return ;//就返回求解答案
    }
    return ;//如果不可以就继续分解
}

注意事项:

如果遇到数据集较小的题目,建议不要使用分治算法,这样不仅浪费时间,还会浪费空间,很容易错失良机

例题分析:

已知有n个数(10000>=a[i])放在数组a中,请用分治算法求解这n个数中的最大值

分析思路:

想要解决这个问题,第一步就是要“分”,顾名思义就是按照二分法将原问题分解成简单的子问题,第二步就是“治”了,即从最下一层开始,向上反推,逐步和解,最终得出答案

实现过程:

分:

将{43556,23452,33259,24955,112142,234074,36467}

分成{43556,23452,33259,24955}与{112142,234074,36467}

继续分为{43556,23452}与{33259,24955}与{112142,234074}与{36467}

现在已经可以比较了,所以进行“治”

治:

{43556,23452}中得出大者为43556,{33259,24955}中得出大者为33259,{112142,234074}中得出大者为234074,{36467}中得出大者为36467

归纳上去,可得到{43556,33259}与{234074,36467}

继续比较可从{43556,33259}中得出大者为43556,{234074,36467}中得出大者为234074

再次归纳可得到{43556,234074}

再次比较可从{43556,234074}得出最大者为234074

至此算法结束,可得到最大者为234074

样例代码:
int max(inr a[],int i,int j){//i为左边界,j为右边界
    int num1=0;num2=0;//为下处比较使用
    if (i==j)return a[i];//如果左右边界相等,即此时只有一个数据,就直接返回这个数据
    else if (i==j-1){//如果左边界等于右边界-1,即此时有两个数据,就返回大的那个数据
        if (a[i]>=a[j)return a[i];
        else return a[j];
    }else {//如果不是,就按照二分法再次进行分段
        int mid=(i+j)/2;//取中点
        //利用递归进行寻找
        num1=max(a,i,mid);
        num2=max(a,mid,j);
        if (num1>=num2)return num1;//比较大小,返回大值
        else return num2;
    }
}

回溯算法:

本质:

即在搜索的尝试过程中,当发已经满足不了求解条件是,利用**“回溯”返回**到上一步,重新选择路线

思路:

(1)正常进行寻找和判断

(2)将一条路探索完

(3)返回到上一次选择方向的地点

实现框架:

模式一:
int search(int k){
    for (int i=0;i<n/*n为算法总数*/;i++){
        if(/*满足条件*/){
            //保存结果
        }
        if(/*到达目标*/){
            //输出结果
        }else {
            search(k+1);
        }
        //恢复到保存结果之前的状态,即回溯一步
    }
}
模式二:
int search(int k){
    if (/*到达目标*/){
        //输出结果
    }else {
        for (int i=0;i<n/*n为算法总数*/;i++){
            if ((/*满足条件*/){
                //保存结果
                search(k+1);
                //恢复到保存结果之前的状态,即回溯一步
            }
        }
    }
}

注意事项:

回溯算法利用的是深度优先搜索的思想,这种算法会很容易超时,容易崩端,所以在使用的时候一定要留足时间

例题分析:

已知一个迷宫以及迷宫的入口和出口,现从迷宫的入口进入,看看是否存在一条路通往出口,如果存在,输出“YES”,如果不存在,就输出“NO”

迷宫造型如下(灰色代表墙壁)
在这里插入图片描述

分析思路:

我们利用“搜索与回溯”的方法进行寻找,即从入口开始,顺着某一方向进行探索,如果能走通,就继续往下走,如果不行就原路返回,换一个方向继续探索,直到所有的路都探索完位置,如果全部都探索完了仍然没有路可以通往出口,就说明没有通往出口的道路

实验过程:

在这里插入图片描述

上图解释:

从入口开始探索,先向右探索,探索两个后碰壁(a),调整方向(b)、(c)、(d),最后发现无路可走,回溯到上一步。

方向调为向下,到下一格,向右探索(e),碰壁,向下探索一步,在此基础上向右探索,成功,继续直到碰壁(g),调整方向,向下,到达出口,成功,探索结束,输出YES

样例代码:
int dx[4]={1,0,-1,0};
int dy[4]={0,-1,0,1};
//初始化前,下,后,上
int x,y,x1,y1,nx,ny,n;
bool visited[100][100],flag=false;
int dfs(int x,int y){
    if (x==x1&&y==y1){//到达
        cout<<"YES"<<endl;
        flag=true;
        return 1;
    }
    for (int i=0;i<4;i++){//搜索四个方向
        nx=x+dx[i];
        ny=y+dy[i];
        if (nx<0||nx>=n||ny<0||ny>n){//判断是否越界
            continue;
        }
        if (visited[nx][ny]==false){
            visited[nx][ny]=true;//标记为走过
            dfe(nx,ny);//然后在此基础上继续往下探索
            visited[nx][ny]=false;//回溯,即标记为未走过
        }
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2059788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年全新基于Java爬取微博数据(完整版)

2024年全新基于Java爬取微博数据(完整版) 爬虫背景爬虫分析爬取微博主页正文列表数据引入jar包编写代码关于微博 Cookie处理文本的正则微博正文长文本补全什么是正文长文本获取正文长文本编写代码导出微博数据到Excel引入jar包编写代码突来的疑问微博正文内容分析转存 图片 o…

继电器介绍及qt操作继电器实战

一.继电器基础介绍 32路继电器通常用于自动化控制系统中&#xff0c;能够同时控制多达32个不同的电气设备。以下是对32路继电器的一些详细介绍&#xff1a; 1. 基本概念 继电器&#xff1a;一种电气控制装置&#xff0c;当输入信号&#xff08;通常是电流或电压&#xff09;…

浏览器请求无缝导入apifox(无需客户端,在线使用)方法

不用下载客户端浏览器在线模拟请求&#xff0c;方便快捷&#xff01; 废话不多少&#xff0c;只需三步&#xff0c;往下看&#xff01; 一步&#xff1a; 打开F12 -> 网络 -> 找到你要模拟的请求&#xff0c;右键以cURL格式复制 二步&#xff1a; Apifox 访问Apifox的w…

“浙里办”统一用户组件-接入 基于单点登录票据换取请求 token

基于单点登录票据换取请求 token 1. 请求地址 政务外网地址: https://bcdsg.zj.gov.cn:8443/restapi/prod/IC33000020220329000007/ uc/sso/access_token 互联网地址: https://ibcdsg.zj.gov.cn:8443/restapi/prod/IC33000020220329000007 /uc/sso/access_token 2. 入参…

AFSim 仿真系统----集成指南

引言 本文档描述了将新功能扩展和集成到 AFSIM 中的有限方法。允许并描述多种方法&#xff0c;以及在 AFSIM 社区标准和指南中引入集成作为可共享资源的要求。 概述 核心可执行文件 基于 AFSIM 的可执行文件通常由单个 AFSIM “应用程序” 组成。该应用程序维护脚本类型、扩…

Linux rocky 9.2 安装mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz

数据库官方下载&#xff1a;MySQL :: Download MySQL Community Server 本文也绑定该资源包&#xff0c;免费提供下载学习。 1.系统版本 2.新建目录&#xff0c;存放数据库安装包&#xff0c;并且上传 需要用到的工具&#xff1a;yum -y install vim lrzsz tar 上传解压&…

SAP EWM 包装

目录 1 简介 2 业务流程 3 主数据 4 后台配置 1 简介 SAP S4 HANA 里 EWM 包装功能使用 PS&#xff08;packaging specification&#xff09;代替原有的包装功能 PM&#xff08;packaging management&#xff09;, PI&#xff08;packaging instruction&#xff09;。PS 生…

UNiapp之微信小程序导出Excel

效果如下 参考小程序&#xff1a;日常记一记 ---账单页面 主要功能是根据筛选条件导出账单明细列表&#xff0c;实现该功能主要借助一个工具(excel.js)&#xff0c;可在文章顶部下载或者一下网盘下载 https://pan.baidu.com/s/1RLisuG4_7FGD0Cnwewyabg?pwdpd2a 提取码: pd2a…

C# 判断

|判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;| | |-------------------------------------------------------------|–| | | | 下面是…

HormonyOS踩坑JSON.stringfy

前两天发现一个问题 就是一个值 用as string就可以打印出来 用JSON.stringfy()就不行 百思不得其解 想破了脑袋&#xff01;&#xff01;&#xff01;终于被我发现了 原因就在于上边那个包&#xff01;&#xff01;&#xff01;&#xff01;把那个包删除了就好了&#xff…

勇闯机器学习(第二关-数据集使用)

以下内容&#xff0c;皆为原创&#xff0c;重在无私分享高质量知识&#xff0c;制作实属不易&#xff0c;请点点关注。 好戏开场了~~~(这关涉及到了加载数据集的代码&#xff0c;下一关&#xff0c;教你们安装机器学习库) 一.数据集 这一关的目标 知道数据集被分为训练集和测…

一款搭载远翔FP5207芯片的大功率音箱,蓝牙音箱的组成和拆解展示

一款搭载远翔FP5207芯片的大功率音箱&#xff0c;蓝牙音箱的组成和拆解展示&#xff1a; 它主要以电池、功放、蓝牙、外壳结构组成。音箱放电需内置升压芯片FP5207或5217进行电池升压给功放供电。 为同时满足便携性需求并提供足够的功率&#xff0c;音箱通常配备了12V铅酸电池…

MySQL中的DML操作()

一、添加数据(INSERT) 1.1 选择插入 INSERT INTO 表名(列名 1 &#xff0c;列名 2 &#xff0c;列名 3.....) VALUES(值 1 &#xff0c;值 2 &#xff0c;值 3......); 1.2 默认值处理(DEFAULT) 在 MySQL 中可以使用 DEFAULT 为列设定一个默认值。如果在插入数据时并未指定该…

【C++】OJ习题(初阶)

&#x1f680;个人主页&#xff1a;奋斗的小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 &#x1f4a5;1、字符串&#x1f4a5;1.1 字符串相加&#x1f4a5;1.2 验证回文字符串&#x1f4a5;1.3 反转…

单例模式 详解

单例模式 简介: 让类只初始化一次, 然后不同的地方都能获取到同一个实例 这是非常常用的一种模式, 系统稍微大一点基本上都会用到. 在系统中, 不同模块的总管理类都已单例模式居多 这里我们不仅使用c实现单例模式, 也会用python2实现一遍 python代码 想要看更详细的python单…

【Python机器学习】NLP——一个简陋的聊天机器人

目录 正则表达式 一个简答的聊天机器人 另一种方法 正则表达式就是一种FSM&#xff0c;同时它也给出了一种可能的NLP方法&#xff0c;即基于模式的方法。 正则表达式 现实生活中&#xff0c;密码锁其实就是一台简单的语言处理机。密码锁不能阅读和理解课本&#xff0c;但是…

高性能web服务器nginx

目录 nginx简介 服务端 I/O 流程 Nginx 进程结构 Nginx启动流程 nginx的源码编译下载 nginx命令常见参数 nginx的配置文件详解 全局配置优化 nginx的平滑升级和回滚 nginx目录匹配优先级测试&#xff08;因为只支持访问文件&#xff0c;所有不比对匹配目录优先级&…

STM32GPIO引脚八种工作模式

1. GPIO简述 GPIO&#xff08;General-purpose input/output&#xff09;&#xff0c;通用型输入输出。简单理解就是我们可以控制输入输出的STM32引脚&#xff0c;统称为GPIO。 GPIO存在的意义就是用程序控制或读取它们的输出或输入。 2. 功能描述 每个GPI/O端口有两个32位配…

代码随想录算法训练营day50:图论01:图论理论基础;深度优先搜索理论基础;98. 所有可达路径;广度优先搜索理论基础

图论理论基础 分类&#xff1a;有向图&#xff0c;无向图&#xff0c;有无权重 度&#xff1a;【无向图】&#xff1a;有几条边连接该节点&#xff0c;该节点就有几度。 【有向图】&#xff1a;每个节点有出度和入度。出度&#xff1a;从该节点出发的边的个数。入度&#xf…

.net maui安卓开发中适用明文传输(一)

背景:最近在做一个pad上的项目,目的是执行每日点检功能(就是检查设备的各项保养指标);前期用HBuilder做了一个,但是现场的触摸屏选用的是TouchPie 安卓版本是6.0版本,上次开发的软件可以在安卓7.0上完美兼容,但由于触摸屏安卓版本太低不能兼容;询问厂商才知道这款触摸…