【数据结构】平衡树引入

数据结构-平衡树


前置知识
  • 二叉树
  • 二叉树的中序遍历

问题

维护一个数据结构,支持插入元素、删除元素、查询元素的排名、查询排名对应的元素、查询元素的前驱、查询元素的后继等。

BST(二叉搜索树)

作为一个基本无效(很容易卡掉)的数据结构,将其放在这里讲可能更为合适。。。
BST 的思想,来自于二叉树的 DFS 序。
设想一下,若一个二叉树的中序遍历正好递增,也就是说,始终有 左儿子 ≤ 根 ≤ 右儿子 左儿子\le根\le右儿子 左儿子右儿子,那么不就可以达到 O ( 树高 ) O(\text{树高}) O(树高) 的复杂度了吗?
可能不是这样。设想一组数据,令插入的第 i i i 个节点为 i i i,BST 便会退化为 O ( n 2 ) O(n^2) O(n2),长成一条链。

思路

为了弥补 BST 的各种劣势,聪明的 OIers 发明了平衡树。
对于上面卡掉 BST 的样例,平衡树的一种画法长这样:

可以看出来,平衡树是非常平衡的。
平衡树的重要处理就是维护其平衡性。
接下来介绍一下用来维护平衡树的平衡性质的两种操作——左旋( Zag \text{Zag} Zag)和右旋( Zig \text{Zig} Zig

  • Zag \text{Zag} Zag
    如果有一个失衡子树长这样:

    需要将节点 q \text q q 旋转至节点 p \text p p,我们可以这样:

    注意到,其中序遍历是不变的。
  • Zig \text{Zig} Zig
    如果有一个失衡子树长这样:

    需要将节点 q \text q q 旋转至节点 p \text p p,我们可以这样:

    注意到,其中序遍历是不变的。

由于不同的平衡树对失衡子树的处理方式是不同的,所以这里不再赘述,可以去下方的文章学习。


数据结构参数
  • 单次修改时间复杂度: Θ ( log ⁡ n ) \Theta(\log n) Θ(logn)
  • 单次查询时间复杂度: Θ ( log ⁡ n ) \Theta(\log n) Θ(logn)
  • 空间复杂度: Θ ( n ) \Theta(n) Θ(n)

代码

这里放一下 Zag \text{Zag} Zag Zig \text{Zig} Zig

void Zag(int &p){//左旋 int q=t[p].r;t[p].r=t[q].l;t[q].l=p;p=q;Pushup(t[p].l);Pushup(p);
}
void Zig(int &p){//右旋 int q=t[p].l;t[p].l=t[q].r;t[q].r=p;p=q;Pushup(t[p].r);Pushup(p);
}

接下来是三种基本的平衡树:

  • AVL
  • Treap
  • Splay

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

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

相关文章

【Linux】线程的概念理解,从感知理解到全面深入

1.初始线程概念 在伟大的”计算机哲学“操作系统这本书中,一般给出线程的概念为:是在进程内部运行的一个执行分支(执行流),属于进程的一部分,粒度要比进程更加细腻和轻量化。大家对这一概念一看而过既可以…

Vuex快速上手

一、Vuex 概述 目标:明确Vuex是什么,应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具,状态就是数据。 大白话:Vuex 是一个插件,可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。例如:购…

C语言--每日练习题--Day38

第一题 1. 下列代码的运行结果() short i 65537; int j i 1; printf("i%d,j%d\n", i, j); A:i 65537,j 65538 B:i 1,j 2 C:i -1,j 0 D:i 1&#xff…

使用JSON-Server快速搭建RESTful API接口

​​​​​​​ 概要 随着前端技术的快速发展,前后端分离已经成为了一种趋势。在前后端分离的架构中,前端需要与后端进行数据的交互,这就需要后端提供RESTful API接口。而在开发过程中,我们常常需要模拟后端数据接口&#xf…

交友系统:打造独具魅力的社交平台!APP小程序H5三端源码交付,支持二开!

随着社交媒体的兴起,交友系统成为了现代社会不可或缺的一部分。人们希望通过网络结识新朋友,拓展社交圈,寻找志同道合的伙伴,甚至找到自己的爱情。本文将为您介绍交友系统的定义、功能以及如何打造一个独具魅力的社交平台。 一个成…

SQL中的三值逻辑:TRUE、FALSE 和 UNKNOWN。

在SQL中,通常采用三值逻辑处理条件表达式的真值。这种逻辑是基于三种可能的真值状态:TRUE、FALSE 和 UNKNOWN。 TRUE(真): 表示条件为真或成立。 FALSE(假): 表示条件为假或不成立。…

全局代理IP的工作原理和实现方法

目录 前言 一、全局代理IP的工作原理 1.代理服务器 2.代理协议 二、全局代理IP的实现方法 1.构建代理服务器 2.实现数据转发 3.使用代理服务器 4.启动代理服务器 三、全局代理IP的代码实现 四、总结 前言 在网络中,代理服务器是一种获取网络资源的方式。…

万界星空科技电子装配行业MES解决方案

电子电器装配属于劳动密集型、科技含量较高的行业,产品零部件种类繁多,生产组装困难,生产过程存在盲点,同时也决定了生产流水线多且对自动化水平要求较高。 万界星空科技提供的电子行业MES解决方案,提供从仓储管理、生…

源码级详解Spring的三级缓存,循环依赖的处理流程

一.什么是三级缓存 1.一级缓存:存放已经初始化完成的Bean 2.二级缓存:存放半成品Bean,既实例化完成未初始化的Bean。 3.三级缓存:存放bean工厂 二.为什么是三级缓存 一级缓存是必须的,这个我们没有什么疑问。那为…

Flutter的BuildContext简介

文章目录 BuildContext 简介BuildContext的主要作用 BuildContext 简介 BuildContext是Flutter中的一个重要概念,表示当前Widget在树中的位置上下文。它是一个对Widget树的一个位置的引用,用于查找、访问和操作该位置上的相关信息。每个Widget都有一个关…

MSSQL存储过程的功能和用法:解密数据库编程的神秘面纱

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

充分发挥SQL能力之数列

SQL数列 1、数列概述2、SQL数列2.1、简单递增序列2.2、等差数列2.3、等比数列3、SQL数列的应用3.1、连续问题3.2、多维分析1、数列概述 数列是最常见的数据形式之一,实际数据开发场景中遇到的基本都是有限数列。常见的数列例如:简单递增序列、等差数列、等比数列等 如何充分…