【数据结构】树和二叉树——Lesson1

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~
💥💥个人主页:奋斗的小羊
💥💥所属专栏:C语言

🚀本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。


目录

  • 前言
  • 一、树
    • 1、树的概念和结构
    • 2、相关术语
    • 3、树的表示
    • 4、树形结构应用场景
  • 二、二叉树
    • 1、概念和结构
    • 2、特殊的二叉树
    • 3、二叉树的存储
      • 3.1顺序存储
      • 3.2链式存储
    • 4、顺序结构实现二叉树
      • 4.1堆的结构和概念
      • 4.2堆的实现
        • 4.2.1向上调整算法
        • 4.2.2向下调整算法
      • 4.3堆的应用
        • 4.3.1堆排序
        • 4.3.2 TOP-K问题
    • 5、完整代码
  • 总结

前言

一、树

1、树的概念和结构

树是一种非线性的数据结构,它是由n(n>=0)个有限节点组成的一个具有层次关系的集合。它包含一个根节点以及若干子节点,子节点又可以有自己的子节点,以此类推。

  • 根节点: 根节点没有前驱结点
  • 子节点: 除根节点外,其余节点被分为m(m>0)个互不相交的集合,其中每一个集合又是一棵结构与树类似的子树。每棵子树的根节点有且只有一个前驱节点,可以有0个或多个后继节点。因此,树是递归定义的。

与现实中的树相比,这里的树更像是一棵倒挂的树。

在这里插入图片描述

在这里插入图片描述

树形结构中,子树之前不能有交集,否则就不是树形结构。

非树结构:
在这里插入图片描述

  • 子树是不相交的
  • 除了根节点,每个节点有且只有一个父节点
  • 一棵N个节点的树有N-1条边

2、相关术语

树有很多的术语,基本都是根据现实中的树和人类亲缘关系命名的,其中红色标记的是比较重要的概念。

  • 父节点/双亲节点 若一个节点有子节点,这个节点就是子节点的父节点(相对的),上图中A是B的父节点
  • 子节点 一个节点含有的子树的根节点称为该节点的子节点,上图B是A的子节点
  • 节点的度: 一个节点有几个孩子,它的度就是多少
  • 树的度: 一棵树中,最大节点的度就是树的度,上图树的度为2
  • 叶子节点/终端节点 度为0的节点称为叶子节点
  • 分支节点/非终端节点: 度不为0的节点
  • 兄弟节点: 具有相同父亲的节点就是兄弟节点(亲兄弟)
  • 节点的层次: 从根开始定义起,根为第一层,其子节点为第二层,以此类推
  • 树的高度/深度 树中节点的最大层次,上图树的深度为5
  • 节点的祖先: 从根到该节点所经分支上的所有节点
  • 路径: 一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列
  • 子孙: 以某节点为根的子树中任意一节点都称为该节点的子孙
  • 森林: 由m (m>0)棵互不相交的树(多棵树)的集合称为森林

3、树的表示

树结构相对线性表复杂的多,既要保存值域,还要保存节点和节点之间的关系,最常用的表示法是左孩子右兄弟表示法。

struct TreeNode
{struct Node* child;//左边开始的第一个孩子节点struct Node* brother;//右边的下一个兄弟节点int data;
};


4、树形结构应用场景

文件系统是计算机存储和管理文件的一种方式,它利用树形结构来组织和管理文件好文件夹。在文件系统中,树结构被广泛应用,它通过父节点和子节点之间的关系来表示不同层级的文件和文件夹之间的关联。

请添加图片描述


二、二叉树

1、概念和结构

二叉树是一种特殊的树,在树形结构中,我们最常用的就是二叉树,一棵二叉树是节点的一个有限集合,该集合由一个根节点加上两棵别称为左子树右子树的二叉树组成或者为空。
在这里插入图片描述

上图就是二叉树的基本结构。从上图可以看到,二叉树有以下特点:

二叉树的特点:

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

对于任意二叉树都是由以下几种情况复合而成的:


2、特殊的二叉树

  • 满二叉树: 一个二叉树,如果每一层的节点数都达到最大值,则这个二叉树就是满二叉树。一个层数为N的满二叉树的节点数为2^N-1。
  • 完全二叉树: 完全二叉树的前N-1层都是满的,最后一层不满且子节点从左到右必须是连续的。完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树引出来的,因此满二叉树是一种特殊的完全二叉树。

在这里插入图片描述


3、二叉树的存储

3.1顺序存储

顺序存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,如果不是完全二叉树要保证下标对应就会有空间浪费,因此完全二叉树适合用顺序结构存储。

请添加图片描述
可以看到非完全二叉树虽然也可以使用数组存储,但是存在空间浪费,所以非完全二叉树更适合链式存储。

这种存储结构有一个规律,可以根据下标来计算父子关系。

假设父亲在数组中的下标为:i

  • 左孩子在数组中的下标:2*i+1
  • 右孩子在数组中的下标:2*i+2

假设孩子在数组中的下标是:j

  • 父亲在数组中的下标就是(j-1)/ 2

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


3.2链式存储

用链表来表示一棵二叉树,即用链表来指示元素的逻辑关系。
通常每个节点由三个域组成,一个数据域和两个指针域,分别用左指针和右指针来指向左孩子和右孩子。链式结构又分为二叉链和三叉链,当前我们学习的是二叉链,三叉链会在后面的学习中学到。

//二叉链
struct BinaryTreeNode
{struct BTNode* pleft;//左孩子struct BTNode* pright;//右孩子BTDataType data;
};

4、顺序结构实现二叉树

4.1堆的结构和概念

堆(Heap)栈(Stack)
数据结构一种树形结构,可以做堆排序,效率很高一种线性结构,具有后进先出的特点,基本操作有压栈、出栈
C语言用于动态分配内存的区域由操作系统分配的固定大小的空间

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

堆具有以下性质:

  • 堆中某个节点的值总是不大于或不小于其父节点的值
  • 堆是一棵完全二叉树

其中堆又分为大堆和小堆:

  • 大堆 / 大根堆 / 大顶堆:任何一个父亲>=孩子,根最大
  • 小堆 / 小根堆 / 小顶堆:任何一个父亲<=孩子,根最小

在这里插入图片描述

从上图中可以看到,小堆不一定是升序,大堆也不一定是降序, 因为兄弟之间没有大小关系。


4.2堆的实现

堆的底层结构是数组,基本与顺序表一样。因此定义堆的结构为:

typedef int HeapDataType;typedef struct Heap
{HeapDataType* arr;int size;int capacity;
}Heap;void HeapInit(Heap* php);
void HeapDestroy(Heap* php);
HeapDataType HeapTop(Heap* php);
bool HeapEmpty(Heap* php);

其中初始化、销毁、取堆顶、判空函数也基本与我们之前写过的相差无几,这里就直接给出不做介绍。

void HeapInit(Heap* php)
{assert(php);php->arr = NULL;php->size = php->capacity = 0;
}void HeapDestroy(Heap* php)
{assert(php);free(php->arr);php->arr = NULL;php->size = php->capacity = 0;
}HeapDataType HeapTop(Heap* php)
{assert(php);assert(php->size > 0);return php->arr[0];
}bool HeapEmpty(Heap* php)
{assert(php);return php->size == 0;
}

接下来就到了比较重要的内容.

4.2.1向上调整算法

| 堆的插入
将新数据插入到数组末尾,再通过向上调整算法,直到满足堆。

  • 先将元素插入到堆的末尾,即最后一个孩子之后
  • 插入后如果堆的性质被破坏,将新插入的节点顺着其双亲节点往上调整到合适的位置即可

下面是小堆插入:

在这里插入图片描述

void AdjustUp(HeapDataType* arr, int child)
{int parent = (child - 1) / 2;while (child > 0){//  > 是建大堆if (arr[child] > arr[parent]){Swap(&arr[child], &arr[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}void HeapPush(Heap* php, HeapDataType x)
{assert(php);if (php->size == php->capacity){int newcapacity = php->capacity == 0 ? 4 : 2 * php->capacity;HeapDataType* tmp = (HeapDataType*)realloc(php->arr, newcapacity * sizeof(HeapDataType));if (tmp == NULL){perror("realloc fail");return;}php->arr = tmp;tmp = NULL;php->capacity = newcapacity;}php->arr[php->size] = x;php->size++;//向上调整AdjustUp(php->arr, php->size - 1);
}

向上调整算法建堆的时间复杂度为:O(N*logN)


4.2.2向下调整算法

| 堆的删除

删除堆是删除堆顶的数据,前提是size > 0有数据可删。将堆顶的数据和最后一个数据交换,然后删除数组最后一个数据,为了继续满足堆需要再进行向下调整算法,结果是次小的(次大的)在堆顶。
堆顶数据和最后一个数据交换再删除的目的是保证根节点下左右子树都是堆,父子关系不会乱。

请添加图片描述

向下调整:

在这里插入图片描述

void AdjustDown(HeapDataType* arr, int parent, int n)
{//假设左孩子小int child = 2 * parent + 1;while (child < n)//child>=n时孩子不存在{// < 是建大堆if ((child + 1) < n && arr[child] < arr[child + 1])//防止右孩子越界{//建大堆,要大孩子,建小堆,要小孩子child++;}if (arr[child] > arr[parent]){Swap(&arr[child], &arr[parent]);parent = child;child = 2 * parent + 1;}else{break;}}
}void HeapPop(Heap* php)
{assert(php);assert(php->size > 0);Swap(&php->arr[0], &php->arr[php->size - 1]);php->size--;AdjustDown(php->arr, 0, php->size);
}

向下调整算法建堆时间复杂度为:O(N)


4.3堆的应用

4.3.1堆排序

| 版本一:基于已有数组建堆,取堆顶元素完成排序

void HeapSort(HeapDataType* arr, int n)
{Heap hp;for (int i = 0; i < n; i++){HeapPush(&hp, arr[i]);}int i = 0;while (!HeapEmpty(&hp)){arr[i++] = HeapTop(&hp);HeapPop(&hp);}HeapDestroy(&hp);
}

该版本有一个前提:必须提供有现成的数据结构堆。
所以这样排序不好,得先建一个堆放入数据(开辟额外空间),再从堆里面将数组拷贝到原数组中,空间复杂度O(N)
要是能有什么办法避免开辟额外的空间就好了,来看版本二:


| 版本二:原数组上建堆,首尾交换,交换后的堆尾数据从堆中删除,将堆顶数据向下(向上)调整选出次大(次小)的数据

思路是直接将原数组(看作)一个堆,从下标为1的孩子开始,向上(向下) 循环调整(实现大堆或者小堆),最终达到在原数组上建堆的效果,这个方法好在没有额外的空间消耗。

//向上调整建堆
for (int i = 1; i < n; i++)
{AdjustUp(arr, i);
}//向下调整建堆
for (int i = (n-1-1) / 2; i >= 0; i--)
{AdjustDown(arr, i, n);
}

向上调整算法建堆时默认第一个元素已经排好,从下标为1的元素往后依次开始调整。
向下调整算法建堆,从最后一个孩子的父亲开始往前依次向下调整,到堆顶时结束。

因为向上调整算法建堆的时间复杂度是:O(N*logN),而向下调整算法建堆的时间复杂度是:O(N),所以我们优先使用向下调整算法建堆来实现堆排序

确定了建堆的算法,接下来就要考虑的是如果我们要排升序,该在原数组上建大堆还是小堆?
可能大多数人下意识地认为排升序的话应该建小堆,因为我们可以通过循环拿根节点(堆顶)再删除根节点的方法依次得到最小值,其实这样是不好的
因为小堆的堆顶是所有数里的最小值,此时堆顶已经排好了,要想排剩下的数就要重新建堆,这样一来父子关系全乱了,实现起来代价太大。

如果建大堆,此时堆顶是最大的数,可以删除堆顶,结果就是最大的数到数组末端,n- -后这个最大的数就不被当做堆内的数,循环向下调整重复上面的操作,就能得到按升序排列的数组了。

请添加图片描述

所以,排升序,建大堆;排降序,建小堆。

void HeapSort(int* arr, int n)
{//升序,建大堆//降序,建小堆//向下调整建堆//O(N)for (int i = (n-1-1) / 2; i >= 0; i--){AdjustDown(arr, i, n);}//O(N*logN)int end = n - 1;while (end > 0){Swap(&arr[0], &arr[end]);AdjustDown(arr, 0, end);end--;}
}

向下调整算法建堆时间复杂度O(N),再加上最后的排序操作的时间复杂度O(N*logN),整个堆排序的时间复杂度是O(N*logN),比起冒泡排序时间复杂度O(N^2),堆排序是非常非常理想的。


4.3.2 TOP-K问题

TOP-K问题:求数据量比较大的钱K个最大的元素或最小的元素。比如:富豪榜TOP10、世界企业TOP500、中国名校TOP100等。

对于TOP-K问题,最简单最直接的办法就是排序,但是当数据量比较大时排序就不可取了,最佳的方式就是利用堆来解决。

我们可以将大量的数据建大堆(向下调整算法优先),此时堆顶就是最大的数据,然后Topk次就能解决问题了。

void TOP()
{Heap hp;HeapInit(&hp);int arr[] = { 34,453,3,4,56,36,6,3,7,34,6,36,3,7,2,4,46,534,7,3,7673,56 };for (int i = 0; i < sizeof(arr) / sizeof(int); i++){HeapPush(&hp, arr[i]);}int k = 0;scanf("%d", &k);while (k--){printf("%d ", HeapTop(&hp));HeapPop(&hp);}HeapDestroy(&hp);
}

请添加图片描述


5、完整代码

heap.h:

#pragma once#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>typedef int HeapDataType;typedef struct Heap
{HeapDataType* arr;int size;int capacity;
}Heap;void AdjustUp(HeapDataType* arr, int child);
void AdjustDown(HeapDataType* arr, int parent, int n);
void Swap(HeapDataType* child, HeapDataType* parent);
void HeapInit(Heap* php);
void HeapDestroy(Heap* php);
void HeapPush(Heap* php, HeapDataType x);
void HeapPop(Heap* php);
HeapDataType HeapTop(Heap* php);
bool HeapEmpty(Heap* php);

heap.c:

#define  _CRT_SECURE_NO_WARNINGS#include "heap.h"void HeapInit(Heap* php)
{assert(php);php->arr = NULL;php->size = php->capacity = 0;
}void HeapDestroy(Heap* php)
{assert(php);free(php->arr);php->arr = NULL;php->size = php->capacity = 0;
}void Swap(HeapDataType* child, HeapDataType* parent)
{HeapDataType tmp = *child;*child = *parent;*parent = tmp;
}void AdjustUp(HeapDataType* arr, int child)
{int parent = (child - 1) / 2;while (child > 0){//  > 是建大堆if (arr[child] > arr[parent]){Swap(&arr[child], &arr[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}void HeapPush(Heap* php, HeapDataType x)
{assert(php);if (php->size == php->capacity){int newcapacity = php->capacity == 0 ? 4 : 2 * php->capacity;HeapDataType* tmp = (HeapDataType*)realloc(php->arr, newcapacity * sizeof(HeapDataType));if (tmp == NULL){perror("realloc fail");return;}php->arr = tmp;tmp = NULL;php->capacity = newcapacity;}php->arr[php->size] = x;php->size++;//向上调整AdjustUp(php->arr, php->size - 1);
}void AdjustDown(HeapDataType* arr, int parent, int n)
{//假设左孩子小int child = 2 * parent + 1;while (child < n)//child>=n时孩子不存在{// < 是建大堆if ((child + 1) < n && arr[child] < arr[child + 1])//防止右孩子越界{//建大堆,要大孩子,建小堆,要小孩子child++;}if (arr[child] > arr[parent]){Swap(&arr[child], &arr[parent]);parent = child;child = 2 * parent + 1;}else{break;}}
}void HeapPop(Heap* php)
{assert(php);assert(php->size > 0);Swap(&php->arr[0], &php->arr[php->size - 1]);php->size--;AdjustDown(php->arr, 0, php->size);
}HeapDataType HeapTop(Heap* php)
{assert(php);assert(php->size > 0);return php->arr[0];
}bool HeapEmpty(Heap* php)
{assert(php);return php->size == 0;
}

test.c:

#define  _CRT_SECURE_NO_WARNINGS#include "heap.h"void test1()
{int arr[] = { 5,3,2,8,5,3,6,9,0 };Heap hp;HeapInit(&hp);for (int i = 0; i < sizeof(arr) / sizeof(int); i++){HeapPush(&hp, arr[i]);}HeapDestroy(&hp);
}void test2()
{//排升序int arr[] = { 5,3,2,8,5,3,6,9,0 };for (int i = 1; i < sizeof(arr) / sizeof(int); i++){//建大堆AdjustUp(arr, i);}}//void HeapSort(int* arr, int n)
//{
//	//升序,建大堆
//	//降序,建小堆
//
//	for (int i = 1; i < n; i++)
//	{
//		AdjustUp(arr, i);
//	}
//
//	int end = n - 1;
//	while (end > 0)
//	{
//		Swap(&arr[0], &arr[end]);
//		AdjustDown(arr, 0, end);
//		end--;
//	}
//}void TOP()
{Heap hp;HeapInit(&hp);int arr[] = { 34,453,3,4,56,36,6,3,7,34,6,36,3,7,2,4,46,534,7,3,7673,56 };for (int i = 0; i < sizeof(arr) / sizeof(int); i++){HeapPush(&hp, arr[i]);}int k = 0;scanf("%d", &k);while (k--){printf("%d ", HeapTop(&hp));HeapPop(&hp);}HeapDestroy(&hp);
}int main()
{//test1();//test2();TOP();return 0;
}

总结

  • 二叉树在各种领域和问题中都有广泛的应用,文件系统、数据库、表达式求值、代码编译、网络路由、Huffman 编码等场景。
  • 堆排序利用了二叉堆的性质,通过构建最大堆(或最小堆)来实现排序。整个排序过程分为两个阶段:首先通过数组构建一个最大堆,然后不断将堆顶元素与堆的最后一个元素交换并调整堆,最终得到一个有序数组。

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

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

相关文章

科普文:微服务技术栈梳理

概叙 如上两图所示&#xff0c;微服务架构下&#xff0c;需要的组件很多&#xff0c;上面中也并未列全。下面将梳理一下国内微服务架构下&#xff0c;用到的技术栈&#xff0c;仅供参考。 科普文&#xff1a;12种常见的软件架构-CSDN博客 没有最好的架构&#xff0c;只有最适…

常用网络接口自动化测试框架应用

一、RESTful&#xff08;resource representational state transfer)类型接口测试 (一&#xff09;GUI界面测试工具&#xff1a;jmeter 1、添加线程组 2、添加http请求 3、为线程组添加察看结果树 4、写入接口参数并运行 5、在查看结果树窗口查看结果 6、多组数据可增加CSVDat…

python数据可视化(7)——绘制箱形图

课程学习来源&#xff1a;b站up&#xff1a;【蚂蚁学python】 【课程链接&#xff1a;【【数据可视化】Python数据图表可视化入门到实战】】 【课程资料链接&#xff1a;【链接】】 Python绘制箱形图分析北京天气数据 箱形图 箱形图&#xff08;Box-plot&#xff09;又称为盒…

一站式短视频矩阵开发,高效托管!

短视频矩阵系统源码SaaS解决方案提供全面的开发服务&#xff0c;包括可视化视频编辑、矩阵式内容分发托管以及集成的多功能开发支持。 短视频矩阵&#xff1a;引爆您的数字营销革命 短视频矩阵系统是一套多功能集成解决方案&#xff0c;专为提升在短视频平台上的内容创作、管理…

【C++】多态-最全解析(多态是什么?如何使用多态?多态的底层原理是什么?)

目录 一、前言 二、多态是什么&#xff1f; 三、多态的定义及实现 &#x1f525; 多态的构成条件&#x1f525; &#x1f525; 虚函数的重写&#x1f525; &#x1f525;虚函数重写的两个例外 &#x1f525; &#x1f34d; 协变返回类型 &#x1f95d; 析构函数的重写…

使用APEXSQL LOG解析sql server事务日志,进行审计与数据恢复

一 下载 https://download.csdn.net/download/sunke861/11449739 二 使用 解压安装包后&#xff0c;点击&#xff1a;ApexSQLLog.exe 2.1 连接数据库 连接要审计的数据库&#xff1a; 假如报错&#xff1a; 则点击ok关闭该窗口&#xff0c;然后点击左上方的New按钮&#xf…

Codeforces Round 958 (Div. 2)(A~C)题

A. Split the Multiset 思路: 最优的策略是每次操作分出 k−1&#x1d458;−1 个 1&#xff0c;然后考虑最后是否会剩下一个单独的 1。 代码: #include<bits/stdc.h> using namespace std; #define N 1000005 typedef long long ll; typedef unsigned long long ull;…

【找不到视图问题解决】@RestController 与 @Controller注解的使用区别

一、问题描述 苍穹外卖在菜品分页查询功能实现的过程中&#xff0c;出现了找不到视图的情况 2024-07-12 21:54:20.860 ERROR 22488 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with p…

Transformer注意力机制

Transformer注意力机制 &#x1f42c; 目录: 一、Transformer简介二、理解注意力机制自注意力机制多头注意力机制 一、Transformer简介 Transformer是一种用于自然语言处理(NLP)和其他序列到序列(Seq2Seq)任务的深度学习模型框架&#xff0c;它在2017年由Vaswani等人首次提出…

手机m4a怎么转换成mp3,手机端即可完成格式转换

M4A&#xff08;MPEG-4 Audio&#xff09;是一种无损压缩的音频格式&#xff0c;通常用于苹果设备和 iTunes 上&#xff0c;因为它能提供较高的音质同时占用较小的存储空间。 然而&#xff0c;MP3 作为最普及的音频格式之一&#xff0c;兼容性更强&#xff0c;几乎所有的播放设…

【单元测试】SpringBoot

【单元测试】SpringBoot 1. 为什么单元测试很重要&#xff1f;‼️ 从前&#xff0c;有一个名叫小明的程序员&#xff0c;他非常聪明&#xff0c;但有一个致命的缺点&#xff1a;懒惰。小明的代码写得又快又好&#xff0c;但他总觉得单元测试是一件麻烦事&#xff0c;觉得代码…

ENSP中NAT的相关实验(两个私网,一个公网)

题目 实验需求 1.按照图示配置IP地址&#xff0c;公网地址100.1.1.1/24 2.私网A通过NAPT&#xff0c;使R1接入到互联网&#xff0c;私网B通过EASY IP&#xff0c;使R3接入到互联网 3.私网A配置NAT SERVER把Telnet的Telnet服务发布到公网&#xff0c;使PC2可以访问 三、实验…

el-table和 el-image图片预览使用插槽后层叠样式错乱问题

问题&#xff1a; 解决办法&#xff1a;在el-image组件中添加preview-teleported 属性 最终效果

MongoDB自学笔记(一)

一、MongoDB简介 MongoDB是一款基于C开发的文档型数据库。与传统的关系型数据库有所不同&#xff0c;MongoDB面向的是文档&#xff0c;所谓的文档是一种名为BSON &#xff08;Binary JSON&#xff1a;二进制JSON格式&#xff09;是非关系数据库当中功能最丰富&#xff0c;最像…

AV1 编码标准帧间预测技术概述

AV1 编码标准帧间预测 AV1&#xff08;AOMedia Video1&#xff09;是一种开源的视频编码格式&#xff0c;它在帧间预测技术上做出了显著的改进和扩展&#xff0c;以提供比现有标准更高的压缩效率和更好的视频质量。以下是AV1帧间预测技术的几个关键点&#xff1a; 参考帧扩展&a…

You are running Vue in development mode.和undefined is not iterable白屏问题

遇到的报错信息如下&#xff0c; 你正在开发模式下运行 Vue。 确保在部署生产环境时打开生产模式 但是我是关闭了的Vue.config.productionTip false 最后发现是服务器问题

Ubuntu安装 Nginx

前置条件&#xff1a; 把apt包更新到最新&#xff08;如果更新过就跳过这步&#xff09; 先检查 sudo apt update 后更新 sudo apt upgrade &#xff08;期间要选择确认&#xff0c;输入 y 即可&#xff09; 如果不行可以&#xff1a;sudo apt upgrade --fix-missing 先卸…

IIS的安装及Web服务器深度配置:打造高效稳定的网络门户

在构建现代网络环境的过程中&#xff0c;IIS&#xff08;Internet Information Services&#xff09;作为微软提供的强大Web服务器软件&#xff0c;扮演着至关重要的角色。无论是企业级的网站部署&#xff0c;还是个人开发者的小型项目测试&#xff0c;IIS都能提供稳定、高效的…

无人机使能的边缘计算优化问题

Joint Deployment and Task Scheduling Optimization for Large-Scale Mobile Users in Multi-UAV-Enabled Mobile Edge Computing论文阅读笔记 BackgroundContributionsSystem Model and Problem FormulationLocal Execution ModelMEC Execution ModelUAV Hover Model Propose…

kubernetes概念及基本介绍(一)

部署方式的演进过程 传统部署 直接将应用程序部署在物理机器上&#xff0c;很难合理分配计算机资源&#xff0c;而且程序之间会产生影响 虚拟化部署 可以在一台物理机上运行多个虚拟机&#xff0c;没个虚拟机都是独立的一个环境&#xff0c;程序环境不会产生影响&#xff0c;…