zoukankan      html  css  js  c++  java
  • 红黑树的删除压力测试和完整性检查

      之前的文章写了红黑树的实现,因为自己实现了插入和删除的算法。为了测试算法的性能,以及算法的正确性,又写了几个函数,用来检查一棵树是否是红黑树,并进行压力测试,代码如下:

     1 import 'dart:math';
     2 import 'package:data_struct/tree/tree.dart';
     3 
     4 void run() {
     5   var size = 100000, loops = 1024;
     6   check(size, loops);
     7   stress(size);
     8 }
     9 
    10 void check(int size, int loops) {
    11   var rd = Random();
    12   for (var i = 0; i < loops; i++) {
    13     print('the $i times check...');
    14 
    15     var arr = List.generate(size, (_) => rd.nextDouble() * size);
    16     var tree = RBTree.from(arr);
    17     var bh = _checkIsRBTree(tree);
    18     print('black height: $bh
    
    ');
    19 
    20     for (var d in arr) {
    21       tree.delete(d);
    22       _checkIsRBTree(tree);
    23     }
    24 
    25     tree = RBTree.from(arr);
    26     for (var d in arr) {
    27       tree.quickDelete(d);
    28       _checkIsRBTree(tree);
    29     }
    30   }
    31 }
    32 
    33 void stress(int size) {
    34   var rd = Random();
    35   var arr = List.generate(size, (_) => rd.nextDouble() * size);
    36 
    37   var tree = RBTree.from(arr);
    38   var st = DateTime.now();
    39   for (var d in arr) tree.delete(d);
    40   var ft = DateTime.now();
    41   print('my delete implement cost:	${ft.difference(st)}');
    42 
    43   tree = RBTree.from(arr);
    44   st = DateTime.now();
    45   for (var d in arr) tree.quickDelete(d);
    46   ft = DateTime.now();
    47   print('    linux implement cost:	${ft.difference(st)}');
    48 }
    49 
    50 void traverse(RBTNode r, void func(RBTNode r)) {
    51   if (r != null) {
    52     traverse(r.left, func);
    53     func(r);
    54     traverse(r.right, func);
    55   }
    56 }
    57 
    58 int _checkIsRBTree(RBTree t) {
    59   assert(t.isEmpty || (!t.isEmpty && t.root.isBlack));
    60   return _goThrough(t.root);
    61 }
    62 
    63 int _goThrough(RBTNode r) {
    64   if (r == null) return 0;
    65   assert(r.isBlack || (r.isRed && r.parent.isBlack));
    66   var lbh = _goThrough(r.left);
    67   var rbh = _goThrough(r.right);
    68   assert(lbh == rbh);
    69   return lbh + (r.isRed ? 0 : 1);
    70 }
  • 相关阅读:
    java时间戳转换日期 和 日期转换时间戳
    通过blob文件导出下载成Excel文件
    三元表达式进化
    Vue切换组件实现返回后不重置数据,保留历史设置操作
    vue 下载文件
    ide打断点,跑到某一行代码,再执行的方法
    Java操作终端的方法
    前端下载本地文件的方法
    java 读取本地json文件
    js 时间戳转换
  • 原文地址:https://www.cnblogs.com/outerspace/p/10629158.html
Copyright © 2011-2022 走看看