《平衡树》读后感

news/2024/12/18 22:03:46/文章来源:https://www.cnblogs.com/lewisak/p/18615931

第一框,世界属于fhq-treap

是什么?

你说的对,但是《fhq-treap》是由范浩强自主研发的一款全新树形数据结构。数据结构发生在一个被称作「二叉搜索树」的幻想世界,在这里,被人创造的节点将被授予「随机优先级」,导引期望 \(O(\log n)\) 之力。treap 将扮演一位名为「根据优先级建最小堆,根据权值建搜索树」的神秘角色,在自由的调试中邂逅性格各异、能力独特的同伴们——「分裂、合并、插训排名、查询 k 小值、插入、删除、查询前驱\后继」,和他们一起击败难题,找回出题人的亲人——同时,逐步发掘「大常数」的真相。

怎么做?

$$新建节点与基本定义$$

每一个点有以下几个变量:

struct zxc{int siz;//子树大小int son[2];//son[0]表示左儿子、son[1]表示右儿子int v;//权值int pri;//随机赋予的优先级
}tr[100100];

除此以外,我们还需要 root 表示根(初始为0) 和 tot 表示节点数(初始为0)

treap 的复杂度保障建立于随机优先级,简单来说,当 a 点的优先级小于 b 点的优先级时,a 就是 b 的儿子,不过现在用不着。

新建一个权值为 v 的节点代码如下:

int nw(int v){siz(++tot)=1;v(tot)=v;pri(tot)=rand();return tot;
}

顺便处理一下上传 siz 的函数:

void up(int x){siz(x)=1+siz(ls(x))+siz(rs(x));return;
}

$$合并$$

合并要实现的功能非常好理解,就是把两个节点的子树用神奇强力胶粘到一起。

但是如果你要自己处理这个过程,就会遇到些麻烦,如图所示:

所以我们利用一个递归来帮助实现过程,这样只用把程序丢到一边,让它自己分讨就可以了

int merge(int x,int y){if(!x||!y){//若递归出界了、就直接返回另一个return x+y;//因为有一个是0,所以可以偷一下懒,x+y就是非零的那一个}if(pri(x)<pri(y)){//y要成为x的儿子rs(x)=merge(rs(x),y);//这里的rs和ls都可以,但这是一个习惯,实际上因为需要将merge和split的处理统一化、就一般(至少对我来说)把y放到x的右儿子up(x);//上传sizreturn x;}else{//以下同理ls(y)=merge(x,ls(y));up(y);return y;}
}

$$分裂$$

比较简单,只需要找到需要割的位置,然后割开就可以了(这好像是废话)

分为按权值割和按子树大小割。

按权值割:

void split(int now,int v,int &x,int &y){if(!now){x=y=0;//砍下去!return;}if(v(now)<=v){//若当前的权值小就往右走x=now;//这里和merge同理,实际上x或y都可以split(rs(now),v,rs(now),y);}else{y=now;split(ls(now),v,x,ls(now));}up(now);return;
}

按子树大小割:

void split(int now,int v,int &x,int &y){if(!now){x=y=0;//砍下去!return;}if(siz(ls(now))>=v){//若这个点和左子树的总和太大就往左走y=now;//这里和merge同理,实际上x或y都可以split(ls(now),v,x,ls(now));}else{x=now;split(rs(now),v-siz(ls(now))-1,rs(now),y);}up(now);return;
}

为什么?

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

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

相关文章

虚拟机unraid系统安装

首先下载unraid文件https://unraid.net/getting-started windows系统使用vmware虚拟机 创建虚拟机过程中注意usb的不同协议 2.0 3.0 由于unraid系统只能识别fat32协议的文件系统,因此需要将u盘格式化 可以使用easeus 或者 傲梅 https://www.easeus.com/partition-manager/ htt…

基于.NET WinForm开发的一款硬件及协议通讯工具

前言 今天大姚给大家分享一款基于.NET WinForm开发的一款硬件及协议通讯工具:PLC-CommunTools。 项目介绍 PLC-CommunTools是一款基于.NET WinForm开发的一款硬件及协议通讯工具,包含各类厂商的PLC协议及基础的TCP、串口通讯、IO口通讯等协议通讯功能的实现整合,注意还有一部…

游戏过程

根据是否结束游戏的逻辑选择对掷骰子的过程用bool申明变量掷骰子 static bool RollDice (w,h,ref Player p1,ref Player p2,Map map) {InfoClear(h);Console.ForegroundColor=p1.type==E_PlayerType.Player?ConsoleColor.Cyan:ConsoleColor.Meganta;if(p1.isPause){p1.isPause…

6.Group组件

关于Group组件的简单介绍首先,Group组件本身并不是一个“布局”类的组件,它只是一个容器,没有提供调整内部组件展示位置的方法,也就是说,当我们将多个组件(比如button)放在group中时,他们(根据流式规则?)会全部挤在窗口的左上角,当然,如果我们没有设置组件的大小的话…

直播预告:OpenAI 开始拥抱 RTC!为什么 LLM+RTC 才是多模态 AI 的未来?丨RTE Dev Talk

如果您正在开发具备语音对话、视觉理解等多模态能力的 AI Agent,请加入我们的直播讨论!OpenAI 今日发布了 OpenAI Realtime API 的重大更新,其中包括价格下调、新增模型以及一项尤为重要的改进: WebRTC 支持 。结合此前 WebRTC 创建者加入 OpenAI 的消息,这清晰地表明 Ope…

实验6 模板类、文件I/O与异常处理

实验四 vector.hpp#pragma once#include<iostream>#include<stdexcept>using namespace std;template<typename T>class Vector {private:int size;T* ptr;public:Vector(int size, int value = 0) :size{ size } {if (size < 0) {throw length_error(&qu…

把半年前完全没思路的题解了的感觉真好

虽然处理了很多次索引思路,不过最后还是过了。第一眼就有解题思路,这种感觉真不错,要的就是这种打怪升级的正反馈。 附上解题代码 `# @lc app=leetcode.cn id=2266 lang=python3[2266] 统计打字方案数@lc code=start from collections import Counter from functools import…

【Windows安全】13种回调函数执行ShellCode

#windows #回调函数 回调机制 在我们使用回调函数执行Shellcode之前,我们首先需要去了解Windows回调机制,Windows回调机制就像你和你的助手一样,比如说每一个律师所中的每一个律师都有一个实习助手,律师需要助手在特定的情况下去处理一些特殊的任务,但这些任务并不是日常…

MaLoader:一款基于Tauri+Rust的免杀马生成工具

免责声明 本公众号“黑客之道HackerWay”提供的资源仅供学习,利⽤本公众号“黑客之道HackerWay”所提供的信息而造成的任何直接或者间接的后果及损失,均由使⽤者本⼈负责,本公众号“黑客之道HackerWay”及作者不为此承担任何责任,一旦造成后果请自行承担责任!简介 MaLoade…

Element Plus组件库el-select组件多选回显踩坑

前情公司有经常需要做一些后台管理页面,我们选择了Element Plus,它是基于 Vue 3,面向设计师和开发者的组件库,是Vue框架生态中比较火的UI组件库,组件库丰富易用,组件链接:一个 Vue 3 UI 框架 | Element Plus,项目中经常会用到el-select多选功能,组件自带的多选交互也是…

Transformers 框架 Pipeline 任务详解(四):问答(question-answering)

本文深入介绍了 Transformers 框架中的 question-answering 任务,涵盖任务简介、应用场景如智能助手和客户服务、任务配置与模型选择、实战代码示例,以及如何利用 Gradio 创建 WebUI 界面,使用户能通过浏览器实时获取问答结果。文章旨在帮助读者快速掌握使用 Transformers 构…

docker高级篇(大厂进阶):安装mysql主从复制

docker高级篇(大厂进阶):安装mysql主从复制@目录1.Docker复杂安装详说1.1安装mysql主从复制本人其他相关文章链接 1.Docker复杂安装详说 1.1安装mysql主从复制主从搭建步骤: 1)新建主服务器容器实例3307 2)进入/mydata/mysql-master/conf目录下新建my.cnf 3)修改完配置后…