紅黑樹的刪除壓力測試和完整性檢查

  以前的文章寫了紅黑樹的實現,由於本身實現了插入和刪除的算法。爲了測試算法的性能,以及算法的正確性,又寫了幾個函數,用來檢查一棵樹是不是紅黑樹,並進行壓力測試,代碼以下:linux

 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 }
相關文章
相關標籤/搜索