本文作者为 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的原创】平衡树性能测试的更多相关文章

  1. [原创]App性能测试指标篇

    [原创]App性能测试指标篇 目前由于苹果,三星等大厂对智能手机的研发及投入,使的智能手机发展非常迅速,每个人手中都有一些离不开生活的App,如:微信,微博,百度或是各游戏App等,但是到底App性能 ...

  2. 【GXZ的原创】C++小游戏——五子棋

    前些时候考完试自己编的带有胜负判定的五子棋. 操作方法:WSAD或↑↓←→移动下棋位置,Space或Enter放置. 如果游戏出现bug,欢迎大家在评论区反馈. #include <stdio. ...

  3. (原创)性能测试中,Oracle服务器定位CPU使用率高的瓶颈(SQL)

    本篇博客记录一次性能测试过程中,定位对CPU使用率高的瓶颈问题,主要定位SQL为准 一.用SQL命令定位1.首先用TOP命令监控系统资源,如果是AIX系统,就用topas,进入TOP命令的滚动刷新数据 ...

  4. (原创)如何在性能测试中自动生成并获取Oracle AWR报告

    版权声明:本文为原创文章,转载请先联系并标明出处 由于日常使用最多的数据库为Oracle,因此,最近又打起了Oracle的AWR报告的主意. 过去我们执行测试,都是执行开始和结束分别手动建立一个快照, ...

  5. [原创] 上海招聘高级测试工程师(性能测试/自动化测试/App测试),长期有效

    [原创] 上海招聘高级测试工程师(性能测试/自动化测试/App测试方向),长期有效 高级测试工程师(性能/自动化方向) 1.负责性能测试计划,性能需求分析,性能测试方案和用例设计,搭建性能测试环境,执 ...

  6. [原创]H5前端性能测试工具介绍

    [原创H5前端性能测试工具介绍 一 网络抓包工具 网络抓包工具选择原则,可以捕获网络请求,抓取具体请求信息流,同时可以针对网络请包进行修改或拦截: 1.Fiddler(推荐) 2.Charles(推荐 ...

  7. [原创]浅谈H5页面性能测试

    [原创]浅谈H5页面性能测试 H5页面我想各位都不陌生,随着移动互联网兴起,不管是App,还是H5都火起来了,最突出的2个表现是ios/android/前端等工程师薪水大涨,尤其是资深前端工程师40W ...

  8. [原创]Linux下网络性能测试Netperf工具介绍及安装

    [原创]Linux下网络性能测试Netperf工具介绍及安装 1 官方网站 http://www.netperf.org/netperf/ 2 Netperf介绍 Netperf是一种网络性能的测试工 ...

  9. [原创]使用benchmarksql和pgbench对PostgreSQL Plus Advanced Server进行性能测试

    一.测试环境 benchmarksql version:4.0.8 rhel 6.3 vmware esxi 二.理解benchmarksql性能测试原理TPC-C 1.理解TPC-C TPC-C模拟 ...

随机推荐

  1. 刚学不久的python,自己稍微加工了一点,影响不大,因为博主很懒,所以格式什么的,就没有太在意了!

    本人初学python,之前因为有接触过其他语言,但是并没有接触的太深,出于对一个hacker的向往,学习一下Linux和python再说,当然,也是为了高工资啦,啊哈哈哈! 一开始就是一个蛮有意思的小 ...

  2. HDU.2561 第二小整数(water)

    题目来源:2561 题意分析:找出一堆数中第二小的整数,和题目说的一样 我的思路:冒泡或者sort()一下就ok了,但是我因为没看到多个测试用例还是吃了几记WA . ┭┮﹏┭┮ 完整代码: #incl ...

  3. Wordpress网站中添加百度统计代码

    百度统计是流量分析平台,帮助收集网站访问数据,提供流量趋势.来源分析.转化跟踪.页面热力图.访问流等多种统计分析服务,同时与百度搜索.百度推广.云服务无缝结合,为网站的精细化运营决策提供数据支持,进而 ...

  4. linux特殊权限位suid

    特殊权限位基本说明(了解): linux系统基本权限位为9位权限,但还有额外3位权限位,共12位权限: suid       s(x)     S     4     用户对应的权限位(用户对应的3位 ...

  5. PLC状态机编程第五篇-状态机自动生成PLC程序

    这篇比较简单了,我就直接上图了,不多废话. 一.选择求解器,一定要选择定步长的. 二.右击Chart状态机,出现图上菜单 三.左边红色的勾选择,选择右侧的菜单,然后点击Generate Code按钮, ...

  6. Linux平台下安装MySQL

    1.下载RPM包 http://dev.mysql.com/downloads/mysql/5.5.html#downloads 选择[Red Hat & Oracle Enterprise ...

  7. Aizu:0009- Prime Number

    Prime Number Time limit 1000 ms Memory limit 131072 kB Problem Description Write a program which rea ...

  8. Android 布局错乱 Android花屏

    最近做项目,妈的,有个一个很难受的bug. 这个bug ,自己这里没有手机,没有办法复现,找到了手机之后.解决了. 我先给大家看下什么叫布局错乱,花屏: 来张正常的图片: 正常情况下是这样的.然后, ...

  9. Win7更换锁屏和开机画面

    技术交流群:233513714 每次开机被Windows千年不变的开机画面和锁屏画面丑到的小伙伴们可以看过来,通过简单的几步就可以改掉系统默认的开机画面. 1.首先Windows+r键输入regedi ...

  10. laravel5.5事件系统

    目录 1 注册事件和监听器 2 定义事件 3 定义监听器 4 分发事件 更多使用方法 1. 可以手动注册事件 2. 事件监听器中调用队列 3.事件订阅者 1 注册事件和监听器 1.修改EventSer ...