1. 测试环境
测试电脑为:surface book 1代
配置名称 | 详情 |
---|---|
CPU | Intel Core i7-6600U(2.6GHz/L3 4M) |
内存容量 | 8GB |
显卡 | NVIDIA GeForce GTX 965M |
2. 测试方法
我们用之前实现的BST和红黑树进行两类测试:
- 最坏情况测试:连续插入严格大于前一个键的键
- 随机测试:生成不重复的随机键插入
测试的API有:put(), deleteMin(), deleteMin(), delete()
测试方式:统计开始执行需测试方法,到结束所用的时间,比如put():
public static long measurePuttingRunningTime( Tree tree ) {
long startTime = System.currentTimeMillis();
for ( int i = 0; i < dataScale; i++ ) {
switch ( tree ) {
case BST -> BST.put( i, i );
case RBTREE -> RBTree.put( i, i );
}
}
long endTime = System.currentTimeMillis();
return endTime - startTime;
}
我们将计算这段代码的耗时情况来评估性能结果:
for ( int i = 0; i < dataScale; i++ ) {
switch ( tree ) {
case BST -> BST.put( i, i );
case RBTREE -> RBTree.put( i, i );
}
}
3. 测试结果
我们以 dataScale = 10000000,一千万的数据规模,结果:
/*
* Worst case:
* BST running time exceeded 36 mins
* put(): / <-> 6176
* deleteMax(): / <-> 0
* deleteMin(): / <-> 0
* delete(): / <-> 195
*
* Randomly test:
* put(): 26535 <-> 23309
* deleteMax(): 1647 <-> 0
* deleteMin(): 1419 <-> 0
* delete(): 34419 <-> 143
* */
dataScale = 10000000;
测试插入,BST在最坏情况下,在笔者的电脑上面已经爆炸了,跑了36mins都没有结束,基本GG,红黑树put()则用了 6176ms, delete()用了195ms。如果将36mins换算成ms = 2160000ms,红黑树是千毫秒级别,而BST跑了2百万毫秒,依然没有结束。
在随机测试下,两者的耗时基本相同,BST为26535,红黑树为23309。这和之前红黑树性能分析里面展示的一样,BST大概为1.39lgN,而红黑树为1.00lgN,总的来说红黑树要快一些。随机插入随机删除的话,笔者的测试结果是红黑树要快很多。
至于deleteMax()和deleteMin(),感觉有点不对,红黑树再怎么快也不可能耗时为0,但是检查代码也没有发现什么问题。有一种可能就是红黑树每次deleteMax()和deleteMin()都非常快,快到每次操作都小于毫秒级别,那么就没办法进行测量了。如果有童鞋发现了原因,可以告诉我哒,谢谢啦~
最后把之前的性能分析图再贴一下,大家可以再对比对比:
至此,红黑树的所有讲解都已经结束啦,辛苦大家啦,能看到这里。笔者继续研究算计几何去了,下次开坑计划:Java基础 -> 数据结构 -> 算法导论 -> 计算几何,不知道多久开坑啦,咕咕咕~
上一节:红黑树(七):删除和性能分析
系列汇总:超详细!红黑树详解文章汇总(含代码)
4. 特别感谢
- 感谢 @SENNICHEN 制作系列文章封面图
5. 免责声明
※ 本文之中如有错误和不准确的地方,欢迎大家指正哒~
※ 此项目仅用于学习交流,请不要用于任何形式的商用用途,谢谢呢;