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

详解二叉树

一、树的概念和结构

树是⼀种非线性的数据结构,它是由 n(n>=0) 个有限结点组成⼀个具有层次关系的集合。把它叫做
树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,而叶朝下的。
• 有⼀个特殊的结点,称为根结点,根结点没有前驱结点。
• 除根结点外,其余结点被分成 M(M>0) 个互不相交的集合 T1、T2、……、Tm ,其中每⼀个集合Ti(1 <= i <= m) ⼜是⼀棵结构与树类似的⼦树。每棵⼦树的根结点有且只有⼀个前驱,可以有 0 个或多个后继。因此,树是递归定义的。
在这里插入图片描述

  • 树形结构中,子树之间不能有交集,否则就不是树形结构。
  • 除了根节点外,每个结点有且仅有一个父节点。
  • 一棵N结点的树有N-1条边。

树的相关术语:

  • 父节点/双亲结点:若一个结点含有子节点,则这个结点称为其子节点的父节点。
  • 子结点/孩子结点:一个结点含有的子树的根节点称为该节点的子节点。
  • 结点的度:一个结点有几个孩子,他的度就是多少。
  • 树的度:一棵树中最大的结点的度称为树的度。
  • 叶子结点/终端结点:度为0的结点称为叶子结点。
  • 分支结点/非终端结点:度不为0的结点。
  • 兄弟结点:具有相同父结点的结点称为兄弟结点。
  • 结点的层次:从根开始定义起,根为第一层,根的子结点为第二层,以此类推。
  • 树的高度或深度:树中结点的最大层次。
  • 结点的祖先:从根到该结点所经分支上的所有结点。
  • 路径:一条从树中任意结点出发,沿父结点-子结点连接,达到任意结点的序列。

树的表示

孩子兄弟表示法:
树结构相对线性表就比较复杂了,要储存表示起来就比较麻烦了,既然保存值域,也要保存结点和结点之间的关系,实际上树有很多种表示方式。这里我们就简单的了解其中最常用的孩子兄弟表示法:

struct TreeNode
{struct Node* child;  //左边开始的第一个孩子结点struct Node* brother;  //指向其右边的下一个兄弟结点int data;  //结点中的数据域
};

在这里插入图片描述

二、二叉树

二叉树不存在度大于2的结点
二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树、

特殊二叉树

满二叉树

一个二叉树如果每一层的结点数都达到最大值,则这个二叉树就是满二叉树。换句话说,如果一个二叉树的层数为k,则结点总数是2^k - 1,则它就是满二叉树。

在这里插入图片描述

完全二叉树

完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。需要注意的是满二叉树是一种特殊的完全二叉树。
在这里插入图片描述

二叉树性质
根据满二叉树的特点可知:

1、若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)个结点
2、若规定根结点的层数为1,则深度为h的二叉树的最大结点数是2^h - 1
3、若规定根结点的层数为1,具有n个结点的满二叉树的深度h=log以2为底(n+1)的对数

二叉树储存结构

二叉树一般可以使用两种结构储存,一种是顺序结构,一种是链式结构。

顺序结构

顺序结构储存就是使用数组来储存,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费,完全二叉树更适合使用顺序结构储存。
在这里插入图片描述

现实中我们通常把堆(是一种二叉树)使用顺序表结构的数组来储存,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

链式结构

二叉树的链式储存结构是指用链表来表示一棵二叉树,即用链表来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左右孩子所在的链结点的储存地址。链式结构又分为二叉链和三链。

三、实现顺序结构二叉树

一般堆使用顺序结构的数组来储存数据,堆是一种特殊的二叉树,具有二叉树的特性的同时,还具备其他的特性。

堆的概念和结构

如果有⼀个关键码的集合 K = {k0 , k1 , k2 , …,kn−1 } ,把它的所有元素按完全⼆叉树的顺序存储方式存储,在⼀个⼀维数中并满足: Ki <= K2∗i+1 ( Ki >= K2∗i+1 且 Ki <= K2∗i+2 ),i = 0、1、2… ,则称为小堆(或大堆)。将根结点最大的堆叫做最大堆或⼤根堆,根结点最小的堆叫做最小堆或小根堆。
在这里插入图片描述

堆具有的特性
堆中某个结点的值总是不大于或不小于其父结点的值
堆总是一棵完全二叉树

二叉树特性

对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有结点从0开始编号,则对于序号为i的结点有:
1、若i > 0,i位置结点的双亲序号:(i - 1)/2;i=0,i为根结点编号,无双亲结点。
2、若2i+1 < n,左孩子序号:2i+1,2i+1>=n否则无左孩子。
3、若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子。

向上调整算法

堆的插入

在开始实现堆这个数据结构的同时我们要先来讲一下向上调整这个算法

将新数据插入到数组的尾上,再进行向上调整算法,直到满足堆。

  • 先将元素插入到堆的末尾,即最后一个孩子之后
  • 插入之后如果堆的性质遭到破坏,将新插入结点顺着其双亲往上调整到合适位置即可。
void AdjustUp(HPDataType* a, int child)
{int parent = (child - 1) / 2;while(child > 0){if (a[child] > a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (parent - 1) / 2;}else{break;}}
}
void HPPush(HP* php, HPDataType x)
{assert(php);if (php->size == php->capacity){size_t newCapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = realloc(php->a, sizeof(HPDataType) * newCapacity);if (tmp == NULL){perror("realloc fail");return;}php->a = tmp;php->capacity = newCapacity;}php->a[php->size] = x;php->size++;AdjustUp(php->a, php->size-1);
}

向下调整算法

堆的删除

删除堆是删除堆顶的数据,将堆顶的数据跟最后一个数据一换,然后删除数组最后一个数据,再进行向下调整算法。

  • 向下调整算法有一个前提:左右子树必须是一个堆才能调整。

将堆顶元素和堆中最后一个元素进行交换
删除堆中最后一个元素。
将堆顶元素向下调整到满足堆特性为止。

void AdjustDown(HPDataType* a, int n, int parent)
{int child = parent * 2 + 1;while (child < n){// 假设法,选出左右孩⼦中⼩的那个孩⼦if (child+1 < n && a[child + 1] > a[child]){++child;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}
void HPPop(HP* php)
{assert(php);assert(php->size > 0);Swap(&php->a[0], &php->a[php->size - 1]);php->size--;AdjustDown(php->a, php->size, 0);
}

堆的实现

stack.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>typedef int STDataType;
//创建数组结构体
typedef struct Stack {STDataType* arr;int top;int capacity;
}ST;//初始化
void STInit(ST* ps);
//栈销毁
void STDestroy(ST* ps);//入栈
void StackPush(ST* ps, STDataType x);//判断栈是否为空
bool StackEmpty(ST* ps);
//出栈
void StackPop(ST* ps);//取栈顶数据
STDataType* StackTop(ST* ps);//获取栈的有效数据个数
STDataType* SizeTop(ST* ps);

stack.c

#define  _CRT_SECURE_NO_WARNINGS 1
#include"stack.h"//初始化
void STInit(ST* ps)
{assert(ps);ps->arr = NULL;ps->capacity = ps->top = 0;
}//栈销毁
void STDestroy(ST* ps)
{if (ps->arr != NULL){free(ps->arr);}ps->arr = NULL;ps->capacity = ps->top = 0;
}//入栈
void StackPush(ST* ps, STDataType x)
{assert(ps);//空间不够if (ps->top == ps->capacity){int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}ps->arr = tmp;ps->capacity = newCapacity;}//空间足够ps->arr[ps->top++] = x;
}//判断栈是否为空
bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}//出栈
void StackPop(ST* ps)
{assert(!StackEmpty(ps));--ps->top;
}//取栈顶元素
STDataType* StackTop(ST* ps)
{assert(ps);return ps->arr[ps->top - 1];
}//栈中有效数据个数
STDataType* SizeTop(ST* ps)
{assert(ps);return ps->top;
}

test,c

#define  _CRT_SECURE_NO_WARNINGS 1
#include"stack.h"void test()
{//初始化ST st;STInit(&st);//入栈StackPush(&st, 1);StackPush(&st, 2);StackPush(&st, 3);StackPush(&st, 4);//出栈/*StackPop(&st);StackPop(&st);StackPop(&st);StackPop(&st);*///出栈打印while (!StackEmpty(&st)){STDataType top = StackTop(&st);printf("%d ", top);StackPop(&st);}STDestroy(&st);
}int main()
{test();return 0;
}

四、实现链式结构二叉树

用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的储存地址,其结构如下:

typedef int BTDataType;
typedef struct BinaryTreeNode
{struct BinTreeNode* left; //指向当前结点左孩子struct BinTreeNode* right; //指向当前结点右孩子BTDataType val; //当前结点值域
}BTNode;

遍历规则

按照规则,二叉树有:前序遍历、中序遍历和后序遍历的递归结构遍历:

  • 前序遍历:访问根节点的操作发生在遍历其左右子树之前

访问顺序是:根节点、左子树、右子树
在这里插入图片描述

void PreOrder(BTNode* root)
{if (root == NULL){printf("N ");return;}printf("%d ", root->val);PreOrder(root->left);PreOrder(root->right);
}
  • 中序遍历:访问根结点的操作发生在遍历其左右子树之中

访问顺序为:左子树、根节点、右子树

在这里插入图片描述

void InOrder(BTNode* root)
{if (root == NULL){printf("N ");return;}InOrder(root->left);printf("%d ", root->val);InOrder(root->right);
}
  • 后序遍历:访问根节点的操作发生在遍历其左右子树之后

访问顺序为:左子树、右子树、根结点
gvbgbtbvvvvggggnübbbbbb

void PostOrder(BTNode* root)
{if (root == NULL){printf("N ");return;}InOrder(root->left);InOrder(root->right);printf("%d ", root->val);
}

图解遍历:
在这里插入图片描述

  • 层序遍历
    除了前序遍历、中序遍历、后序遍历,还可以对二叉树进行层序遍历。假设二叉树的根结点所在的层数为1,层序遍历就是从所在二叉树的根结点出发,首先访问第一层的树根结点,然后从左到右访问第2层上的结点,接着是第三层的结点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。需要注意的是层序遍历需要借助数据结构:队列。
void LevelOrder(BTNode* root)
{Queue q;QueueInit(&q);QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* top = QueueFront(&q);printf("%c ", top->data);QueuePop(&q);if (top->_left){QueuePush(&q, top->_left);}if (top->_right){QueuePush(&q, top->_right);}}QueueDesTroy(&q);
}

实现树

Tree.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <math.h>typedef char BTDatatype;
//创建一个二叉树的数据结构
typedef struct BinaryTreeNode {struct BinaryTreeNode* left;struct BinaryTreeNode* right;BTDatatype data;
}BTNode;//创建结点
BTNode* BTbuyNode( BTDatatype x);
//前序遍历
void PreOrder(BTNode* root);
//中序遍历
void InOrder(BTNode* root);
//后序遍历
void PostOrder(BTNode* root);// ?叉树结点个数
int BinaryTreeSize(BTNode* root);
// ?叉树叶?结点个数
int BinaryTreeLeafSize(BTNode* root);
// ?叉树第k层结点个数
int BinaryTreeLevelKSize(BTNode* root, int k);
//?叉树的深度/?度
int BinaryTreeDepth(BTNode* root);
// ?叉树查找值为x的结点
BTNode* BinaryTreeFind(BTNode* root, BTDatatype x);
// ?叉树销毁
void BinaryTreeDestory(BTNode** root);

Tree.c

#define  _CRT_SECURE_NO_WARNINGS 1
#include "Tree.h"//创建结点
BTNode* BTbuyNode(BTDatatype x)
{BTNode* node = (BTNode*)malloc(sizeof(BTNode));if (node == NULL){perror("malloc fail!");exit(1);}node->left = node->right = NULL;node->data = x;return node;
}//前序遍历(根左右)
void PreOrder(BTNode* root)
{if (root == NULL){printf("NULL ");return;}printf("%c ", root->data);PreOrder(root->left);PreOrder(root->right);
}//中序遍历(左根右)
void InOrder(BTNode* root)
{if (root == NULL){printf("NULL ");return;}InOrder(root->left);printf("%c ", root->data);InOrder(root->right);
}//后序遍历(左右根)
void PostOrder(BTNode* root)
{if (root == NULL){printf("NULL ");return;}PostOrder(root->left);PostOrder(root->right);printf("%c ", root->data);
}// ?叉树结点个数
int BinaryTreeSize(BTNode* root)
{if (root == NULL){return 0;}return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}// ?叉树叶?结点个数
int BinaryTreeLeafSize(BTNode* root)
{if (root == NULL){return 0;}//左右孩子都为NULL则为叶子节点if (root->left == NULL && root->right == NULL){return 1;}return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}// ?叉树第k层结点个数
int BinaryTreeLevelKSize(BTNode* root, int k)
{if (root == NULL){return 0;}if (k == 1){return 1;}return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
}//?叉树的深度/?度
int BinaryTreeDepth(BTNode* root)
{//二叉数的深度 == Max(左子树深度/右子树深度) + 1if (root == NULL){return 0;}return 1 + (BinaryTreeDepth(root->left) > BinaryTreeDepth(root->right) ? BinaryTreeDepth(root->left) : BinaryTreeDepth(root->right));
}// ?叉树查找值为x的结点
BTNode* BinaryTreeFind(BTNode* root, BTDatatype x)
{if (root == NULL){return NULL;}if (root->data == x){return root;}BTNode* LeftFind = BinaryTreeFind(root->left, x);if (LeftFind){return LeftFind;}BTNode* RightFind = BinaryTreeFind(root->right, x);if (RightFind){return RightFind;}
}// ?叉树销毁
void BinaryTreeDestory(BTNode** root)
{if (*root == NULL){return 0;}BinaryTreeDestory(&(*root)->left);BinaryTreeDestory(&(*root)->right);free(*root);(*root) = NULL;
}

test.c

#define  _CRT_SECURE_NO_WARNINGS 1
#include "Tree.h"BTNode* CreateTree()
{//手动创建二叉树BTNode* n1 = BTbuyNode('A');BTNode* n2 = BTbuyNode('B');BTNode* n3 = BTbuyNode('C');BTNode* n4 = BTbuyNode('D');BTNode* n5 = BTbuyNode('E');BTNode* n6 = BTbuyNode('F');BTNode* n7 = BTbuyNode('G');//连接各个节点n1->left = n2;n1->right = n3;n2->left = n4;n2->right = n5;n3->left = n6;n4->left = n7;//n1为根结点return n1;
}void test()
{BTNode* root = CreateTree();//前序遍历//PreOrder(root);//中序遍历//InOrder(root);//后序遍历//PostOrder(root);//二叉树节点个数int TreeSize = BinaryTreeSize(root);printf("二叉树节点个数:%d \n", TreeSize);//二叉树叶子节点个数int TreeLeafSize = BinaryTreeLeafSize(root);printf("二叉树叶子结点个数:%d \n", TreeLeafSize);//二叉树第k层结点的个数printf("二叉树第k层结点的个数:%d \n", BinaryTreeLevelKSize(root, 3));//二叉树的深度/高度printf("二叉树的深度/高度:%d \n", BinaryTreeDepth(root));//?叉树查找值为x的结点BTNode* find = BinaryTreeFind(&root, 'G');if (find){printf("二叉树里有这个值:%c!\n", find->data);}//二叉树的销毁BinaryTreeDestory(&root);
}int main()
{test();return 0;
}

相关文章:

详解二叉树

一、树的概念和结构 树是⼀种非线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成⼀个具有层次关系的集合。把它叫做 树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 • 有⼀个特殊的结点&#xff0…...

Kafka Connect

根据您提供的错误信息和日志分析&#xff0c;这里是一些针对 Kafka Connect、协调者不可用、网络客户端连接问题、消费者组偏移量提交失败以及消费者组协调者发现问题的具体解决建议&#xff1a; 检查 Kafka 集群状态&#xff1a; 使用 kafka-broker-api-versions.sh 检查每个 …...

Mac charles报错 invalid keystore format

1.问题说明 打开charles会有一个 invalid keystore format的提示&#xff0c;更隐藏的影响&#xff0c;是安卓设备安装了凭证&#xff0c;但是charles仍然抓不到包&#xff0c;会展示unknow&#xff0c;即使是charles配置好了ssl proxy setting&#xff0c;并且mac信任了char…...

Leetcode 409. Longest Palindrome

Problem Given a string s which consists of lowercase or uppercase letters, return the length of the longest palindrome that can be built with those letters. Letters are case sensitive, for example, “Aa” is not considered a palindrome. Algorithm Count …...

事件代理详解

一、基本概念 事件代理&#xff08;Event Delegation&#xff09;&#xff0c;也称为事件委托&#xff0c;是一种在 JavaScript 中处理事件的技术。它基于 DOM&#xff08;文档对象模型&#xff09;事件流的原理&#xff0c;利用事件冒泡机制&#xff0c;将一个元素&#xff0…...

代码随想录算法训练营第三天 | 链表理论基础 | 203.移除链表元素

感觉上是可以轻松完成的&#xff0c;因为对链接的结构&#xff0c;元素的删除过程心里明镜似的 实际上四处跑气 结构体的初始化好像完全忘掉了&#xff0c;用malloc折腾半天&#xff0c;忘记了用new&#xff0c;真想扇自己嘴巴子到飞起删除后写一个函数&#xff0c;把链表打印…...

专业140+总分410+浙江大学842信号系统与数字电路考研经验浙大电子信息与通信工程,真题,大纲,参考书。

考研落幕&#xff0c;本人本中游211&#xff0c;如愿以偿考入浙江大学&#xff0c;专业课842信号系统与数字电路140&#xff0c;总分410&#xff0c;和考前多次模考预期差距不大&#xff08;建议大家平时做好定期模考测试&#xff0c;直接从实战分数中&#xff0c;找到复习的脉…...

Python-pptx库简介

目录 一、Python-pptx 库概述 二、安装 Python-pptx 库 三、创建演示文稿 四、添加文本内容 五、添加形状 六、添加图片 七、添加图表 八、保存演示文稿 九、示例演示文稿 十、总结 在Python编程中&#xff0c;处理演示文稿是一项常见的任务。Python-pptx库为我们提供…...

电子应用设计方案-52:智能电子相框系统方案设计

智能电子相框系统方案设计 一、引言 智能电子相框作为一种能够展示数字照片和多媒体内容的设备&#xff0c;为用户提供了便捷、个性化的照片展示方式。本方案旨在设计一款功能丰富、用户体验良好的智能电子相框系统。 二、系统概述 1. 系统目标 - 高质量显示照片和视频&#…...

mac 安装CosyVoice (cpu版本)

CosyVoice 介绍 CosyVoice 是阿里研发的一个tts大模型 官方项目地址&#xff1a;https://github.com/FunAudioLLM/CosyVoice.git 下载项目&#xff08;非官方&#xff09; git clone --recursive https://github.com/v3ucn/CosyVoice_for_MacOs.git 进入项目 cd CosyVoic…...

mysql命令行界面(黑框)的登录

文章目录 开启关闭服务报错登录mysql退出mysql数据据database在电脑中的存放位置删除数据库语句 drop注意 cmd用管理员打开 开启关闭服务 报错 我有这个报错&#xff0c;但是使用没什么影响 登录mysql root替换成自己的用户名 退出mysql exit 数据据database在电脑中的…...

Git 快速入门

Git 是什么&#xff1f; Git 是一个分布式版本控制系统四大区域&#xff1a; 工作区&#xff1a;项目文件的当前状态&#xff0c;即本地目录。暂存区&#xff1a;保存将要提交的文件快照&#xff0c;是一个中间层&#xff0c;使用git add将文件添加到暂存区。本地仓库&#xf…...

优先队列及其应用

优先队列 优先队列是一种特殊的队列数据结构&#xff0c;它的特点是每个元素都有一个优先级&#xff0c;出队操作按照优先级而不是入队顺序来决定。 当优先队列为从大到小排列时&#xff0c;队列元素的头部始终保持数值最大&#xff0c;并且可以通过队尾插入数据&#xff0c;…...

Python:基于PyCharm的简单程序创建及运行-HelloWorld

1. 新建项目 2. 设置文件位置&#xff0c;并创建项目 文件位置由“目录项目名称”组成&#xff0c;如&#xff1a;D:\PycharmProjects\HelloWorld&#xff0c;“HelloWorld”则是项目名称。 3. 创建Python文件 4. 定义文件名称&#xff0c;如HelloWorld。双击【Python 文件】完…...

MySQL笔记--多表查询

1--多表关系 多表关系基本上分为三种&#xff1a; 一对多&#xff08;多对一&#xff09;&#xff1b; 多对多&#xff1b; 一对一&#xff1b; 1-1--多对一 在多的一方建立外键&#xff0c;指向一的一方的主键&#xff1b; 1-2--多对多 建立第三张中间表&#xff0c;中间表至少…...

CentOS Stream Linux操作系统最新版本安装部署

https://www.centos.org/ 如上所示&#xff0c;从CentOS Stream Linux操作系统官方网站下载最新版本的操作系统安装源文件。 如上所示&#xff0c;在VMware中设置CentOS Stream Linux操作系统的安装属性&#xff0c;包括设置运行内存容量、处理器核数、硬盘容量、网络连接模式…...

D95【python 接口自动化学习】- pytest进阶之fixture用法

day95 pytest的fixture详解&#xff08;二&#xff09; 学习日期&#xff1a;20241210 学习目标&#xff1a;pytest基础用法 -- pytest的fixture详解&#xff08;二&#xff09; 学习笔记&#xff1a; fixture(autouseTrue) func的autouse是TRUE时&#xff0c;所有函数方法…...

自动化立体仓库堆垛机SRM控制系统运行控制功能块开发设计

1、堆垛机SRM控制系统硬件组态如下图 G120变频器,通信报文111 2、堆垛机SRM控制系统HMI屏幕页面如下图 运行、起升、货叉相关参数设定 3、堆垛机SRM控制系统中相关变量定义如下图 行走报警 行走条码位置反馈 行走条码速度反馈 行走正极限 行走负极限 4、运行控制功能块代码…...

测试工程师的职业规划

测试人员在管理上的发展 基层测试管理者&#xff1a;测试组长 工作内容&#xff1a;安排小组工作&#xff0c;提升小组成员测试能力&#xff0c;负责重要的测试工作。 负责对象&#xff1a;版本&#xff0c;项目 中层测试管理者&#xff1a;测试经理 负责对象&#xff1…...

CSS:html中,.png的动态图,怎么只让它显示部分,比如只显示右上部分的,或右边中间部分

目录 背景 方法 1: 使用 background-image 和 background-position 示例代码 解释 方法 2: 使用 clip-path 裁剪图像 示例代码 解释 方法 3: 使用 object-fit 和 overflow 示例代码 解释 示例 总结 背景 在HTML中,如果你有一个 .png 的动态图(例如一个 GIF 动画或…...

Python音频处理:如何将立体声转换为单声道并调整采样率

Python音频处理&#xff1a;如何将立体声转换为单声道并调整采样率 问题背景解决方案1. 首先导入需要的库2. 将立体声转换为单声道3. 调整采样率4. 处理音频块 代码解释注意事项小贴士总结 大家好&#xff01;今天我们来学习一个简单但实用的音频处理小技巧 - 如何使用Python将…...

go语言并发读写数据队列,不停写的同时,一次最多读取指定量数据(逐行注释)

1、数据队列可以存储任意类型的一个数据&#xff08;下程序是添加整数值&#xff09;。 数据队列代码点这里查看《go语言结构体实现数据结构队列&#xff08;先进先出&#xff09;存储数据&#xff08;逐行注释&#xff09;》 2、读写操作并发进行&#xff08;下程序向队列中…...

2024 年最新前端ES-Module模块化、webpack打包工具详细教程(更新中)

模块化概述 什么是模块&#xff1f;模块是一个封装了特定功能的代码块&#xff0c;可以独立开发、测试和维护。模块通过导出&#xff08;export&#xff09;和导入&#xff08;import&#xff09;与其他模块通信&#xff0c;保持内部细节的封装。 前端 JavaScript 模块化是指…...

【深度学习】服务器常见命令

1、虚拟环境的安装位置 先进入虚拟环境 which python2、升序查看文件内容 ls -ltr3、查看服务器主机空间使用情况 df -hdf -h .4、查看本地空间使用情况 du -sh ./*du -sh * | sort -nr5、查找并删除进程 # 查找 ps aux# 删除 kill -KILL pid6、查看服务器配置 lscpuuna…...

C++小白实习日记——Pollnet,Efvi,UDP,数据类型转换(下)

内容太多了&#xff0c;这篇记录UDP接收端 一&#xff0c;UDP接收端接收数据 有了pollnet这个开源项目的支持&#xff0c;接收端的步骤为&#xff1a;1&#xff09;初始化硬编码的参数&#xff1a;接口&#xff0c;IP和端口 2&#xff09;创建接收文件.csv 3&#xff09;读…...

pytorch bilstm crf的教程,注意 这里不支持批处理,要支持批处理 用torchcrf这个。

### Bi-LSTM Conditional Random Field ### pytorch tutorials https://pytorch.org/tutorials/beginner/nlp/advanced_tutorial.html ### 模型主要结构&#xff1a; ![title](sources/bilstm.png) pytorch bilstm crf的教程&#xff0c;注意 这里不支持批处理 Python version…...

C# OpenCV机器视觉:畸变矫正

在一个阳光明媚的早晨&#xff0c;阿强决定去拍照。他拿起相机&#xff0c;穿上他最喜欢的羊毛大衣&#xff0c;准备记录下生活中的美好瞬间。可是&#xff0c;当他兴奋地查看照片时&#xff0c;发现自己拍的每一张都像是被外星人用变形金刚的力量扭曲过一样&#xff01;“这是…...

Java 密封类 (Sealed Classes) 深度解析

文章目录 语法说明定义密封类定义子类 使用场景探讨实际应用示例与其他语言特性的结合使用 Java 作为一种面向对象编程语言&#xff0c;提供了继承机制来实现代码复用和扩展。然而&#xff0c;无限制的继承可能导致代码库变得难以维护&#xff0c;甚至引入安全隐患。为了应对这…...

conda和pip源

conda 地址 ~/.condarc中科大源 channels:- conda-forge- https://mirrors.ustc.edu.cn/anaconda/pkgs/main/- https://mirrors.ustc.edu.cn/anaconda/pkgs/r/- https://mirrors.ustc.edu.cn/anaconda/pkgs/msys2/- defaults show_channel_urls: true查看 conda config --s…...

【c++数学】解一元一次方程

注意&#xff1a;没有合并多项式的功能&#xff0c;且未知数必须只在左边&#xff0c;右边是常数&#xff01;&#xff01;&#xff01; 好用记得点赞&#xff01; 代码如下&#xff1a; #include<iostream> #include<stdio.h>using namespace std;string q,f;d…...

【超详细实战攻略】Jmeter逻辑控制器中if控制器、模块控制器、测试片段的使用方法

【超详细实战攻略】Jmeter逻辑控制器中if控制器、模块控制器、测试片段的使用方法 1 搭建测试对象1.1 禅道下载1.2 禅道安装1.3 运行禅道1.4 接口查看1.5 接口选择 2 Jmeter前置操作2.1 创建Jmeter线程组2.2 创建信息头管理器和请求默认值2.3 添加获取token接口2.4 添加监听器 …...

采用qL-MPC技术进行小型固定翼无人机的路径跟随控制

来自论文"Predictive Path-Following Control for Fixed-Wing UAVs Using the qLMPC Framework in the Presence of Wind Disturbances" 控制架构 采用的是 ULTRA-Extra无人机&#xff0c;相关参数如下&#xff1a; 这里用于guidance law的无人机运动学模型为&#…...

比特币是否会取代美元(以及其他主权货币)

上图是 Olivier Blanchard 宏观经济学第八版的英文版内容。这里用中文解释。 1. 背景与现状&#xff1a; 比特币的规模与美元相比仍然很小&#xff1a; 截至 2018 年 12 月&#xff0c;比特币的总流通量为 1730 万枚&#xff0c;每枚价值 $3,900&#xff0c;总市值约 $670 亿…...

safe area helper插件

概述 显示不同机型的必能显示的区域 实现步骤 引入safearea&#xff0c;引入其中的safearea的csharp 为cancas加入gameobject gameobject中加入safearea脚本 将UI作为这个gameobject的子物体&#xff0c;就可以完成显示...

融云分享基于 Rust 的鸿蒙 SDK 开发实践

12 月 5 日&#xff0c;以“同心聚力&#xff0c;共建共享鸿蒙新生态”为主题的“鸿蒙生态伙伴 SDK 开发者论坛”在京举行。 融云凭借对鸿蒙生态的率先适配和创新贡献&#xff0c;荣获华为鸿蒙生态“HarmonyOS NEXT SDK 星河奖”。 本次论坛邀请了多位行业领导者参与&#xff…...

golang中的值传递与引用传递,如何理解结构体的方法?

先从一个例子说起 type Counter struct {count int }func (c Counter) Inc() {c.count }func test1() {c : Counter{}do : func() {for i : 0; i < 10; i {c.count}fmt.Println("done")}go do()go do()time.Sleep(3 * time.Second)fmt.Println(c.count) }func te…...

TON游戏现状一览:区块链与Telegram的完美融合

TON&#xff08;The Open Network&#xff09;作为一款基于区块链的开放平台&#xff0c;因其超高的交易处理速度和与Telegram的紧密集成&#xff0c;成为游戏开发者和用户的新兴乐土。TON不仅仅是一个去中心化的网络&#xff0c;它还通过其核心加密货币——Toncoin&#xff0c…...

《变分法·吴迪光1987年》复习汇总

目录 第一章 变分法的概念1 泛函和泛函的极值例1 捷线&#xff08;最速降线&#xff09;问题例2 等周问题例3 极小曲面问题极值必要条件 2 基本引理&#xff08;考反证法&#xff09;基本引理1基本引理2 第二章 固定边界的变分问题 ♠ \spadesuit ♠ 欧拉方程&#xff08;一&am…...

使用IP自签名SSL证书

最近需要创建WebSocket服务器并使用SSL证书&#xff0c;由于是内网测试&#xff0c;所以需要使用指定IP的自签SSL证书。 其实笔者前面博文 使用nexus3作为Docker镜像仓库 解决nexus3登录x509: certificate has expired or is not yet valid 中有创建过相应的证书&#xff0c;这…...

如何持续优化呼叫中心大模型呼出机器人的性能?

如何持续优化呼叫中心大模型呼出机器人的性能&#xff1f; 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 持续优化呼叫中心大模型呼出机器人的性能是一个复杂而持续的过程&#xff0c;涉及多个层面的策略和措…...

3D,点云平滑法线估计

需要平滑的情况 1、用激光扫描仪等设备扫描物体(尤其是比较小的物体)时,往往会有测量误差。这些误差所造成的不规则数据如果直接拿来曲面重建的话,会使得重建的曲面不光滑或者有漏洞,而且这种不规则数据很难用统计分析等滤波方法消除; 2、后处理过程中,对同一个物体从…...

windows下pyenv与宝塔python冲突解决

windows下安装pyenv后与宝塔python环境冲突 1、将C:\Program Files\python\Scripts中的pip3.exe改名(pip3-.exe) 2、将C:\用户\{用户名}\.pyenv\pyenv-win\shims中的pip、pip.bat、python、python.bat改名(pip-、pip-.bat、python-、python-.bat)&#xff0c;然后使用pip3和p…...

C# 探险之旅:第二十五节 - 类型class之字段Fields大冒险

嘿&#xff0c;探险家们&#xff01;欢迎再次搭乘C#的魔法列车&#xff0c;今天我们要深入探索class里的宝藏——字段&#xff08;Fields&#xff09;&#xff01;想象一下&#xff0c;字段就像是类里的秘密小房间&#xff0c;里面藏着对象的小秘密和宝藏。我们不仅要看看这些小…...

如何更新项目中的 npm 或 Yarn 依赖包至最新版本

要升级 package.json 文件中列出的包&#xff0c;你可以使用 npm&#xff08;Node Package Manager&#xff09;或 yarn。以下是两种工具的命令来更新你的依赖项&#xff1a; 使用 npm 更新所有包到最新版本 npm update如果你想将所有依赖项更新到其各自最新的大版本&#xf…...

【Linux系列】使用 watch 命令实时查看容器状态

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

电脑技巧:Everything 1.5 版本重大更新​支持拼音搜索+全文搜索

目录 一、软件介绍 二、主要更新亮点 更快的搜索速度和拼音搜索 全文搜索功能 智能推荐功能 增强的过滤选项 改进的用户界面 更好的多语言支持 增强的安全性和隐私保护 三、总结 Everything 作为一款备受推崇的文件搜索工具&#xff0c;以其卓越的性能和简洁的用户界…...

MySQL八股-全局锁,表级锁,表锁,元数据锁,意向锁,行级锁,行锁,间隙锁,临键

文章目录 全局锁表级锁表锁(表级锁)元数据锁(MDL&#xff0c;Meta Data Lock&#xff0c;表级锁)元数据锁演示元数据锁兼容的情况元数据锁互相阻塞的情况 意向锁&#xff08;Intention lock&#xff0c;表级锁&#xff09;意向锁分类意向锁演示&#xff1a;意向共享锁(**IS**)与…...

电子应用设计方案-53:智能AI打印机系统方案设计

智能 AI 打印机系统方案设计 一、引言 随着人工智能技术的不断发展&#xff0c;将其应用于打印机系统可以显著提升打印效率、优化打印质量&#xff0c;并提供更智能化的用户体验。本方案旨在设计一款融合 AI 技术的智能打印机系统。 二、系统概述 1. 系统目标 - 实现高精度、…...

docker—私有仓库搭建

docker—私有仓库搭建 HTTP 部署 docker run -d \-p 5000:5000 \--restartalways \--name registry \-v /opt/data/registry:/var/lib/registry \registry:2使用官方的 registry​ 镜像来启动私有仓库。默认情况下&#xff0c;仓库会被创建在容器的 /var/lib/registry​ 目录…...

马斯克Neuralink:未来的人机交互先锋,将会挑战传统通讯方式

Neuralink&#xff0c;由埃隆马斯克于2016年创立&#xff0c;专注于研发脑机接口技术。该技术通过植入大脑的芯片&#xff0c;实现人类与机器的“无缝连接”。2024年&#xff0c;Neuralink取得了突破性进展&#xff0c;成功在人体中植入了脑芯片。首位植入者Noland Arbaugh通过…...