平衡树相关笔记

news2024/10/7 20:26:47

引入

二叉查找树

二叉查找树(Binary Search Tree),又名二叉搜索树。满足以下性质:

  • 对于非空的左子树,左子树点权值小于根节点。
  • 对于非空的右子树,左子树点权值大于根节点。
  • 二叉查找树的左右子树均是二叉查找树。

平衡树

在维持二叉查找树性质的基础上,通过改变其形态,控制深度在 log ⁡ n \log n logn 级别。

平衡树左右两个子树高度差不大于 1 1 1,否则需要进行左旋 / 右旋操作。

pb_ds

C++pb_ds 中有封装好的平衡树。

tree 类型的平衡树常数稍大,速度略慢。

声明方式

有以下声明(来源于官方文档):

template<
    typename Key,
    typename Mapped,
    typename Cmp_Fn = std::less<Key>,
    typename Tag = rb_tree_tag,
    template<
        typename Const_Node_Iterator,
        typename Node_Iterator,
        typename Cmp_Fn_,
        typename Allocator_>
    class Node_Update = null_tree_node_update,
    typename Allocator = std::allocator<char> >
class tree;

常用的定义方式为 tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>

  • 第一个参数表示存储元素(Key)的类型;
  • 第二个参数表示映射规则(Mapped-Policy)的类型,常用的是 null_type,表示无映射;
  • 第三个参数表示比较规则(Cmp_Fn);
  • 第四个参数表示平衡树的类型(Tag),有 rb_tree_tag(红黑树)、splay_tree_tag 等;
  • 第五个参数表示更新节点的策略(Node_Update),默认为 null_node_update,如果要使用查询排名相关操作,需要使用 tree_order_statisitics_node_update

常用操作

其中 x 表示存储元素的类型。

  • insert(x):插入元素 x x x
  • erase(x):删除元素 x x x
  • order_of_key(x):查询元素 x x x 的排名(前面有多少数比 x x x 小),返回值为整数。
  • find_by_order(x):查询排名为 x x x 的元素对应的迭代器。
  • lower_bound(x)upper_bound(x):返回迭代器。
  • join(x):将 x x x 树并入当前树,要求两树值域不能重叠。合并后 x x x 树被清空。
  • split(x,b):小于等于 x x x 的属于当前树,其余的属于 b b b 树。
  • size():返回大小。

以下是 P3369 【模板】普通平衡树 的代码。

注意用 pb_ds 实现的 tree 类似于一个 set,元素是不可重的。所以我们把元素以 pair 的形式存储,再记录一个元素被插入到 tree 的时间。

prev(it) 函数可以求迭代器 it 的前驱(即前一个位置)。注意求 x x x 的后继时,用 upper_bound() 操作的键值对应该是 pair<x,INT_MAX>,避免查找到和 x x x 相等但插入时间比 x x x 晚的元素。

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;

tree<pair<int,int>,null_type,less<pair<int,int> >,rb_tree_tag,tree_order_statistics_node_update> t;

int main()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++)
    {
        int op,x;cin>>op>>x;
        if(op==1) t.insert({x,i});
        if(op==2) t.erase(t.upper_bound({x,0}));
        if(op==3) cout<<t.order_of_key({x,0})+1<<endl;
        if(op==4)
        {
            auto it=t.find_by_order(x-1);
            cout<<(*it).first<<endl;
        }
        if(op==5)
        {
            auto it=prev(t.lower_bound({x,0}));
            cout<<(*it).first<<endl;
        }
        if(op==6)
        {
            auto it=t.upper_bound({x,INT_MAX});
            cout<<(*it).first<<endl;
        }
    }
    return 0;
}

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

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

相关文章

Android修行手册 - 模板匹配函数matchTemplate详解,从N张图片中找到是否包含五星

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

麒麟v10 安装jenkins

1.想安装哪个版本&#xff1f; https://pkg.jenkins.io/redhat-stable/ 我们查看我们想要哪个版本&#xff1a; 4年前安装的是 Jenkins2.279 版本 现在在docker 上安装的是Version 2.425 版本 2.碰到到的问题 1.安装老版本的Jenkins&#xff0c;会出现安装的插件不兼容&…

win版redis详细安装教程

一、下载 github下载地址 https://github.com/MicrosoftArchive/redis/releases 可选择&#xff1a;下载msi包或zip压缩包 这里我选择的是zip压缩包&#xff0c;直接通过cmd命令窗口操作即可。 二、安装步骤 1、解压Redis压缩包 选中压缩包&#xff0c;右键选择解压&#…

WordPress 主题QUX DUX加强版

模板简介&#xff1a; QUX主题是由轻语博客在大前端DU主题的基础上集成了Ucenter&Market插件后修改加强版&#xff0c;在原有主题的基础上迎合市场增加了很多的功能。主题已解密去授权。 更新内容&#xff1a; 新增关闭注册验证码&#xff08;主题设置–会员中心&#xff…

【黑马程序员】SpringCloud——微服务

文章目录 前言一、服务架构演变1. 单体架构2. 分布式架构2.1 服务治理 3. 微服务3.1 微服务结构3.2 微服务技术对比3.3 企业需求 二、SpringCloud兼容性 三、服务拆分及远程调用1. 服务拆分1.1 服务拆分注意事项1.2 导入服务拆分 Demo 2. 远程调用2.1 根据订单 id 查询订单功能…

2023年10月CSDN客服月报|解决9个重大问题、12个次要问题、12个一般问题,处理5个用户需求

听用户心声&#xff0c;解用户之需。hello&#xff0c;大家好&#xff0c;这里是《CSDN客诉报告》第25期&#xff0c;接下来就请大家一同回顾我们10月份解决的bug&#xff5e; 一、重大问题 1、全站无法访问 反馈量&#xff1a;90问题原因&#xff1a;DDOS攻击具体表现&…

day3 ARM

【昨日作业】 .text .global start _start: mov r0,#0 存放sum mov r1,#1 存放相加的数值 loop: cmp r1,#100 bhi wh add r0,r0,r1 add r1,r1,#1 b loop wh: b wh .end 【内存读写指令】 通过内存读写指令可以实现向内存中写入指定数据或者读取指定内存地址的数据 c语言内存…

【Python3】【力扣题】231. 2 的幂

【力扣题】题目描述&#xff1a; 此题&#xff1a;n为整数&#xff08;32位有符号整数&#xff09;&#xff0c;x为整数。 2 的幂次方都大于0。若幂为负数&#xff0c;则0<n<1&#xff0c;n不为整数。 因此&#xff0c;n为正整数&#xff0c;x为0和正整数。 若二进制表示…

学为贵雅思写作备考

准确通顺&#xff0c;言之有物 两次读不懂&#xff0c;6分以下&#xff0c; 6分没有印象&#xff0c;味同嚼蜡&#xff0c;但是没错&#xff08;书面语过关&#xff09; 英语比较过关 8-9分&#xff0c;很有见地 6-7单个的句子读得懂&#xff0c;前后是贯通的、逻辑是通顺…

决策式AI与生成式AI

人工智能中深度学习&#xff0c;是一种受人脑的生物神经网络机制启发&#xff0c;并模仿人脑来解释、处理数据的机器学习技术&#xff0c;它能自动对数据进行特征提取、识别、决策和生成。它可以从不同的维度进行划分&#xff0c;如果按模型的特点来划分可分为决策式AI和生成式…

open clip论文阅读摘要

看下open clip论文 Learning Transferable Visual Models From Natural Language Supervision These results suggest that the aggregate supervision accessible to modern pre-training methods within web-scale collections of text surpasses that of high-quality crowd…

我的AIGC部署实践02

我的AIGC部署实践02 上次的教程我们实现了在趋势云平台上创建项目并运行对应的代码。虽然有比较好的结果&#xff0c;不过很多时候我们往往需要根据自己的需要更改代码&#xff0c;那么代码运行及部署的流程是怎么样的呢&#xff1f;让我们继续往下看吧。 1.学习准备 官方代码…

测试工程师面试攻略:教你如何描述项目经验

俗话说的好&#xff0c;知己知彼百战百胜。项目经验说的好不好&#xff0c;直接决定了你值多少钱。满满的干货&#xff0c;先三连再耐心看完。 去面试之前&#xff0c;建议大家把简历写得从业经历和项目经验熟练的背下来&#xff0c;能说出项目经验里的详细的测试情况最好。 一…

工程(十三)——基于激光视觉的SLAM三维重建

博主创建了一个科研互助群Q&#xff1a;772356582&#xff0c;欢迎大家加入讨论。这是一个科研互助群&#xff0c;主要围绕机器人&#xff0c;无人驾驶&#xff0c;无人机方面的感知定位&#xff0c;决策规划&#xff0c;以及论文发表经验&#xff0c;以方便大家很好很快的科研…

了解企业邮箱的外观和功能特点

企业邮箱是什么样子的&#xff1f;企业邮箱不是单一产品&#xff0c;而是由一系列电子邮件服务组成的生态系统。这些服务包括但不限于邮件服务器、客户端、安全解决方案等。这些服务共同构成了企业邮箱的基础设施。 在外观上&#xff0c;企业邮箱和个人邮箱没有太大区别。用户通…

查询优化器:RBO与CBO

SQL查询优化器 1、数据库系统发展简史2、SQL查询优化器3、查询优化器分类4、查询优化器执行过程5、CBO框架Calcite简介 1、数据库系统发展简史 数据库系统诞生于20世纪60年代中期&#xff0c;至今已有近50多年的历史&#xff0c;其发展经历了三代演变&#xff0c;造就了四位图灵…

6个机器学习可解释性框架

1、SHAP SHapley Additive explanation (SHAP)是一种解释任何机器学习模型输出的博弈论方法。它利用博弈论中的经典Shapley值及其相关扩展将最优信贷分配与局部解释联系起来. 举例&#xff1a;基于随机森林模型的心脏病患者预测分类 数据集中每个特征对模型预测的贡献由Shap…

Vscode禁止插件自动更新

由于电脑的vscode版本不是很新。2022.10月份的版本1.7.2&#xff0c;电脑vscode的python插件装的也是2022年4月份的某个版本&#xff0c;但插件经常自动更新&#xff0c;导致python代码无法Debug,解决办法&#xff1a; 点设置&#xff0c;搜autoUpdate, 把红色框选成无

浅析刚入门Python初学者的注意事项

文章目录 一、注意你的Python版本1.print()函数2.raw_input()与input()3.比较符号&#xff0c;使用!替换<>4.repr函数5.exec()函数 二、新手常遇到的问题1、如何写多行程序&#xff1f;2、如何执行.py文件&#xff1f;3、and&#xff0c;or&#xff0c;not4、True和False…

HTML和CSS入门学习

目录 一.HTML 二.CSS 1.CSS作用&#xff1a;美化页面 2.CSS语法 【1】CSS语法规范 【2】如何插入样式表 3.CSS选择器 4.CSS设置样式属性--设置html各种标签的属性 【1】文本属性--设置整段文字的样式 【2】字体属性--设置单个字的样式 【3】链接属性--设置链接的样式…