Python数据结构与算法(二十、AVL树与二分搜索树的性能对比)

保证一周更两篇吧,以此来督促自己好好的学习!代码的很多地方我都给予了详细的解释,帮助理解。好了,干就完了~加油!
声明:本python数据结构与算法是imooc上liuyubobobo老师java数据结构的python改写,并添加了一些自己的理解和新的东西,liuyubobobo老师真的是一位很棒的老师!超级喜欢他~
如有错误,还请小伙伴们不吝指出,一起学习~

一、测试代码的实现

  • 上期我们学习了带自平衡机制的AVL树,那么它到底快比普通的二分搜索树快多少呢?让我们来看一下测试代码吧。
# -*- coding: utf-8 -*-
# Author:           Annihilation7
# Data:             2019-02-17  00:07 am
# Python version:   3.6

from binarysearchTree import bst
from avl import avl_tree

import time
import numpy as np
import random  
import copy


class Test_factory:
    def __init__(self, data_nums):
        self.data_nums = data_nums  # 数据容量
        # self.data1 = [np.random.randint(200000) for i in range(self.data_nums)]
        self.data1 = [i for i in range(self.data_nums)]  # 直接让不带自平衡机制的二分搜索树的性能退化成O(n)的时间复杂度!
        self.data2 = copy.deepcopy(self.data1) # 深拷贝data1
        self.data3 = copy.deepcopy(self.data1)
        random.shuffle(self.data2)  # 打乱data2
        random.shuffle(self.data3)

    def __call__(self, bst_object):
        start_time = time.time()
        for val in self.data1:
            bst_object.add(val)  # data_nums次add操作
        for val in self.data2:
            bst_object.contains(val)  # data_nums次查询操作
        for val in self.data3:
            bst_object.remove(val)  # data_nums次删除操作
        end_time = time.time()
        print('{} 耗时: {}s'.format(bst_object, end_time - start_time))


if __name__ == '__main__':
    op_nums = 900 # [0, 899]
    bst = bst.BST()
    avl = avl_tree.Avltree()
    test_factory = Test_factory(op_nums)
    test_factory(avl)
    test_factory(bst)

二、测试输出

AVL树 耗时: 0.05291891098022461s
二分搜索树 耗时: 0.31839799880981445s

三、总结与问题

  1. 从上面的对比测试我们看到,在数据量为900的时候,AVL树要比传统的二分搜索树块了将近6倍!如果数据量增大到一定程度的话优势将更加明显。
  2. 当我把op_nums增大到1000的时候就会报二分搜索树添加节点超过了最大递归深度的错误。。RecursionError: maximum recursion depth exceededAVL树就不会报错,我又反复检查了以前二分搜索树的代码并且也进行了debug,没发现任何问题。。所以我的测试数据量最终就定在了900。小伙伴们可以试着增加一下数据集,看包不报错。我自己也写了一个程序看了一下我电脑上的python最大递归深度,为19377,我也想不明白了为什么会报错。
  3. 当我把数据换成测试代码中的那条注释:self.data1 = [np.random.randint(200000) for i in range(self.data_nums)] 的时候,我发现avl树要比二分搜索树慢!!同样也使我非常的困扰,检查了二分搜索树的代码,avl树的代码以及测试代码的各个方面都没有发现任何问题!难道是耗费在了旋转操作的时间上?小伙伴们也可以用那条语句测试一下,也不知道是不是我的电脑问题。。- - 难受啊啊啊啊~~~/(ㄒoㄒ)/

若有还可以改进、优化的地方,还请小伙伴们批评指正

你可能感兴趣的:(python数据结构与算法,Python数据结构与算法)