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

数据结构与算法-树

  • 🎈1.树和二叉树
  • 🎈2.树
    • 🔭2.1树的定义
    • 🔭2.2树的4种表示方法
    • 🔭2.3树的基本术语
    • 🔭2.4树的抽象数据类型定义
  • 🎈3.二叉树
    • 🔭3.1二叉树的定义
    • 🔭3.2二叉树的抽象数据类型定义
    • 🔭3.3满二叉树
    • 🔭3.4完全二叉树
    • 🔭3.5完全二叉树的特点
    • 🔭3.6二叉树的性质
    • 🔭3.7二叉树的存储结构
    • 🔭3.8完全二叉树的顺序存储
    • 🔭3.9一般二叉树的存储结构
    • 🔭3.10二叉树的链式存储结构
  • 🎈4.二叉树的类定义及其实现
    • 🔭4.1二叉树的类定义
    • 🔭4.2二叉树的实现
      • 📖4.2.1创建二叉树
      • 📖4.2.2计算二叉树的高度
      • 📖4.2.3计算二叉树的树叶数
      • 📖4.2.4查找二叉树

🎈1.树和二叉树

树结构是一类重要的非线性结构,树型结构是结点之间有分支,并且具有明显的层次关系的结构,它类似于自然界中的树。树结构在客观世界是大量存在的,例如行政组织机构和人类社会的家谱都可以用树来形象表示。

🎈2.树

🔭2.1树的定义

树是n(n>=0)个结点的有限集T
n=0,称为空树。
n>0,则它满足以下两个条件:
(1).有且仅有一个特定的称为根的结点。
(2).其余结点可以分为m(m>=0)个互不相交的有限集T1,T2,T3......Tm,其中,每个集合本身又是一棵树,并称为根的子树。

🔭2.2树的4种表示方法

在这里插入图片描述

🔭2.3树的基本术语

在这里插入图片描述


  • 结点:树中每个元素对应一个结点。每个结点包含一个数据元素及若干指向子树的分支。例如,图中的树有11个结点,结点D包含3个分支。
  • 结点的度:结点所拥有的子树的个数称为结点的度。例如,结点A和D的度均为3,结点B的度为2,结点C的度为1,结点F的度为0。
  • 叶子结点:度为0的结点称为叶子结点(或称树叶),又称终端结点。例如,上图所示,E,F,G,H,I,K都是叶子结点。
  • 分支结点:度不为0的结点称为分支结点,又称非终端结点。例如,上图所示的树,A,B,C,D,J都是分支结点。
  • 树的度:树中所有结点的最大度数称为树的度。例如,图所示的树的度为3.
  • 双亲结点:若结点X有孩子,则X为孩子的双亲结点,简称双亲。例如,在图所示的树中,结点H,I,J的双亲是D,根结点A没有双亲,树中只有根结点没有双亲
  • 孩子结点:若结点X由子树,则子树的根结点即为结点X的孩子结点,简称孩子。例如,结点D有三个孩子H,I,J。
  • 兄弟结点:同一双亲的孩子结点称为兄弟结点,简称兄弟。例如,结点H,I,J为兄弟。
  • 堂兄弟结点:在树中的层次相同,但双亲不同的结点称为堂兄弟,简称堂兄。例如,结点F,G,H为堂兄弟。
  • 祖先结点:从根结点到结点X所经过分支上的所有结点,都称为X的祖先结点,简称祖先。例如,K的祖先为A,D,J
  • 子孙结点:结点X的孩子,以及这些孩子的孩子都是X的子孙结点。例如,结点D的子孙为H,I,J,K
  • 结点的层次:根结点的层次为1,根结点的孩子的层次为2,根结点的孩子的孩子的层次为3,依次类推。
  • 树的深度:树中结点的最大层次称为树的深度,也称树高。空树的深度为0,只有一个根结点的树的深度为1,图所示的树的深度为4.
  • 路径:从树的某个结点X到其子孙结点Y所经过的路线叫做路径,路径上经过的边的数称为路径长度。由于树中无回路,所以树的路径是唯一的。如图所示的树中,从A到结点K的路径是A,D,J,K,路径长度为3.
  • 森林:m(m>=)棵互不相交的树构成的集合称之为森林。

🔭2.4树的抽象数据类型定义

ADT Tree{
数据对象D:D为性质相同的数据元素的集合
数据关系R:
若D为空集,则称为空树。
若D仅有一个数据元素,则R=空集,否则R!=空集。
(1.在D中存在唯一的称为根的数据元素root,它在关系R下无前驱。
(2.存在D-{root}的一个划分{D1,D2,...,Dm}(m>0,且对于(1<=i<=m),存在唯一的数据元素Xi属于Di,(root,Xi)属于R.3.对应于D-{root}的一个划分,r-{(root,x1),(root,x2),...,(root,Xm)}存在唯一的一个划分{R1,R2,...,Rm}(m>0),对于(1<=i<=m),Ri是Di上的二元关系,(xi,Ri)(i=1,2,...,m)是一棵符合本定义的树,称为根root的子树。

基本操作:
InitTree(&t):构造一棵空树
DestroyTree(&t):销毁一棵树
Parent(t,e):求结点e的双亲结点
Sons(t,e):求结点e有所有孩子结点
LeftChild(t,e):返回结点e的右兄弟最左孩子
RightSibling(t,e):返回结点e的右兄弟结点
TraraverseTree(t,visit()):visit()函数访问树中每个结点
DepthTree(t):返回树的深度
}ADT Tree

🎈3.二叉树

🔭3.1二叉树的定义

二叉树是由n(n>=0)个结点构成的有限集合,该集合或者为空集,此时称为空二叉树,或由一个根结点及两棵互不相交的左右子树组成,并且左右子树均是二叉树。二叉树的子树有左右之分,其次序不能颠倒。

二叉树的定义也是一个递归定义,二叉树可以是空集合,根可以有空的左子树或空的右子树。。二叉树不是树的特殊情况,它们是两个概念。二叉树中即使只有一棵子树也要进行区分,说明它是左子树,还是右子树,这是二叉树与树的最主要的差别。“二叉树是结点度为2的树”的说法是错误的。二叉树的5种基本形态:
在这里插入图片描述

🔭3.2二叉树的抽象数据类型定义

在这里插入图片描述

🔭3.3满二叉树

一棵深度为k且有2k-1个结点的二叉树称为满二叉树。满二叉树的特点是每一层上结点数都是最大结点数。如图所示,是一棵深度为4的满二叉树。
在这里插入图片描述

🔭3.4完全二叉树

可以对满二叉树的结点进行顺序编号,约定编号从根结点开始,自上而下,从左至右(称为层序编号)。
如果一棵深度为k且具有n个结点的二叉树,它的每个结点都与深度为k的满二叉树中的顺序编号1~n的结点一一对应,则称这棵二叉树为完全二叉树。
在这里插入图片描述

🔭3.5完全二叉树的特点

  1. 叶子结点只能在第k层和第k-1层上出现。
  2. 对于任意结点,若其右子树的深度为l,则其左子树的深度为ll+1
  3. 度为1的结点数为0或1。当结点的总数为奇数时,度为1的结点数为0,当结点的总数为偶数时,度为1的结点数为1.

🔭3.6二叉树的性质

  1. 二叉树的第i层上至多有2i-1(i>=1)个结点。
  2. 深度为k的二叉树最多有2k-1(k>=1)个结点。
  3. 对于任何一棵二叉树,如果其叶子结点数为n0,度为2的结点数为n2,则n0=n2+1.
    性质3推论:对于任何一棵k叉树,如果叶子结点数为n0,度为1,2,...k的结点数分别为n1,n2,...,nk,则n0=n2+2n3+3n4+...(k-1)nk+1.

例:一棵三叉树中,已知度为3的结点数等于度为2的结点数,且叶子结点数为10,则度为3的结点为多少?
n0 = n2+2n3+1=3n3+1
n3 = 3


  1. 一棵具有n个结点的完全二叉树的深度为[log2n]+1(以2为底,n的对数)。
  2. 在这里插入图片描述

🔭3.7二叉树的存储结构

二叉树的顺序存储结构是用一组地址连续的存储单元来存放二叉树的数据元素。

📝二叉树的顺序存储结构类型定义如下:

#define MaxSize 100  //二叉树的最大存储容量
typedef ElemType SqBiTree[MaxSize]  //用数组存储二叉树的数据元素
SqBiTree bt;

🔭3.8完全二叉树的顺序存储

在用数组存储二叉树时,必须确定树中各数据元素的存放次序,使各数据元素的相应位置反映出数据元素之间的逻辑关系用一组地址连续的存储单元依次自上而下、自左而右地存储完全二叉树的结点元素。
在这里插入图片描述

🔭3.9一般二叉树的存储结构

在采用顺序存储时,应采用完全二叉树的编号方式,没有编号的结点在对应的位置上用#表示。
在这里插入图片描述
:对于完全二叉树而言,采用顺序存储结构方式是十分合理的,它能够充分利用存储空间,但对于一般的二叉树而言,这种存储方式必然会造成大量空间浪费。在最坏的情况下,一棵深度为k且只有k个单分支二叉树,却需要长度为2k-1的一维数组来存储。因此,一般二叉树常采用链式存储方式

🔭3.10二叉树的链式存储结构

根据二叉树的定义,二叉树的每个结点可以有两个分支,分别指向及诶单的左子树和右子树。在二叉树中,标准存储方式的结点结构如图所示:
在这里插入图片描述
其中,data表示数据域,用来存放数据元素信息。
lchild表示左指针域,用来存放指向左孩子的指针,当左孩子不存在时为空指针。
rchild表示右指针域,用来存放指向右孩子的指针,当右孩子不存在时为空指针。
这种链式存储结构通常称为二叉链表。

二叉链表的结点类型定义:
typedef struct BitNode
{ElemType data;//数据元素信息BitNode *lchild;//指向左孩子结点BitNode *rchild;//指向右孩子结点
}BitNode;

由二叉树的链式存储结构可知,对于具有n个结点的二叉树,每个结点有两个指针域,共有2n个指针域,其中n-1个非空链域,n+1个空链域。

🎈4.二叉树的类定义及其实现

🔭4.1二叉树的类定义

#include <iostream>
using namespace std;
typedef struct BitNode
{char data;BitNode* lchild;BitNode* rchild;
}BitNode;
class BiTree
{
private:BitNode* bt;void Rcreate(BitNode*& t);//递归创建二叉树void PreTraverse(BitNode* t);//先序遍历递归函数void InTraverse(BitNode* t);//中序遍历递归函数void PostTraverse(BitNode* t);//后序遍历递归函数int BTNodeDepth(BitNode* t);//计算二叉树的树高递归函数int BTNodeLeaf(BitNode* t);//计算二叉树树叶数递归函数BitNode* SearchNode(BitNode* t, char x);//查找值等于x的结点递归函数
public:BiTree(){bt = NULL;//创建空树}void RcreateBiTree();//创建二叉树void PreTraverseBiTree();//先序遍历二叉树void InTraverse();//中序遍历二叉树void PostTraverse();//后序遍历二叉树int BTNodeDepthBiTree();//计算二叉树的树高int BTNodeLeafBiTree();//计算二叉树的叶子数BitNode* SearchNodeBit(char x);//查找值等于x的结点
};

🔭4.2二叉树的实现

📖4.2.1创建二叉树

Rcreate()函数递归创建二叉树,其过程为:读入字符ch,若ch=='.',则创建空二叉树,若ch!='.',则先创建左子树,再创建右子树。

void BiTree::Rcreate(BitNode*& t)
{char ch;cin >> ch;if (ch == '.')t = NULL;else{t = new BitNode;//申请空间t->data = ch;Rcreate(t->lchild);//递归创建左子树Rcreate(t->rchild);//递归创建右子树}
}
void BiTree::RcreateBiTree()
{BitNode* t;Rcreate(t);//递归创建二叉树bt = t;//将根结点指针赋值给私有成员bt
}

📖4.2.2计算二叉树的高度

BTNodeDepth()函数递归计算二叉树的树高,其过程为:判断二叉树t是否为空树,若为空树,树高则为0。若为非空树,则计算左子树的高度m和右子树的高度n;m>=n,返回m,否则返回n.

在这里插入图片描述

int BiTree::BTNodeDepth(BitNode* t)
{if (t == NULL)return 0;else{int m = 1 + BTNodeDepth(t->lchild);//计算左子树树高度int n = 1 + BTNodeDepth(t->rchild);//计算右子树树高度if (m >= n)//比较左右子树高度return m;elsereturn n;}
}
int BiTree::BTNodeDepthBiTree()
{//计算二叉树的高度BitNode* p = bt;return BTNodeDepth(p);//调用计算二叉树高度的递归函数
}

📖4.2.3计算二叉树的树叶数

BTNodeLeaf()计算二叉树的树叶数,其过程为:判断t是否为空树,若为空树,则树叶数为0;若为非空树,则计算左子树的树叶数m和右子树的树叶数nm+n=0时返回1m+n!=0时返回m+n.
在这里插入图片描述

int BiTree::BTNodeLeaf(BitNode* t)
{//递归算法计算二叉树的树叶数if (t == NULL)return 0;else{int m = BTNodeLeaf(t->lchild);//计算左子树的树叶数int n = BTNodeLeaf(t->rchild);//计算右子树的树叶数if (m + n == 0)return 1;elsereturn m + n;}
}
int BiTree::BTNodeLeafBiTree()
{//计算二叉树的树叶数BitNode* p = bt;//读取私有成员指针btreturn BTNodeLeaf(p);//调用二叉树的树叶数的递归函数
}

📖4.2.4查找二叉树

SearchNode()函数在二叉树t中查找值等于x的结点,若找到该结点时返回其首地址,否则返回NULL.判断t是否为空树,若为空树,则返回NULL,若为非空树,则在t->data==x时返回t,在t->data!=x时,在左子树中查找,否则在右子树中查找。
在这里插入图片描述

BitNode* BiTree::SearchNode(BitNode* t, char x)
{BitNode* p;if (t == NULL)return NULL;if (t->data == x)return t;else{p = SearchNode(t->lchild,x);//递归查找左子树if (p != NULL)return p;elsereturn SearchNode(t->rchild, x);//递归查找右子树}
}
BitNode* BiTree::SearchNodeBit(char x)
{BitNode* p = bt;return SearchNode(p, x);
}

好啦,关于二叉树的知识到这里并没有结束,后期会继续更新二叉树的相关知识,欢迎大家持续关注、点赞和评论!❤️❤️❤️

相关文章:

数据结构与算法-树

树 &#x1f388;1.树和二叉树&#x1f388;2.树&#x1f52d;2.1树的定义&#x1f52d;2.2树的4种表示方法&#x1f52d;2.3树的基本术语&#x1f52d;2.4树的抽象数据类型定义 &#x1f388;3.二叉树&#x1f52d;3.1二叉树的定义&#x1f52d;3.2二叉树的抽象数据类型定义&a…...

【Bug排查】Uncaught (in promise) Error: Infinite redirect in navigation guard

记一次Bug排查 今日在做尚硅谷的商品甄选项目时&#xff0c;遇到无法登录的问题&#xff1a;报错Uncaught (in promise) Error: Infinite redirect in navigation guard 一开始我去搜CSDN&#xff0c;都说是路由的问题&#xff0c;我对前端也不了解&#xff0c;试着改了一下&…...

ant使用第三方任务

ant提供了一个插件机制来使用第三方的任务。为了使用第三方的任务&#xff0c;需要做两步&#xff1a; 将它们的实现放在ant能找到的地方。声明任务 声明任务的几种方法&#xff1a; 声明一个任务&#xff1a;利用<taskdef name"taskname" classname"Impl…...

MySQL 性能分析

MySQL 性能分析 对 mysql 进行性能分析&#xff0c;主要就是提升查询的效率&#xff0c;其中索引占主导地位。对 mysql 进行性能分析主要有如下几种方式&#xff1a; 方式一&#xff1a;查看 sql 执行频次 show global status like ‘Com_______’; // global 表示全局 show s…...

【MySQL】数据库——库操作

文章目录 1. 创建数据库[IF NOT EXISTS] 的使用 2. 删除库3. 数据库的编码问题查看系统默认支持的字符集查看系统默认支持的校验集只查看 database的校验集指定编码创建数据库修改字符集修改校验集验证规则对数据库的影响utf8_general_ci ——不区分大小写utf8_bin ——区分大小…...

Python 轻量 ORM peewee 上手

介绍 有时候需要用 Python 直接操作数据库, 手工撸 SQL 倒也不是不能行, 但是总觉得有点背离了 人生苦短, 我用 Python 的初心, 习惯了 SQLAlchemy 的直接操作后, 就变懒了. 但是对于比较简单的数据库操作场景, 再跑一套 SQLAlchemy 又显得有些臃肿, 这次上手轻量 Python ORM …...

微信小程序开发的OA会议之会议,投票,个人中心的页面搭建及模板

目录 一.自定义组件 1.1.创建 1.2.定义 1.3.编写 1.4.使用 二.会议 2.1.数据 2.2.显示 2.3. 样式 三.个人中心 3.1.页面 3.2.样式 四.投票 4.1.引用 4.2.数据 4.3.页面 4.4.样式 好啦今天就到这里了&#xff0c;希望能帮到你哦&#xff01;&#xff01;&…...

决策树-入门

1、认识决策树 决策树思想的来源非常朴素&#xff0c;程序设计中的条件分支结构就是if-then结构&#xff0c;最早的决策树就是利用这类结构分割数据的一种分类学习方法 怎么理解这句话&#xff1f;通过一个对话例子 想一想这个女生为什么把年龄放在最上面判断&#xff01;&a…...

使用Redis发布订阅模式实现 Session共享

其实并不是实现session共享&#xff0c;而是通过redis的发布订阅&#xff0c;让所有集群的服务器&#xff0c;都让自己的session发送一下消息。比如说userId在第35台服务器上&#xff0c; 有100台服务器&#xff0c;那么第1台服务器收到消息&#xff0c;需要通知userId&#xf…...

安达发|AI在APS生产计划排程系统中的应用与优势

随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;已经在许多领域取得了显著的成果。在生产管理计划系统中&#xff0c;AI技术的应用也日益受到关注。本文将探讨如何将AI人工智能用在生产管理计划系统上&#xff0c;以提高生产效率、降低成本并优化资源配置。…...

国产低功耗MCU芯片:Si24R03

Si24R03集成了基于RISC-V核的低功耗MCU和工作在2.4GHz ISM频段的无线收发器模块&#xff0c;是一款高度集成的低功耗SOC片。 应用领域&#xff1a; 1、物联网 2、智N门锁 3、电机控制 4、消费电子 5、工业控制 其无线收发器模块是专为低功耗无线场合设计&#xff0c;在关…...

【Java】学生管理系统项目演示

目录 学生管理系统 学生管理系统代码思路分析 nextLine() 和 nextInt() 区别 学生管理系统 需求&#xff1a;实现对学生的增删改查功能&#xff0c;学生&#xff08;学号&#xff0c;姓名&#xff0c;年龄&#xff0c;地址&#xff09;字段 学生管理系统代码思路分析 定义学…...

Rust错误处理

返回值和错误处理 panic 深入剖析 主动调用 fn main() {panic!("crash and burn"); }backtrace 栈展开 panic 时的两种终止方式 当出现 panic! 时&#xff0c;程序提供了两种方式来处理终止流程&#xff1a;栈展开和直接终止 何时该使用 panic! 先来一点背景知…...

Golang操作数据库简单示例

目录 准备工作准备数据创建项目连接数据库查询数据修改数据插入数据删除数据释放资源完整代码最终执行结果 准备工作 在开始之前&#xff0c;你需要确保自己安装了Golang的编程环境&#xff0c;安装MySQL数据库&#xff0c;有一个可以用于编写代码的编辑器或IDE工具。我在这里…...

亚马逊测评,买家号支付不了、砍单率高是什么问题,需要怎么解决

下半年旺季很多卖家都在使用自养号测评给产品冲一波权重&#xff0c;但是很多朋友会遇到下不了单或者砍单率过高等问题。有人以为是支付卡的问题&#xff0c;也有人觉得是IP被关联了。其实他们讲的也没错&#xff0c;但是&#xff0c;亚马逊风控不会针对某个点去进行检测&#…...

B. Jellyfish and Game-Codeforces Round 902 (Div. 2)

B. Jellyfish and Game 交换k轮使得第一个同学拥有数值总数最大&#xff1b; 很容易看出这道题需要判断k奇偶数。 当k是奇数时可以看作第一个同学操作一轮。 k为偶数可以看作两个同学各操作一轮。 #include<iostream> #include<vector> #include<algorithm>…...

Linux下的命令行参数和环境变量

命令行参数 什么是命令行参数 命令行参数是指在执行命令行程序时&#xff0c;给程序传递的额外参数。在Linux终端中&#xff0c;命令行参数通常通过在命令后面添加空格分隔的参数来传递。 Linux下以main函数举例说明 #include<stdio.h>int main(int argc char* argv[])…...

语音芯片KT142C两种音频输出方式PWM和DAC的区别

目录 语音芯片KT142C两种音频输出方式PWM和DAC的区别 一般的语音芯片&#xff0c;输出方式&#xff0c;无外乎两种&#xff0c;即dac输出&#xff0c;或者PWM输出 其中dac的输出&#xff0c;一般应用场景都是外挂功放芯片&#xff0c;实现声音的放大&#xff0c;比如常用的音箱…...

Kotlin 协程的挂起和阻塞的区别

一&#xff0c;简介 Kotlin协程引入了非常强大的异步编程模型&#xff0c;通过挂起而不是阻塞来实现并发操作。以下是有关Kotlin协程挂起和阻塞的详细介绍&#xff1a; 挂起&#xff08;Suspending&#xff09;&#xff1a; 挂起是指一个协程的执行可以在不阻塞线程的情况下暂…...

解决Github Markdown图片显示残缺的问题

title: 解决Github Markdown图片显示残缺的问题 tags: 个人成长 categories:杂谈 在Github存放Markdown文档&#xff0c;如果图片没有存放在Github服务器上&#xff0c;github会尝试生成Github图片缓存&#xff0c;使用Github图片缓存&#xff0c;进行实际的展示。但比较蛋疼的…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践

前言&#xff1a;本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中&#xff0c;跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南&#xff0c;你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案&#xff0c;并结合内网…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...