终章:二叉查找树和红黑树的性能比较

1. 测试环境

测试电脑为:surface book 1代

配置名称详情
CPUIntel Core i7-6600U(2.6GHz/L3 4M)
内存容量8GB
显卡NVIDIA GeForce GTX 965M

2. 测试方法

我们用之前实现的BST和红黑树进行两类测试:

  1. 最坏情况测试:连续插入严格大于前一个键的键
  2. 随机测试:生成不重复的随机键插入

测试的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. 特别感谢

  1. 感谢 @SENNICHEN 制作系列文章封面图

5. 免责声明

※ 本文之中如有错误和不准确的地方,欢迎大家指正哒~
※ 此项目仅用于学习交流,请不要用于任何形式的商用用途,谢谢呢;


在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉查找树(Binary Search Tree,BST)和红黑树(Red-Black Tree)是两种常见的二叉树数据结构,它们在插入、删除和查找等操作上有一些区别。 1. 结构特点: - 二叉查找树:每个节点的左子树中的所有节点的值都小于该节点的值,右子树中的所有节点的值都大于该节点的值。 - 红黑树:除了具备二叉查找树的特点外,还满足以下红黑树性质: - 每个节点要么是红色,要么是黑色。 - 根节点是黑色。 - 每个叶子节点(NIL节点,空节点)是黑色。 - 如果一个节点是红色的,则它的两个子节点都是黑色的。 - 对于每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数目的黑色节点。 2. 平衡性: - 二叉查找树:在最坏情况下,二叉查找树可能会退化成链表,导致插入、删除和查找操作的时间复杂度为O(n)。 - 红黑树:通过保持红黑树性质,红黑树能够保持相对平衡,插入、删除和查找操作的时间复杂度为O(log n)。 3. 插入和删除操作: - 二叉查找树:插入和删除操作只需按照二叉查找树的规则进行即可,不需要进行额外的平衡操作。 - 红黑树:插入和删除操作需要通过旋转和重新着色等操作来保持红黑树的平衡性。 4. 存储空间: - 二叉查找树:每个节点只需存储键值和指向左右子节点的指针,相对较小。 - 红黑树:每个节点需要额外存储颜色信息,相对于二叉查找树会占用更多的存储空间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值