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

 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\n\r'); 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:\t${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:\t${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 }

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄