【数据结构】查找(顺序查找、二分查找、索引顺序查找、二叉排序树、平衡排序树、B树、B+树、哈希表)

news2024/11/27 5:28:30

目录

  • 数据结构——查找
    • 何为查找
      • 1. 查找表
      • 2. 关键字
      • 3. 查找方法效果评价指标——平均查找长度ASL(Average Search Length)
    • 静态查找表
      • 1.顺序查找
      • 2.二分查找
        • 二分查找判定树
      • 3.静态查找表—索引顺序表的查找
        • 索引顺序查找表的算法原理:
    • 动态查找树表
      • 1. 二叉排序树
        • 2. 二叉树的检索算法
        • 3. 二叉排序树的插入算法
        • 4. 二叉排序树的删除算法
        • 5. 最佳二叉排序树
      • 2.平衡二叉树
        • 平衡二叉树(AVL树)(平衡二叉排序树)
        • 平衡旋转技术
      • B-树 和B+树
    • 哈希表查找
      • 哈希表"冲突"现象——冲突处理
        • 1. 开放定址法
        • 2. 再哈希表法
        • 3. 链地址法
        • 4. 建立一个公共溢出区
      • 哈希表的查找
      • 哈希表的删除操作

数据结构——查找

何为查找

1. 查找表

  1. 查找表同一类型的数据元素(或记录)构成的集合

  2. 查找表的操作包括:

  1. 查询某个特定的数据元素是否在查找表中;
  2. 检索某个特定的数据元素的各种属性;
  3. 在查找表中插入一个数据元素;
  4. 从查找表中删去某个数据元素。
  1. 查找表的分类
  1. 静态查找表:只允许做查询和检索操作的查找表。
  2. 动态查找表:除查询和检索操作外,还允许进行插入和删除操作的查找表。

2. 关键字

关键字:是**数据元素(或记录)**中某个数据项的值,用以标识(识别)一个数据元素(或记录)

若此关键字可以识别唯一的一个记录,则称之谓**“主关键字”**
若此关键字能识别若干记录,则称之谓**“次关键字”**
查找表的查询和检索通常是根据关键字进行的

根据给定的值,在查找表中确定一个其关键字等于给定值的数据元素或记录

  1. 若查找表中存在这样一个记录(数据元素),则称查找成功。查找结果给出整个记录(数据元素)的信息,或指示该记录(数据元素)在查找表中的位置;
  2. 否则称此查找不成功。查找结果给出“空记录 ”或“空指针

3. 查找方法效果评价指标——平均查找长度ASL(Average Search Length)

查找速度:平均查找长度ASL(Average Search Length)-为确定记录在表中的位置,需要与给定值进行比较的次数的期望值叫查找算法的平均查找长度

静态查找表顺序查找性能分析:
查找成功的平均查找长度(查找成功的情况下,平均找一个数据元素需要的比较次数称为查找成功的平均查找(检索)长度):
A S L = ( 1 + 2 + … + n ) / n = ( n + 1 ) / 2 ASL=(1+2+…+n)/n=(n+1)/2 ASL=(1+2++n)/n=(n+1)/2
说明:假设每个数据元素查找的概率相同

查找一次的平均检索长度(成功,失败)(*)
A S L = ( n + 1 ) / 2 + ( 1 + 2 + … + n ) / ( 2 ∗ n ) = 3 ( n + 1 ) / 4 ASL=(n+1)/2+(1+2+…+n)/(2*n)=3(n+1)/4 ASL=(n+1)/2+(1+2++n)/(2n)=3(n+1)/4
说明:假设每个数据元素查找的概率相同,并且查找一次成功失败的概率也相同

静态查找表

1.顺序查找

查找方法:从表的一端顺序找到表的另一端 (以线性表表示静态查找表)

  1. 存储结构无特殊要求(数组或链表都可以的)
  2. 元素顺序无要求(有序无序都可以的 )
//顺序表定义
#define max 100
typedef struct{
	KeyType key; ;//说明:KeyType代表关键字的类型
	//……;
}ElemType 

typedef struct{ 
	ElemType elem[max]; 
	int length;
}SqList;
SqList L;

顺序查找:

int search(SqList L, KeyTypex){ 
	//KeyType代表关键字的类型
	for(int i=0;i<L.length;i++)
		if(L.elem[i].key==x) 
			return i+1;//找到数据的位置  +1为了方便表示第几个数据
	return 0;
}
//说明:返回0说明没找到;若找到,返回是x线性表的第几个数据元素

为提高查找速度,设置哨兵项;查找表组织成线性表,线性表的数据元素从下标为1的数组元素开始存放;下标为0的数组元素作为哨兵项(说明:哨兵可设在低端,也可以设在高端)
查找x,首先将x放在下标为0的数组元素(哨兵),从表尾开始比较。若在哨兵
处相等
,说明没找到,否则找到

int srearch(SqList L,KeyTypex)//KeyType代表关键字的类型
{ 
	int k=L.length;
	L.elem[0].key=x;
	while(x!=L.elem[k].key)
		k--;
	return k;
}

//L.elem[0]哨兵项
//说明:返回0说明没找到;若找到,返回是x线性表的第几个数据元素
//说明2:哨兵也可以设在线性表的表尾

静态查找表顺序查找性能分析:
查找成功的平均查找长度(查找成功的情况下,平均找一个数据元素需要的比较次数称为查找成功的平均查找(检索)长度):
A S L = ( 1 + 2 + … + n ) / n = ( n + 1 ) / 2 ASL=(1+2+…+n)/n=(n+1)/2 ASL=(1+2++n)/n=(n+1)/2
说明:假设每个数据元素查找的概率相同

查找一次的平均检索长度(成功,失败)(*)
A S L = ( n + 1 ) / 2 + ( 1 + 2 + … + n ) / ( 2 ∗ n ) = 3 ( n + 1 ) / 4 ASL=(n+1)/2+(1+2+…+n)/(2*n)=3(n+1)/4 ASL=(n+1)/2+(1+2++n)/(2n)=3(n+1)/4
说明:假设每个数据元素查找的概率相同,并且查找一次成功失败的概率也相同

2.二分查找

采用二分查找的要求:查找表组织成有序线性表(递增或递减),且采用顺序存储结构
特点:通过一次比较,将查找范围缩小一半

二分查找通用模板:

// 在单调递增序列a中查找>=x的数中最小的一个(即x或x的后继)
while (low < high)
{
    int mid = (low + high) / 2;
    if (a[mid] >= x)
        high = mid;

    else
        low = mid + 1;
}

// 在单调递增序列a中查找<=x的数中最大的一个(即x或x的前驱)
while (low < high)
{
    int mid = (low + high + 1) / 2;

    if (a[mid] <= x)
        low = mid;

    else
        high = mid - 1;
}

二分查找算法原理:

//有序(递增或递减),顺序存储结构
int binaryS(SqList L, KeyType x){

	int low=0, high=L.length-1, m;
	
	 while(low<=high){
	 	m=(low+high)/2;//
	 	
	 	if(L.elem[m].key==x) 
	 		return m+1; //若找到,返回是x线性表的第几个数据元素
	 	if(L.elem[m].key>x) 
	 		high=m-1; 
	 	else 
	 		low=m+1;
	} 
	
	return 0;
}
//说明:返回0说明没找到;若找到,返回是x线性表的第几个数据元素

■ 二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费 O ( n l o g n ) O(nlogn) O(nlogn)的时间。
■ 二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的数据元素。因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。
■ 对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找链表上无法实现二分查找。(*)
在这里插入图片描述
在这里插入图片描述

二分查找判定树

在这里插入图片描述

在这里插入图片描述

3.静态查找表—索引顺序表的查找

线性表分成若干块,每一块中的键值存储顺序任意的,块与块之间****按键值排序,即后一块中的所有记录的关键字的值均大于前一块中最大键值。

建立一个索引表,该表中的每一项对应于线性表中的一块,每一项由键域(存放相应块的最大键值)和链域(存放指向本块地一个结点的指针)组成。

适用条件:分块有序表

索引顺序表的查找:

■ 首先对索引表采用二分查找顺序查找方法查找,以确定待查记录所在的。 ■
在线性表查找k,若其在线性表中存在,且位于第i块,那么一定有:第i-1块的 最大键值 < k ≤ 第 i 块的最大键值 最大键值<k≤第i块的最大键值 最大键值<ki块的最大键值。 ■
然后在相应的块中进行顺序查找

数据结构(结构体):

typedef struct{    
	KeyType key;    //关键字域
    //…… ;                   // 其它域
}ElemType;//数据结构

typedef struct{    
	ElemType *elem;   // 数据元素存储空间基址
    int length;    // 表的长度
}SSTable;//顺序表

typedef struct{  
  	KeyType MaxKey; //本块最大关键字
   	int FirstLink; //本块第一个结点下标
}IndexTable;//索引表的类型

索引顺序查找表的算法原理:
int Seach_Index(SSTable ST,IndexTable IT[],int b,int n,KeyType k){  		
	int i=1,j;
	//b 为块儿数  Maxkey为每块儿中的最大值
	//索引表查找
   	while((k>IT[i].MaxKey)&&(i<=b))  
          i++;
          
   	if(i>b){  
   		printf("\nNot found");  
   		return(0); 
   	}
   	
   	j=IT[i].FirstLink;      
   	
   	//块儿内查找
   	while((k!=ST.elem[j].key)&&(ST.elem[j].key<=IT[i].MaxKey)  &&(j<n))
    	j++; 
    
    //输出查找结果	
   if(k!=ST.elem[j].key){
   		j=0; 
   		printf("\nNot found"); 
   	}
   return(j);
}

■ 表长为n的线性表,整个表分为b块,前 b-1块中的记录数为s=⎡n/b⎤,第b块中的记录数小于或等于s。

A S L = ( b + 1 ) / 2 + ( s + 1 ) / 2 ASL=(b+1)/2+(s+1)/2 ASL=(b+1)/2+(s+1)/2
(*)
■ 当 s = 根号n ,ASL最小 根号n +1

①索引表查找可使用何方法?①顺序、折半查找
块内查找可使用何方法? ②只能使用顺序查找
③数据可否用链式存储? ③可以使用链式存储
对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找链表上无法实现二分查找。(*)

动态查找树表

1. 二叉排序树

  1. 二叉排序树定义:

二叉排序树或者是一棵空树;或者是具有如下特性的二叉树:

  1. 若它的左子树不空,则子树上所有结点的值均小于根结点的值;
  2. 若它的右子树不空,则子树上所有结点的值均大于根结点的值;
  3. 它的左、右子树也都分别是二叉排序树 (递归)
  1. 二叉排序树的中序遍历结果递增有序
    判断一棵二叉树是否为二叉排序树:看其中序遍历结果是否递增有序
    因此,一个无序序列,可通过构建一棵二叉排序树而成为有序序列

  2. 二叉排序树的主要作用与操作

■ 二叉排序树主要作用:检索,排序
■二叉排序树主要操作:检索,插入(建立),删除

检索:

■ 在二叉排序树中查找是否存在值为x的结点。
查找过程为
① 若二叉排序树为空,查找失败。
②否则,将x与二叉排序树的根结点关键字值比较:若相等,查找成功,结束;
否则,
a.若x小于根结点关键字,在左子树上继续进行,转①
b.若x大于根结点关键字,在右子树上继续进行,转①

  1. 二叉排序树的存储结构**(二叉链表)**

//二叉链表作为二叉排序树的存储结构
typedef struct NODE{
	int key;//数据元素的关键字
	//… ;//数据元素的其他数据项 
	struct NODE *lc,*rc;
}BiNode,*BiTree;

2. 二叉树的检索算法
//二叉排序树的检索算法
Bitree Search(BiNode *t, int x){ 
	BiTree p; //
	p=t;
	while(p!=NULL){ //没找到就是返回空指针
		if (x==p->key)  //找到就返回
			return p; 
			
		if (x < p->key) //左右搜索
			p=p->lc;
		else 
			p=p->rc;
}
return p;
}//函数返回查找结果,没找到为空指针!

在这里插入图片描述

3. 二叉排序树的插入算法

向二叉排序树中插入x:
先要在二叉排序树中进行查找,若查找成功, 按二叉排序树定义,待插入数据已存在,不用插入;查找不成功时,则插入之。
新插入结点一定是作为叶子结点添加上去的。(*)

建立一棵二叉排序树则是逐个插入结点的过程。(*)
同一组数据,输入顺序不同所建二叉排序树不同

//

int Insert(Bitree &t,int x)//二叉排序树的插入算法
{  
	BiTree q, p, s;
	q=NULL; 
	p=t; ;//p为正在查看的节点,初始从根节点开始;q为p的双亲节点,根节点无双亲节点 			
	while(p!=NULL){ //查找
		if (x==p->key)      
			return 0;//在当前的二叉排序树中找到x,直接返回,不再做插入 
			
		q=p;//记录上一个位置
		
		if (x<p->key) 
			p=p->lc; 
		else 
			p=p->rc;
	}
	//最后没找到的话 就是插入到 q的左孩子或右孩子处
	
	s=(BiTree)malloc(sizeof(Binode)) ;//没找到x,做插入:先申请节点空间 
	s->key=x; //初始化
	s->lc=NULL; 
	s->rc=NULL ;//存放x,设为叶节点
	
	if(q==NULL)t=s;//若原先的二叉树是一棵空树,新插入的x对应的节点s为插入后二叉树的根节点
	//这个很重要 要不然空树 后面插入 就报错了。。。 
	else if(x<q->key) 
		q->lc=s; ;//插入s为q的孩子
	else 
		q->rc=s; 
		
	return 1;
}
4. 二叉排序树的删除算法

从二叉排序树中删除一个结点之后,使其仍能保持二叉排序树的特性。

  1. 被删结点为叶结点,由于删去叶结点后不影响整棵树的特性,所以只需将被删结点的双亲结点相应指针域改为空指针
  2. 若被删结点只有右子树 pr只有左子树 pl,此时,只需将prpl替换被删结点即可。
  3. 若被删结点既有左子树 pl 又有右子树pr ,可按中序遍历保持有序进行调整。

左右孩子均存在
左子树中最大的结点q替换被删结点,再删"q" 右子树中最小的结点w替换被删结点,再删"w"
结点q (和w)的特点是最多只有一个孩子

左子树中最大结点的特点是 左子树的根节点一直向右下 直到p->rchild==NULL为真,此时p就是那个左子树中的最大结点。
右子树中最小结点的特点是右子树的根节点一直向左下,直到p->lchild==NULL为真,此时p就是那个右子树中的最小结点。

5. 最佳二叉排序树

二叉排序树查找过程与二分查找判定树相似

  1. n个数据元素按照不同的输入顺序构造的二叉排序树不同,其中平均查找性能最高的为最佳二叉排序树.

  2. 按照二分查找判定树的建立过程建立的二叉排序树为最佳二叉排序树

  3. 二叉排序树的查找速度一般比顺序查找快,但如果是单枝树则一样快。
    注意单枝树的情况

2.平衡二叉树

平衡二叉树(AVL树)(平衡二叉排序树)

希望所建的二叉排序树均为平衡二叉树 (AVL树)
注意需要时刻考虑到 空树 以及 单枝树 的情况

平衡二叉树:空树,或者是具有下列性质的二叉树:

  1. 左、右子树都是平衡二叉树 (递归)
  2. 左、右子树高度之差的绝对值不超过1
  3. 树中每个结点的左、右子树高度之差的绝对值不大于1

结点的平衡因子 B F = 结点的左子树深度 − 右子树深度 结点的平衡因子BF=结点的左子树深度-右子树深度 结点的平衡因子BF=结点的左子树深度右子树深度
平衡二叉树每个结点的平衡因子的绝对值不超过1

平衡旋转技术

如果在一棵AVL树中插入一个新结点,就有可能造成失衡,此时必须重新调整树的结构,使之恢复平衡。我们称调整平衡过程为平衡旋转

平衡旋转可以归纳为四类:

  1. LL平衡旋转–单向右旋
  2. RR平衡旋转–单向左旋
  3. LR平衡旋转–先左旋后右旋
  4. RL平衡旋转–先右旋后左旋

旋转操作特点

  1. 对不平衡的最小子树操作
  2. 旋转后子树根节点平衡因子为0
  3. 旋转后子树深度不变故不影响全树,也不影响插入路径上所有祖先结点的平衡度

平衡树查找的时间复杂度为O(logn)

LL型—单向右旋

在这里插入图片描述

RR型—单向左旋
在这里插入图片描述

LR型—先左旋后右旋:
在这里插入图片描述RL型—先右旋后左旋
在这里插入图片描述

平衡树上进行查找的过程和二叉排序树相同,因此,查找过程中和给定值进行比较的关键字的个数不超过平衡二叉树的深度
(*)
在这里插入图片描述

B-树 和B+树

动态查找表,允许:查找,插入和删除操作

B-树是一种平衡的多路查找树。

哈希表查找

不同的表示方法,其差别仅在于:关键字和给定值进行比较的顺序不同

哈希函数是一个映象,即:将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的大小不超出允许范围即可

哈希表构造方法:

哈希表"冲突"现象——冲突处理

实际应用中不保证总能找到一个不产生冲突的哈希函数。一般情况下,只能选择恰当的哈希函数,使冲突尽可能少地产生。

冲突处理方法:

  1. 开放定址法
  2. 再哈希表法
  3. 链地址法
  4. 建立一个公共溢出区
1. 开放定址法

d i d_i di称为增量,有三种取法:

  1. 线性探测再散列: d i = i d_i = i di=i
  2. 平方(二次)探测再散列: d i = 1 2 , − 1 2 , 2 2 , − 2 2 , 3 2 , − 3 2 , … d_i = 1^2 ,-1^2, 2^2, -2^2, 3^2, -3^2 , … di=12,12,22,22,32,32,
  3. 随机探测再散列: d i d_i di 是一组伪随机数列

在这里插入图片描述
在这里插入图片描述
增量 d i d_i di 应具有“完备性”(*)
在这里插入图片描述

2. 再哈希表法
3. 链地址法

在这里插入图片描述

4. 建立一个公共溢出区

将发生冲突的数据元素顺序存放于一个公共的溢出区

哈希表的查找

查找过程和造表过程一致
哈希表饱和的程度,装载因子 α = n / m α=n/m α=n/m 值的大小(n—数据数,m—表的长度)

在这里插入图片描述

哈希表的删除操作

开放定址法:删除一个数据,为保证查找工作的正常进行不能真删----加删除标志
在这里插入图片描述

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

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

相关文章

7种方法教你如何解决msvcp140_1.dll丢失问题,一键修复dll丢失问题

msvcp140_1.dll 是 Microsoft Visual C 2015 Redistributable 的一部分&#xff0c;它提供了运行时所需的 C 标准库的实现。这个 DLL 文件对于依赖 Visual C 2015 编译的应用程序至关重要&#xff0c;因为它包含了程序运行时所必需的函数和资源。 作用 运行时支持&#xff1a…

点击一张图片,到最后渲染到屏幕,都经历了哪些流程?

文章目录 图像的表示在iOS设备上 图像的表示 位图&#xff08;bitmap&#xff09;是一种常见的图像表示方式&#xff0c;它通过记录图像中每个像素的颜色信息来表示整张图片。以下是位图表示图片的基本原理&#xff1a; 像素网格&#xff1a; 位图将图像分解成一个网格&…

【数据结构】十一、图的应用:Prime算法、Dijkstra算法和拓扑排序

目录 一、最小生成树&#xff08;Prime算法&#xff09; 1&#xff09;概念 2&#xff09;最小生成树的应用 3&#xff09;最小生成树的创建 4&#xff09;代码实现 五、最短路径 1&#xff09;Dijkstra算法 Question&#xff1a; 六、拓扑排序 1&#xff09;概念 2&…

机器学习--线性模型和非线性模型的区别?哪些模型是线性模型,哪些模型是非线性模型?

文章目录 引言线性模型和非线性模型的区别线性模型非线性模型 总结线性模型非线性模型 引言 在机器学习和统计学领域&#xff0c;模型的选择直接影响到预测的准确性和计算的效率。根据输入特征与输出变量之间关系的复杂程度&#xff0c;模型可以分为线性模型和非线性模型。线性…

【SpringBoot + Vue 尚庭公寓实战】根据类型查询标签列表接口实现(五)

【SpringBoot Vue 尚庭公寓实战】根据类型查询标签列表接口实现&#xff08;五&#xff09; 文章目录 【SpringBoot Vue 尚庭公寓实战】根据类型查询标签列表接口实现&#xff08;五&#xff09;1、查看接口2、进行开发 1、查看接口 启动项目 访问&#xff1a;http://localho…

《软件定义安全》之一:SDN和NFV:下一代网络的变革

第1章 SDN和NFV&#xff1a;下一代网络的变革 1.什么是SDN和NFV 1.1 SDN/NFV的体系结构 SDN SDN的体系结构可以分为3层&#xff1a; 基础设施层由经过资源抽象的网络设备组成&#xff0c;仅实现网络转发等数据平面的功能&#xff0c;不包含或仅包含有限的控制平面的功能。…

【Redis学习笔记05】Jedis客户端(中)

Jedis客户端 1. 命令 1.1 String类型 1.1.1 常见命令 SET命令 语法&#xff1a;SET key value [EX seconds | PX milliseconds] [NX|XX] 说明&#xff1a;将string类型的value值设置到指定key中&#xff0c;如果之前该key存在&#xff0c;则会覆盖原先的值&#xff0c;原先…

有什么借助伦敦金行情软件才能做的技术分析方法吗?

现在伦敦金交易都可以在网上去完成&#xff0c;这样我们就必须借助伦敦金行情软件。由于科学技术的发展&#xff0c;现在的伦敦金行情软件不光提供交易买卖的功能&#xff0c;它还有图表分析、时间周期选择等等各种各样的功能&#xff0c;这样丰富了我们的分析手段。那么下面我…

qt4-qt5 升级(2)-GUI-UTF-8-GBK-QTextCode-字符集乱码

MFC与QT的消息机制的区别_qt信号槽机制与mfc的消息映射机制的区别-CSDN博客 1.QT4-QT5差别 kits构建 控件&#xff0c;信号与槽 ui修改好后点击编译会自动生成 ui_XXX.h 聚合的关系&#xff0c;不是拥有的关系。 QWidget 和QWindow有什么差别&#xff1f; 2.VS2019-QT5 构建…

Xsens动作捕捉系统:角色动画制作与运动分析领域的先进工具

随着传感器技术的不断进步&#xff0c;动作捕捉技术现在更加趋向于民用化&#xff0c;拥有价格优势的惯性动作捕捉系统现在更多的出现在独立动画工作室与国内外多所高校的实际项目应用中。 凭借无场地限制、价格优惠、校准使用方便、数据采集精确等多项优势&#xff0c;Xsens惯…

KEIL5如何打开KEIL4的GD工程

GD官方提供的很多KEIL例程为KIEL4的版本&#xff0c;读者使用的时候可能会碰到使用KEIL5打开KEIL4的工程会报错以及无法找到芯片选型的问题&#xff0c;具体表现如下图所示。 我们该怎么办呢&#xff1f; 下面为大家介绍两种方法&#xff1a; 第一种方法是在keil4的工程后缀u…

数据结构---树与二叉树

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

数据结构笔记 3 串 数组 广义表

以下了解即可&#xff0c;暂时没发现有什么考点 参考&#xff1a; 【数据结构】——多维数组和广义表_数据结构loc-CSDN博客 相对应的题目&#xff1a; 他这个数组不是从0开始的&#xff0c;是从1开始的&#xff0c;所以为了配合公式要减1 下面这道题又不一样&#xff0c;它是…

小白教程--- kali(po解)WIFI密码 (图文教程)

kali学得好&#xff0c;牢饭少不了&#xff01;&#xff01;&#xff01; 原理&#xff1a; 模拟WiFi的已连接设备&#xff0c;强制让其下线重连&#xff0c;获取其握手包&#xff0c;使用密码字典&#xff08;宝丽&#xff09;婆洁。 环境&#xff08;准备工作&#xff09;&a…

STM32 uc/OS-III多任务程序

目录 一、项目创建 二、代码移植 1、uC/OS-III源码处理 2、KEIL文件配置 ​编辑3、文件修改 启动文件 ​编辑app_cfg.h includes.h bsp.c和bsp.h main.c lib_ cfg.h app.c和app.h 三、总结 学习目标&#xff1a; 学习嵌入式实时操作系统&#xff08;RTOS&#xf…

【Tool】Matlab 数据分析可视化

一、问题描述 近期围绕imu总是出现问题&#xff0c;自己整理了一下将数据可视化的工具 二、imu 类 1. 待处理数据格式 # yaw roll pitch time -2.08131 -0.0741765 0.0200713 121.281000000 -2.08724 -0.0745256 0.0197222 121.301000000 -2.093 -0.075747…

引入Springcloud--Sleuth-链路追踪中MDC是如何获取到traceid和何时放入traceid的

在分布式项目中需要引入 spring-cloud-starter-sleuth框架来记录跟踪请求在不同服务之前流转的路径。在整个流转路径通过traceid将所有的路径给串联起来。 项目中需要保存traceid来实现日志快速搜索和定位&#xff0c;可以通过MDC.get("traceId")获取到traceId。 …

统计信号处理基础 习题解答10-9

题目 某质检员的工作是监控制造出来的电阻阻值。为此他从一批电阻中选取一个并用一个欧姆表来测量它。他知道欧姆表质量较差&#xff0c;它给测量带来了误差&#xff0c;这个误差可以看成是一个的随机变量。为此&#xff0c;质检员取N个独立的测量。另外&#xff0c;他知道阻值…

gRPC(狂神说)

gRPC&#xff08;狂神说&#xff09; 视频地址&#xff1a;【狂神说】gRPC最新超详细版教程通俗易懂 | Go语言全栈教程_哔哩哔哩_bilibili 1、gRPC介绍 单体架构 一旦某个服务宕机&#xff0c;会引起整个应用不可用&#xff0c;隔离性差只能整体应用进行伸缩&#xff0c;浪…

基于小波多分辨分析的一维时间序列信号趋势检测与去除(MATLAB R2018a)

小波最开始是数学上提出的概念&#xff0c;并且在纯数学的王国里存在了一个世纪之久。最开始是为了弥补傅里叶分析的缺陷&#xff0c;即傅里叶级数发散的问题&#xff0c;并寻找出能够代替傅里叶分析的方法。从最早的一些艰难的探索开始直到慢慢发展成为一套完整系统的小波分析…