【GXZ的原创】平衡树性能测试
本文作者为 GXZlegend ,转载请注明 出处 ,谢谢!
〇、序言
前些日子闲的蛋疼做了个平衡树性能测试。。。
主要是因为学会的平衡树越来越多,做题时却不知道写哪个。。。
本想结合效率和代码复杂度来决定通常情况下写哪个,
然而在网上没有查到有关平衡树性能的相关信息(也许是我查的姿势不太对吧。。。)
于是最终决定自己动手测试,造福自己和他人,毕竟时间是检验真理的唯一标准嘛。。。
废话不多说,直接开始~
一、测试成员(按字典序从小到大排序)
Multiset
SBT
Splay
Treap
替罪羊树
权值线段树+动态开点
权值线段树+离线离散化
非旋转Treap
另外为了卖萌还加入了BST(逃
二、测试题目
支持$10^6$次插入一个$[-10^7,10^7]$范围内的数、删除一个当前序列中的数。
这里之所以没有选择各种各样的查询操作,是因为平衡树的瓶颈不在于一般BST的查询操作。只有插入和删除才能体现出平衡树的效率。
三、测试数据
共放了12组测试数据。
其中1、2号数据是随机数据(1号只有插入,2号在插入后删除掉);
3~8号数据是按某一特定顺序将1~n(或n/2)这些数插入(并删除);
9号数据是插入1~n/2后不断插入并删除$10^7$&$-10^7$;
10、11号数据是插入1、-1、2、-2…和n/2、-n/2、n/2-1、-(n/2-1)…;
12号数据是插入n个1。
具体的数据可以在下面的测试包中查看。
四、测试结果
测试环境为GXZ的电脑
使用Win10系统,g++4.8.4,并在Lemon下进行评测。评测结果如下:
注:总时间不具有非常大的参考价值!
注:总时间不具有非常大的参考价值!
注:总时间不具有非常大的参考价值!
开O2:
不开O2:
五、具体描述与分析(顺序为不开O2总时间倒序)
1.非旋转Treap真心慢。。。而且最慢的是随机数据1、2号点,其中只有插入的1号点更慢一些。与其功能相似的Splay比其发挥更好一些。构造数据的效率还好(其中11号点稍微慢一些)。非常吃数据。
2.替罪羊树作为倒数第二可能不服,不过事实上替罪羊树在随机数据上表现良好,而在构造数据上表现得稍微差一些。总体上不是很吃数据。
3.权值线段树+离散化在不开O2情况下很慢,但是开O2情况下效率仅次于权值线段树+动态开点。因此其效率取决于排序的复杂度,不吃数据。
4.Multiset效率和想象中一样,开O2时飞起,不开O2时奇慢。。。(想到我的NoiD1T2,哈希非要多个map,白白挂了40' QAQ)不吃数据。
5.Splay在随机数据上效率极低(仅略优于非旋转Treap),而在构造数据上跑得飞快。具体原因是在插入时把插入的数旋转了上去,使得下次插入复杂度变为近似$O(1)$。非常吃数据。
6.Treap在随机数据上较慢,其余效率较高。吃数据。(另外一个小插曲,在Linux下Treap非常快,效率接近于权值线段树+动态开点,猜想可能与随机数的范围有关。然而我在Windows下改用了rand()*rand()却发现更慢了。。。)
7.SBT随机数据比Treap略快,构造数据比Treap略慢。。。略吃数据。
8.权值线段树+动态开点是最快的“平衡树”,所有数据都较快,略吃数据。
9.BST不解释,随随便便即可卡掉。
六、对比总结
对于任何情况,权值线段树都是最快的,并且也是最好写的。它的唯二缺点:不支持定点插入、空间消耗较大(作为树套树内层时多1个log)。但是它的高效以及支持多棵同时二分,使得它的用途非常之广泛,大多数情况可以代替Treap和SBT。
SBT和Treap的效率不会差很多,因此不必纠结于学哪种,掌握较简单的就行(个人倾向于SBT一些)
在不开O2情况下少用set,开O2时可以大胆使用。
尽量不直接使用替罪羊树,个人建议替罪羊树的唯一使用情况就是放到树套树的外层(无旋转避免了pushup)
Splay不要用于维护全序集,最好用于维护有序序列,效果较好。
非旋转Treap效率真的不如Splay,唯一好处就是时间复杂度非均摊,可以可持久化
七、测试包下载
https://pan.baidu.com/s/1geQGMEf
希望大家再写平衡树时就有一个参考辣~
【GXZ的原创】平衡树性能测试的更多相关文章
- [原创]App性能测试指标篇
[原创]App性能测试指标篇 目前由于苹果,三星等大厂对智能手机的研发及投入,使的智能手机发展非常迅速,每个人手中都有一些离不开生活的App,如:微信,微博,百度或是各游戏App等,但是到底App性能 ...
- 【GXZ的原创】C++小游戏——五子棋
前些时候考完试自己编的带有胜负判定的五子棋. 操作方法:WSAD或↑↓←→移动下棋位置,Space或Enter放置. 如果游戏出现bug,欢迎大家在评论区反馈. #include <stdio. ...
- (原创)性能测试中,Oracle服务器定位CPU使用率高的瓶颈(SQL)
本篇博客记录一次性能测试过程中,定位对CPU使用率高的瓶颈问题,主要定位SQL为准 一.用SQL命令定位1.首先用TOP命令监控系统资源,如果是AIX系统,就用topas,进入TOP命令的滚动刷新数据 ...
- (原创)如何在性能测试中自动生成并获取Oracle AWR报告
版权声明:本文为原创文章,转载请先联系并标明出处 由于日常使用最多的数据库为Oracle,因此,最近又打起了Oracle的AWR报告的主意. 过去我们执行测试,都是执行开始和结束分别手动建立一个快照, ...
- [原创] 上海招聘高级测试工程师(性能测试/自动化测试/App测试),长期有效
[原创] 上海招聘高级测试工程师(性能测试/自动化测试/App测试方向),长期有效 高级测试工程师(性能/自动化方向) 1.负责性能测试计划,性能需求分析,性能测试方案和用例设计,搭建性能测试环境,执 ...
- [原创]H5前端性能测试工具介绍
[原创H5前端性能测试工具介绍 一 网络抓包工具 网络抓包工具选择原则,可以捕获网络请求,抓取具体请求信息流,同时可以针对网络请包进行修改或拦截: 1.Fiddler(推荐) 2.Charles(推荐 ...
- [原创]浅谈H5页面性能测试
[原创]浅谈H5页面性能测试 H5页面我想各位都不陌生,随着移动互联网兴起,不管是App,还是H5都火起来了,最突出的2个表现是ios/android/前端等工程师薪水大涨,尤其是资深前端工程师40W ...
- [原创]Linux下网络性能测试Netperf工具介绍及安装
[原创]Linux下网络性能测试Netperf工具介绍及安装 1 官方网站 http://www.netperf.org/netperf/ 2 Netperf介绍 Netperf是一种网络性能的测试工 ...
- [原创]使用benchmarksql和pgbench对PostgreSQL Plus Advanced Server进行性能测试
一.测试环境 benchmarksql version:4.0.8 rhel 6.3 vmware esxi 二.理解benchmarksql性能测试原理TPC-C 1.理解TPC-C TPC-C模拟 ...
随机推荐
- AMD、CMD、CommonJs和ES6对比
一.AMD(异步模块定义) AMD(异步模块定义)是RequireJS在推广过程中对模块定义的规范化产出.AMD是一个概念,RequireJs是对这个概念的实现.比如javascript语言是对ECM ...
- Map详解
https://mp.weixin.qq.com/s/s4KLQyE5bY833kGzWl3vsg
- FAT32中文版分析+补充(2)
从Offset 36(0x24)开始FAT12/16的内容开始区别于FAT32,现在分两个表格列出来,下表为FAT12/16的内容: 名称 Offset(Byte) 大小(Byte) 描述 BS_dr ...
- CMD批处理复制目录下所有文件
从我接触编程时,WIN7已经是最普及的系统了. 有一天,我需要在服务器更新某个软件或游戏的时候,我都需要先在其中一台服务器下载更新, 然后同步到其他服务器,而且这种操作也是非常频繁的,我就想写个批处理 ...
- BZOJ4128: Matrix(BSGS 矩阵乘法)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 813 Solved: 442[Submit][Status][Discuss] Descriptio ...
- Mybatis-数据插入
传统jdbc数据插入 1.在Java代码for循环插入 executeUpdate() 2.批处理方法addBatch(Statement.Prestatement) addBatch() execu ...
- python导包语句执行
今天在做项目中遇到一个问题,在first_page中引用login的登录方法,第一次执行登录可以正常登录,登录成功后,再选择返回主菜单,回到上个页面,再选择登录时报错“login_class isno ...
- datatable设置动态宽度,超过一定长度出现滚动条
获得宽度:var tableAutoWidth = $('.dataTable_wrapper').width();if (tableAutoWidth < 1200) { tableAutoW ...
- 数据分析处理库Pandas——对象操作
Series结构 索引 修改 旧数据赋值给新数据,旧数据不变. 对某一数值进行修改,可以选择保留修改前或修改后的数值. 替换索引 修改某一个索引 添加 在数据1后添加数据2,数据1不改变. 添加一个数 ...
- Makefile (3) 基本语法和使用
make是用来管理一个工程项目的工具 . Makefile就是这个项目文件 . 1.Makefile 是由若干条规则组成的,每个规则的语法如下所示 : #规则 targets: prerequisit ...