12.5,12.15AVL树更新,定义,插入

 定义平衡因子为右子树高度减去左子树高度

AVL树插入分为两步:

  1. 按照二叉搜索树的方式插入新节点
  2. 调整平衡因子

对于平衡因子的调整,在插入之前,所有节点的平衡因子分为三种情况:0,1,-1插入后,新插入节点可能会使它的父节点的平衡因子发生变化,有这么三种情况:

1.新插入节点的父节点(parent)的平衡因子变成0(一定是由1或-1变成0)

2.新插入节点的父节点(parent)的平衡因子变成-1/1(由0变成1或-1)

3.新插入节点的父节点的平衡因子变成2/-2,此时已经违反了平衡树的性质,需要对其进行旋转处理.

AVL操作

更新

BST旋转

结点旋转操作对不同的BST树操作方式都是一样的

1.Insert 1, 2, 3, 4, 5, and 6 one by one into an initially empty AVL tree. Then the preorder traversal sequence of the resulting tree must be {4, 2, 1, 3, 5, 6}. 

什么时候需要旋转??怎么旋转??

弄懂文章

PTA选择题复习,

编程题

那个题弄懂(如果可以再练习一道) 

复习几个文章

AVL

AVL树定义

template<class K, class V>
struct AVLNode
{AVLNode<K, V>* _left;AVLNode<K, V>* _right;AVLNode<K, V>* _parent;std::pair<K, V> _kv;int _bf;
​AVLNode(const std::pair<K, V>& kv = std::pair<K, V>()): _left(nullptr), _right(nullptr), _parent(nullptr), _kv(kv), _bf(0){ } 
};

即相比普通BST,多一个量为bf,表示平衡因子

此处默认BF=左子树高度减去右子树高度

平衡因子为0,说明没有孩子结点或者左右子树高度相同

平衡因子为1,说明没有右孩子结点或者左子树比右子树高度高1

平衡因子为-1,说明没有左孩子结点或者右子树比左子树高度高1

插入(两种底层情况)

当新增的节点 *cur(指向节点的指针为 cur) 插入到其双亲节点 *parent(指向节点的指针为 parent)的左边时,双亲节点的平衡因子 +1;反之,当新增的节点插入到其双亲节点的右边时,双亲节点的平衡因子 -1。

  1. 若双亲节点的平衡因子原来为 -1 或者 1,在它的左边或者右边插入新增的节点后,它的平衡因子变为 0。由于以 *parent 为根节点的子树的高度没有发生变化,因此也不会影响除 *parent 以外的其它祖先节点的平衡因子,插入完成。 

    这种情况,仅考虑最底层的叶子节点与非叶子结点,即原来为-1,1,就说明最底层的非叶子结点只有一个孩子,然后现在插入,就是插入到另一个没孩子的位置上去。
    由于之前有孩子,而且新插入的位置不在原来有孩子的基础上(如果是在原来有孩子的基础上,实际上是可以看成第2种情况)
     
  2. 若双亲节点的平衡因子原来为 0,在它的左边或者右边插入新增的节点后,它的平衡因子变为 1 或者 -1。由于以 *parent 为根节点的子树的高度增高了 1,此时也就会影响其它祖先节点的平衡因子,需要往上更新。
    这种情况就是说之前没孩子,然后现在插入,使其多一个孩子

由此,就是插入的两种情况,所有插入类型本质上都是这两种情况,对于AVL树,其底层。

即插入的结点,是有孩子还是没孩子,其只关注插入层与上一层(parent层),即类似与在左孩子的位置上继续向左插入的情况,就是视为以左孩子为父母层的插入情况,即第二种

BF、高度变化特点

所以也就是对于BF,第一种情况时,只改变插入的父母结点的平衡因子,不影响祖辈结点的平衡因子(因为其子树高度没发生变化),特点为父母结点初始为1或-1,插入完后为0;第二种情况时,改变父母与祖辈的平衡因子,特点为父母结点初始为0,插入完后增减1,同时,往上更新祖辈结点平衡因子

具体来说,如果插入新节点的路径是左子树,那么从插入节点往上遍历的祖先节点,其平衡因子都需要增加1。如果插入新节点的路径是右子树,那么祖先节点的平衡因子都需要减去1。

如果某个祖先节点的平衡因子更新为0,说明平衡已恢复,插入操作完成。

如果某个祖先节点的平衡因子更新为1或-1,说明需要继续向上更新,直到达到根节点为止。当根节点的平衡因子也更新为0、1或-1时,表示整个插入操作完成。

然而,当某个祖先节点的平衡因子更新为2或-2时,(注意是某个祖先结点,不一定是根节点)表示出现了最小不平衡子树。此时,需要进行平衡调整来恢复AVL树的平衡。平衡调整的方法通常有LL旋转、RR旋转、LR旋转和RL旋转等。

总结起来,插入新节点后,除了更新新节点的双亲节点的平衡因子外,还需要继续往上更新祖先节点的平衡因子,并在出现最小不平衡子树时进行平衡调整以维持AVL树的平衡性

在AVL树的插入操作中,我们需要更新插入节点的祖先节点的平衡因子,以保持树的平衡性。当插入节点的平衡因子更新为1或-1时(原始为0),说明插入节点的子树高度发生了变化,这可能导致祖先节点的平衡因子也需要更新。

考虑以下情况:

1. 如果插入节点的路径在祖先节点的左子树上,即插入节点是祖先节点的左子节点。那么插入节点的插入会导致该祖先节点的平衡因子增加1。但是,由于插入节点的子树高度发生了变化,也可能影响到该祖先节点的平衡因子,使之变为1或-1。因此,我们需要继续向上更新祖先节点的平衡因子,以确保整棵树的平衡性。

2. 同样地,如果插入节点的路径在祖先节点的右子树上,即插入节点是祖先节点的右子节点。那么插入节点的插入会导致该祖先节点的平衡因子减少1。但是,插入节点的子树高度的变化也可能对该祖先节点的平衡因子产生影响,使之变为1或-1。因此,我们同样需要向上更新祖先节点的平衡因子来维持树的平衡。

两种插入的底层逻辑就是,第一种为原来根节点的平衡因子不为0,即左右子树一高一低,或者一个有,一个没有的情况,然后插入使高度相同,即由1或-1变为0

第二种为原来平衡因子为0,即左右子树高度相同,或者都没有,然后插入使高度不同,变为一高一低

这样,第一种插入后,根节点高度不变,只是高度相同了;第二种高度会变化,插入沿途路径高度增加1

往上更新(三种可能情况)

往上更新其它祖先节点的平衡因子的方式和一开始插入新增节点 *cur 时更新其双亲节点 *parent 的平衡因子的方式是一样的,即如果 *cur 在祖先节点的左子树中,则祖先节点的平衡因子 +1;如果 *cur 在祖先节点的右子树中,则祖先节点的平衡因子 -1。

如果祖先节点的平衡因子被更新为 0,则说明更新完成了,也意味着插入完成了。

如果祖先节点的平衡因子被更新为 1 或者 -1,则说明还需要继续往上更新(说明原来是0,不然就不可能平衡为AVL,现在为1或-1,则意味着祖先的子树高度发生了变化),直到某个祖先节点的平衡因子被更新为 0,或者直到更新完根节点,当根节点的平衡因子被更新为 0、1 或者 -1 时,意味着更新和插入也都完成了。

如果祖先节点的平衡因子被更新为 2 或者 -2(即其较高的子树增高了),就需要对以该节点为根节点的子树(称为最小不平衡子树)做平衡调整来恢复平衡。

对于祖先结点的树高发生变化,考虑,首先一定是第二种情况使其发生了变化,然后平衡因子变化,就是某一子树高度发生了变化,但祖先结点的高度不一定发生变化,即插入的位置在原来比较矮的子树里,这时候,实际上就会导致该祖先结点的BF变为0,且祖先结点高度不变;但如果原来是一样高,插入后就会变化为1或-1,进而使祖先结点高度发生变化,从而需要沿着祖先节点向上继续调整,找到祖先的祖先,因祖先结点是祖先的祖先结点的子树,其高度发生变化,祖先祖先结点高度也可能会发生变化。递归这一过程,直到根节点或某祖先结点BF变为0(意味该祖先结点高度不变,那么往上的BF也都不会再发生变化,实际相当于第一种插入情况)

而如果在变高调整过程中,出现BF为2,-2的情况,就需要进行相应的旋转调整

即向上调整会出现的三种底层情况

如果祖先结点BF更新为0,相当于第一种插入情况,即往缺孩子的那一块插入,使树更平衡,同时结点高度未发生变化,所以再往上也都不会发生变化

如果更新为1或-1,相当于第二种情况,即原来左右是等高的,因为插入,从而使结点的高度,BF(尤其是高度)发生了变化,所以才需要往上去进行调整,因为子树的高度变化了

第三种情况就是被视为底层的两种插入情况时的补全情况,注意是最小不平衡子树,最小的概念

平衡调整(四种情况)

首先需要注意如何进行平衡调整与插入无关,即需要平衡调整时,怎样进行调整不在插入时判断,而是在需要调整时判断

LL 型:由于在 A 左子树根节点的左子树上插入节点,A 的平衡因子由 1 增至 2,致使以 A 为根节点的子树失去平衡,则需进行一次向右的顺时针旋转操作

原根结点为A,新根节点为B,核心逻辑为

node* nroot = a->lchild;
a->lchild = nroot->rchild;
nroot->rchild = a;
void LL(Node* pA)
{Node* pB = pA->_left;Node* pBR = pB->_right;
​pA->_left = pBR;if (pBR)pBR->_parent = pA;
​pB->_right = pA;Node* tmp = pA->_parent;pA->_parent = pB;pB->_parent = tmp;
​if (tmp == nullptr)  // 或者 _root == pA{_root = pB;}else{if (tmp->_left == pA)tmp->_left = pB;elsetmp->_right = pB;}
​pA->_bf = pB->_bf = 0;
}

RR 型:由于在 A 的右子树根节点的右子树上插入节点,A 的平衡因子由 -1 变成 -2,致使以 A 为根节点的子树失去平衡,则需进行一次向左的逆时针旋转操作

void RR(Node* pA)
{Node* pB = pA->_right;Node* pBL = pB->_left;
​pA->_right = pBL;if (pBL)pBL->_parent = pA;
​pB->_left = pA;Node* tmp = pA->_parent;pA->_parent = pB;pB->_parent = tmp;
​if (tmp == nullptr)  // 或者 _root == pA{_root = pB;}else{if (tmp->_left == pA)tmp->_left = pB;elsetmp->_right = pB;}
​pA->_bf = pB->_bf = 0;
}

LR 型:由于在 A 的左子树的根节点的右子树上插入节点,A 的平衡因子由 1 增至 2,致使以 A 为根节点的子树失去平衡,则需要进行两次旋转操作

区分LR型的,就是结点C的平衡因子;但无论是那种LR型,操作都是一样的,就是先左旋,然后右旋

就是依据C的平衡因子,确定最后A,B,C的平衡因子 

void LR(Node* pA)
{Node* pB = pA->_left;Node* pC = pB->_right;int bf = pC->_bf;
​RR(pB);LL(pA);
​if (bf == 0)  // LR(0)型{pA->_bf = 0;pB->_bf = 0;pC->_bf = 0;}else if (bf == 1)  // LR(L)型{pA->_bf = -1;pB->_bf = 0;pC->_bf = 0;}else if (bf == -1)  // LR(R)型{pA->_bf = 0;pB->_bf = 1;pC->_bf = 0;}
}

RL 型:由于在 A 的右子树根节点的左子树上插入节点,A 的平衡因子由 -1 变为 -2,致使以 A 为根节点的子树失去平衡,则旋转方法和 LR 型对称,也需进行两次旋转,先顺时针右旋,再逆时针左旋

void RL(Node* pA)
{Node* pB = pA->_right;Node* pC = pB->_left;int bf = pC->_bf;
​LL(pB);RR(pA);
​if (bf == 0)  // RL(0)型{pA->_bf = 0;pB->_bf = 0;pC->_bf = 0;}else if (bf == 1)  // RL(L)型{pA->_bf = 0;pB->_bf = -1;pC->_bf = 0;}else if (bf == -1)  // RL(R)型{pA->_bf = 1;pB->_bf = 0;pC->_bf = 0;}
}

总结:无论哪一种情况,在经过平衡旋转处理之后,以 B 或 C 为根的新子树为平衡二叉树,而且它们的高度和插入之前以 A 为根的子树相同。因此,当平衡的二叉搜索树因插入节点而失去平衡时,仅需对最小不平衡子树进行平衡旋转处理即可

高度和A高度相同,就说明旋转不会使高度发生变化,只是调整BST,使之平衡,所以就不需要再向上继续调整了

此外,所谓0型RL,LR,就是建立在第二种插入的基础上,最简单的一种,即被插入的结点(B)就没有结点,为叶子结点,

L,R型的不平衡,也是建立在第二种插入的基础上,(第二种插入的底层逻辑是,根节点平衡因子为0,即左右子树高度相同或都没有,然后插入后,使这一情况发生了改变),被插入的结点(C)有孩子结点,只是高度相同,然后插入使之高度发生变化,进而导致C的高度发生变化,进而导致B的高度发生变化,进而导致A的高度发生变化,且A的平衡因子超过1或-1

即L,R型,就是对应着在插入前的,已经致密的,左右子树处处相等的介稳态,即插入前CL,CR高度相同,BL,BR(即C)高度相同

总结一下就是,不平衡就两种本质情况,即BF=2或BF=-2

然后依据BF=2,-2的具体情况再延申出4种具体情况

BF=2,-2说明插入前的BF为1或-1

BF=2说明左子树比右子树高2,即往左子树插了一个值,然后使左子树高度加了1(只有第二种插入方式才会使高度发生变化),左子树可能有左右结点,若其左右子树的高度相同或都没有时,插入(为第二种形式),使左子树高度增加,进而使根节点高度增加,BF变为2;若左右子树高度不同,当插到高的那个子树上时,那么此时的A就不再是最小不平衡子树,即考虑此时的情况就没有意义了,因为在底层时就会进行调整,表现到A的左子树时,左子树的左右子树高度就相等了;当左右子树高度不同,插到低的那个子树上时,相当于第一种插入,不会影响高度

删除

AVL 树的删除算法与二叉搜索树类似,不同之处在于:若删除后破坏了 AVL 树的高度平衡性质,还需要做平衡化旋转。

如果被删节点 *cur 的左、右子树都不为空。首先找到左子树中键值最大的节点 *leftMax(或者找到右子树中键值最小的节点 *rightMin),然后进行交换,即 std::swap(cur->_kv, leftMax->_kv);, 此时被删节点就变成了 *leftMax,该节点的右子树一定为空。

如果被删节点 *cur 最多只有一个孩子 *child。可以把 *cur 的双亲节点 *parent 中原来指向 *cur 的指针改为指向 *child。如果 *cur 没有孩子,则 *parent 的相应指针置为 nullptr。由于以 *parent 为根节点的子树的高度缩短了 1,所以需沿着 *parent 通向根节点的路径,往上追踪高度的这一变化对路径上各个节点的影响。

判断是否需要向上调整的关键条件,本质条件为,结点的高度是否发生变化,如果发生变化,那么向上去调整,不然就不继续向上调整

考查 *cur 的祖先节点,若 *cur 在祖先节点的左子树中,则祖先节点的平衡因子 -1,反之,则祖先节点的平衡因子 +1。根据祖先节点更新后的平衡因子,按以下三种情况分别进行处理:

  1. 祖先节点的平衡因子原来为 0,在它的左子树或者右子树被缩短后,它的平衡因子变为 -1 或者 1由于以该节点为根的子树的高度没有改变,则不需要往上更新了,删除结束。
    变为1就是说删除右子树中的结点,变为-1就是删除左子树中的结点
  2. 祖先节点的平衡因子原来为 1 或者 -1,在它的较高的子树被缩短后,它的平衡因子改为 0此时以该节点为根的子树平衡,但其高度减 1,所以需要继续往上更新。
    继续往上调整,就是防止情况为,在该根节点上的祖先节点中,该根节点为其中高度较小的子树,然后因为删除,使其高度变小,从而导致祖先节点可能不平衡,也就是第三种情况中的某些底层为这一情况

  3. 祖先节点的平衡因子原来为 -1 或者 1,在它的较矮的子树被缩短后,它的平衡因子变为 -2 或者 2。此时以该节点为根的子树不平衡,需要进行平衡化旋转来恢复平衡。

    根据祖先节点较高的子树的根(该子树未被缩短)的平衡因子,有如下 3 种平衡化操作:

    (1) 如果祖先节点较高的子树的根的平衡因子为 0,则执行一个单旋转来恢复子树的平衡。

    由于旋转平衡后以 *q 为根节点的子树的高度没有发生改变,所以不需要再往上更新了,删除结束。

    (2) 如果祖先节点较高的子树的根的平衡因子和祖先节点的平衡因子的正负号相同,则执行一个单旋转来恢复平衡。

    由于经过旋转平衡旋转后以 *q 为根节点的子树的高度降低了 1,所以需要继续往上更新。

    (3) 如果祖先节点较高的子树的根的平衡因子和祖先节点的平衡因子的正负号相反,则执行一个双旋转来恢复平衡。

    由于经过平衡化处理后以 *r 为根的子树的高度降低了 1,所以还需要继续往上更新。
     

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

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

相关文章

EasyExcel 简单导入

前边写过使用easyexcel进行简单、多sheet页的导出。今天周日利用空闲写一下对应简单的导入。 重点&#xff1a;springboot、easyExcel、桥接模式&#xff1b; 说明&#xff1a;本次使用实体类student&#xff1a;属性看前边章节内容&#xff1b; 1、公共导入service public …

ArkTS编译时遇到arkts-no-obj-literals-as-types错误【Bug已解决-鸿蒙】

文章目录 项目场景:问题描述原因分析:解决方案:解决方案1解决方案2此Bug解决方案总结项目场景: 在开发鸿蒙项目过程中,遇到了arkts-no-obj-literals-as-types,总结了自己和网上人的解决方案,故写下这篇文章。 遇到问题: rkTS编译时遇到arkts-no-obj-literals-as-type…

【数据结构】(二叉树)计算结点|叶子结点|高度|第K层结点数

目录 概念&#xff1a; 特殊的二叉树 二叉树的性质 二叉树的存储结构 二叉树的创建 二叉树遍历 前序&#xff1a; 中序&#xff1a; 后序&#xff1a; 计算结点数 计算叶子结点数 计算树的高度&#xff08;深度&#xff09; 计算第K层结点数 概念&#xff1a; 一颗…

PVE系列-防火墙的免费安静之旅IPfire

Ventoy一款引导盘可以引导各种启动盘安装盘的工具https://www.ventoy.net/cn/index.html 在它的兼容iso的列表 中发现了Ipfirehttps://wiki.ipfire.org/ &#xff0c;本来用着openwrt也挺好&#xff0c;忍不住的虚拟机尝了尝鲜&#xff0c;发现的功能有2&#xff0c; 安全吧&a…

虚拟化之安全虚拟化

虚拟化首次引入是在Armv7-A架构中。那时&#xff0c;Hyp模式&#xff08;在AArch32中相当于EL2&#xff09;仅在非安全状态下可用。当Armv8.4-A引入时&#xff0c;添加了对安全状态下EL2的支持作为一个可选特性。 当处理器支持安全EL2时&#xff0c;需要使用SCR_EL3.EEL2位从E…

linux文件打包和压缩

7.2 文件打包和压缩 7.2.1 tar tar&#xff08;英文全拼&#xff1a;tape archive &#xff09;命令用于备份文件。 ​ tar 是用来建立&#xff0c;还原备份文件的工具程序&#xff0c;它可以加入&#xff0c;解开备份文件内的文件。 ​ tar命令是Unix/Linux系统中备给文件的…

NetSuite 智能商品推荐(Intelligent Recommendations)

本周在一个客户环境里&#xff0c;发现销售订单中有个Intelligent Recommendations的按钮。 本以为是客户新装的一个SuiteApp&#xff0c;仔细研究一下发现还不是。是个我们忽略的一个内建新功能。 Intelligent Recommendations&#xff0c;是2023.1版本推出的新功能。主要目的…

Qt 表格相关API

1.文本框 限制输入数据类型&#xff08;如仅英文&#xff09; QValidator* validator new QRegExpValidator(QRegExp("[a-zA-Z]"), lineText); // 创建正则表达式验证器lineText->setValidator(validator); // 将验证器设置给 QLineEdit QLineEdit&#xff1a;单…

(2023|ICLR,文本反演,LDM,伪词)一个词描述一张图像:使用文本反演个性化文本到图像的生成

An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion 公纵号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 3. 方…

Vue 2.x跟Vue 3.x有啥区别

大家好&#xff0c;我是咕噜-凯撒&#xff0c;我们都知道Vue 是一款比较流行的前端JavaScript 框架&#xff0c;在他演进的过程中出现了2个主要版本&#xff0c;Vue 2.x 和 Vue 3.x。这两个版本之间有很多的区别&#xff0c;下面我以自己的理解介绍一下他们之间的区别。 响应性…

开源的数据流技术,该选择Redpanda还是Apache Kafka?

本文将比较Apache Kafka和Redpanda两种开源的数据流技术&#xff0c;在云原生实时处理能力上的不同&#xff0c;以及如何在项目中做出选择。 目前&#xff0c;Apache Kafka不但成为了数据流处理领域事实上的标准&#xff0c;而且带动了同类产品的出现。Redpanda就是其中之一…

DeCap DECODING CLIP LATENTS FOR ZERO-SHOT CAPTIONING VIA TEXT-ONLY TRAINING

DeCap: DECODING CLIP LATENTS FOR ZERO-SHOT CAPTIONING VIA TEXT-ONLY TRAINING 论文&#xff1a;https://arxiv.org/abs/2303.03032 代码&#xff1a;https://github.com/dhg-wei/DeCap OpenReview&#xff1a;https://openreview.net/forum?idLt8bMlhiwx2 TL; DR&#xff…

AIGC(生成式AI)试用 15 -- 小结

断断续续的尝试在实际的工作使用中理解和测试AIGC&#xff0c;运用会越来越多、越来越广范&#xff0c;但也是时候做个小结了。 没有太用热火的ChatGPT&#xff0c;只是拿了日常最容易用到的CSDN创作助手&#xff08;每周写文章总是看到&#xff09;和文心一言&#xff08;…

多层记忆增强外观-运动对齐框架用于视频异常检测 论文阅读

MULTI-LEVEL MEMORY-AUGMENTED APPEARANCE-MOTION CORRESPONDENCE FRAMEWORK FOR VIDEO ANOMALY DETECTION 论文阅读 摘要1.介绍2.方法2.1外观和运动对其建模2.2.记忆引导抑制模块2.3. Training Loss2.4. Anomaly Detection 3.实验与结果4.结论 论文标题&#xff1a;MULTI-LEVE…

springboot整合vue,将vue项目整合到springboot项目中

将vue项目打包后&#xff0c;与springboot项目整合。 第一步&#xff0c;使用springboot中的thymeleaf模板引擎 导入依赖 <!-- thymeleaf 模板 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-t…

虚拟机下Ubuntu上网设置

文章目录 一、虚拟机上网的两种方式1.1 NAT模式&#xff08;Network Address Translation&#xff09;1.2 桥接模式&#xff08;Bridge Mode&#xff09;1.3 简介 二、实际配置2.1 NAT模式配置2.2 桥接模式配置 之前跟着博客配了好几个也没用&#xff0c;后来自己慢慢模式实践测…

MySQL数据库 DML

目录 DML概述 添加数据 修改数据 删除数据 DML概述 DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。 添加数据(工NSERT)修改数据(UPDATE)删除数据(DELETE) 添加数据 (1)给指定字段添加数据 INSERT …

【FPGA/verilog -入门学习9】verilog基于查找表的8位格雷码转换

本文参考&#xff1a;FPGA杂记5——格雷码转换设计-CSDN博客 1&#xff0c;什么是查表法&#xff0c;做什么用&#xff0c;有什么好处 查找表&#xff08;Look-Up-Table&#xff09; 查找表&#xff0c;简单说&#xff0c;就是一个预先存储好结果的数据表 通过访问这张预先存储…

【数据分享】2019-2023年我国区县逐年新房房价数据(Excel/Shp格式)

房价是一个区域发展程度的重要体现&#xff0c;一个区域的房价越高通常代表这个区域越发达&#xff0c;对于人口的吸引力越大&#xff01;因此&#xff0c;房价数据是我们在各项城市研究中都非常常用的数据&#xff01;之前我们分享了2019—2023年我国区县逐月的新房房价数据&a…

解决“bat中文路径乱码“问题

今天&#xff0c;在使用.bat脚本&#xff0c;将hello.png从"D:\mypic\备份"目录&#xff0c;拷贝到"D:\mypic\备份"时&#xff1b;发现中文乱码,弹出如下对话框: 图(1) bat中文路径乱码 原来的命令是&#xff1a; copy D:\mypic\one\hello.png D:\mypic\备…