treap其实就是一颗二叉搜索树和堆性质的一颗二叉树。而我要讲的这个是不旋转的treap,它有key值和fix值两个值,我们要满足二叉搜索树的性质以中序遍历来按照key值排序,fix值是为了让树的高度满足期望,一个点的fix值比他的儿子都小(或者大),因此fix值应用一个随机函数刷。不旋转treap支持以下操作。

    1.Merge【合并】【O(logn)】2.Split【拆分】【O(logn)】3.Newnode【新建节点】【O(1)】

可支持操作:

    1.Insert【Newnode+Merge】【O(logn)】2.Delete【Split+Split+Merge】【O(logn)】3.Find_kth【Split+Split】【O(logn)】4.Query【Split+Split】【O(logn)】5.Cover【Split+Split+Merge】【O(logn)】

那么我先说Merge,我们首先要保证fix,那么接下来我们要保证key值我们保证要合并的俩棵树前面的一颗树比后面的树的所有点的key值都小,那么如果后面的树的当前节点的fix更小,我们就把前面的树的当前节点放在左儿子,如果大就反过来。下面是代码。

int Merge(int x,int y)
{if(!x||!y) return x+y;if(tree[x].fix<tree[y].fix){tree[x].ch[1]=Merge(tree[x].ch[1],y);Update(x);return x;}else{tree[y].ch[0]=Merge(x,tree[y].ch[0]);Update(y);return y;}
}

那个Update是用来更新儿子个数的,后面要用。

void Update(int cur)
{tree[cur].sz=1+tree[tree[cur].ch[0]].sz+tree[tree[cur].ch[1]].sz;
}

然后是Split,我们要把一颗树按照key值分成大于key的树和小于key的两棵树,这个就直接分了吧。。。见代码。

void Split(int now,int k,int &x,int &y)
{if(now==0)x=y=0;else{if(tree[now].key<=k){x=now;Split(tree[now].ch[1],k,tree[now].ch[1],y);}else{y=now;Split(tree[now].ch[0],k,x,tree[now].ch[0]);}Update(now);}
}

最后我们总要新建节点吧,那么就直接新建了吧。

int NewNode(int val)
{ncnt++;tree[ncnt].ch[0]=tree[ncnt].ch[1]=0;tree[ncnt].key=val;tree[ncnt].fix=rand();tree[ncnt].sz=1;return ncnt;
}

我们有了上面的操作之后就可以进行强大的操作了,比如insert我们首先把要插入的节点的val值作为key值把原来的树分开然后再新建节点,把节点合并放入较小的树再合并就像这样。

void insert(int val)
{int x,y,z;Split(root,val,x,y);z=NewNode(val);root=Merge(Merge(x,z),y);
}

【数据结构】【范浩强treap】相关推荐

  1. 谭浩强《C++程序设计》学习

    谭浩强<C++程序设计>学习 zdh1995 2017-10-12 15:54:56  5613  收藏 251 文章标签: c++ 版权 C++ 不要把面向对象和基于过程对立起来,面向对 ...

  2. c++程序设计梳理(谭浩强)3-4章

    为什么80%的码农都做不了架构师?>>>    同学拿了58的offer,22万一年,内心多少有点不是滋味.自己享受着这么丁点的中兴薪酬,明显是学业不精的那一类.事实确实如此,可当现 ...

  3. 谭浩强C程序设计第四版答案

    只给出一些需要编程的答案,用的是谭浩强老师的书: 本文持续更新中- C程序设计课本中的一些笔记见:C程序设计笔记 我的目录 只给出一些需要编程的答案,用的是谭浩强老师的书: 本文持续更新中... C程 ...

  4. 谭浩强c语言入门_计算机学生为什么学不会C语言?看到这4点原因,学生表示太真实...

    C语言是理工科(特别是计算机专业)的必修课之一,是计算机应用的基本技能,本来是一门简单的课程,在程序员眼里算是"体力活",不需要太多智力.但是,看似这样一门简单课程,计算机专业学生 ...

  5. c语言谭浩强ppt课件,编程_C语言学习课件_谭浩强_PPT~1216F.ppt

    编程_C语言学习课件_谭浩强_PPT~1216F.ppt ,第一章,C语言概述本章要点,C语言的特点 C程序的结构 在计算机上运行C程序的方法主要内容,1.1 语言出现的历史背景 1.2 程序的特点 ...

  6. DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总

    DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...

  7. C程序设计(谭浩强第五版)总结

    C程序设计(谭浩强第五版)总结 本篇文章主要是总结谭浩强第五版C语言书上的重点和易漏点的知识点,其目的主要是给高校期末考试的同学们点参考.本文所参考的书籍是谭浩强的<C程序设计(第五版)> ...

  8. 谭浩强C语言程序设计(1-3章代码学习)

    谭浩强C语言程序设计 参考书 C语言学习笔记记录,学习为主,新手小白入门 我所用的C语言在线编译器:lightly在线编译工具 可新建工程 谭浩强C语言程序设计书籍所包含的代码示例加注释说明如下: / ...

  9. 谭浩强版c语言笔记(1)

    第1章 程序设计和c语言 1)机器指令:计算机能够识别和接受的二进制代码 2)机器语言:机器指令的集合 3)计算机程序:控制计算机操作的指令 第2章 一个程序主要包含两方面信息:对数据的描述(数据结构 ...

  10. 为什么很多人吐槽谭浩强的C语言程序设计,端碗吃饭放碗骂娘?

    这个观点在网络上已经论战了很长时间,出现这种情况还是历史遗留问题,谭浩强出的C语言教材几乎是国内的第一版,由于中英翻译问题或者对编程文化理解的差异性导致出来的书多多少少存在一些纰漏.不能只是记住其缺点 ...

最新文章

  1. Java并发编程之——BlockingQueue(队列)
  2. 计算机视觉领域还有那些坑,深度学习/计算机视觉常见的8个错误总结及避坑指南...
  3. 常用数据库连接串与驱动总结
  4. LeetCode 1717. 删除子字符串的最大得分
  5. 无盘服务器 机械盘,Win7启动速度研究,同样的PC配置,机械盘、固态盘、无盘网络启动速度为何不同?...
  6. caffe官网的部分翻译及NG的教程
  7. 线性基的一些基础模版
  8. .plist 中各个key的含义
  9. 复制百度文库内容chrome插件
  10. Cocos2d-x游戏引擎实战开发炸弹超人项目教程 全套下载 1至6课
  11. 宾得常用镜头群[转自东河寒梅]_我是亲民_新浪博客
  12. ISO/IEC 27018公有云中个人身份信息管理体系认证概述
  13. YouTorrent - 全新的“实时”BT种子搜索站
  14. 竹云+巨杉丨互信认证 安全可靠
  15. C语言 一行一行读取文件txt
  16. 网页服务器修复,网页被劫持 网页被劫持后跳转发布网修复方法
  17. CityMaker学习教程02 软件的授权
  18. Mineflayer简介——Minecraft机器人
  19. ClickHouse vs Elasticsearch谁更胜一筹?
  20. 工具软件价值分化,Adobe、万兴科技、猎豹移动们为何不同命?

热门文章

  1. word论文排版和写作05:从word中导出pdf
  2. 如何处理计算机显卡故障,显卡出现故障怎么办
  3. 耗时86小时的「百变小樱」最强数据可视化作品!
  4. mysql instead of触发_在视图上使用 INSTEAD OF 触发器
  5. android工程模式的指令,华为手机怎么进入工程模式 华为进工程模式指令
  6. NOI2022退役记
  7. win10专业版激活后变成教育版的解决方法(亲测有效)
  8. 企业微信发消息通知-java
  9. 荣之学:关于跨境电商shopee平台,你了解多少?
  10. 2021年全国大学生电子设计竞赛官方通知正式发布