Skip to content

Commit d2b5a70

Browse files
committed
refact: extract benches & tests
1 parent 3e8d80a commit d2b5a70

File tree

7 files changed

+278
-271
lines changed

7 files changed

+278
-271
lines changed

benches/math.rs

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
use algo::math;
2+
use test::Bencher;
3+
4+
static X: f32 = 999999999.0f32;
5+
6+
#[bench]
7+
fn sqrt_std(b: &mut Bencher) {
8+
b.iter(|| X.sqrt());
9+
}
10+
11+
#[bench]
12+
fn sqrt_binary_search(b: &mut Bencher) {
13+
b.iter(|| math::mysqrt::sqrt_binary_search(X));
14+
}
15+
16+
#[bench]
17+
fn sqrt_newton(b: &mut Bencher) {
18+
b.iter(|| math::mysqrt::sqrt_newton(X));
19+
}

src/math/mysqrt.rs

-17
Original file line numberDiff line numberDiff line change
@@ -42,20 +42,3 @@ pub fn sqrt_newton(x: f32) -> f32 {
4242
last = iter_v;
4343
}
4444
}
45-
46-
static X: f32 = 999999999.0f32;
47-
48-
#[bench]
49-
fn bench_std_sqrt(b: &mut Bencher) {
50-
b.iter(|| X.sqrt());
51-
}
52-
53-
#[bench]
54-
fn bench_sqrt_binary_search(b: &mut Bencher) {
55-
b.iter(|| sqrt_binary_search(X));
56-
}
57-
58-
#[bench]
59-
fn bench_sqrt_newton(b: &mut Bencher) {
60-
b.iter(|| sqrt_newton(X));
61-
}

src/tree/binary/construct.rs

-55
Original file line numberDiff line numberDiff line change
@@ -78,58 +78,3 @@ pub fn new_tree(orig: &[&str]) -> Tree {
7878

7979
tree
8080
}
81-
82-
#[test]
83-
fn t_empty_tree() {
84-
let tree = new_tree(&[]);
85-
assert!(tree.arena.is_empty());
86-
assert!(tree.root.is_none());
87-
88-
let tree = new_tree(&["#"]);
89-
assert!(tree.arena.is_empty());
90-
assert!(tree.root.is_none());
91-
}
92-
93-
#[test]
94-
fn t_tree_topology1() {
95-
let tokens = vec!["1", "#", "2", "3"];
96-
let tree = new_tree(&tokens);
97-
let p0 = tree.root.expect("invalid p0");
98-
let p0 = tree.node_at(p0).expect("invalid p0 node");
99-
assert_eq!(p0.value, 1);
100-
assert!(p0.left.is_none());
101-
//p1: '#'
102-
let p2 = p0.right.expect("invalid p0 right");
103-
let p2 = tree.node_at(p2).expect("invalid p2 node");
104-
assert_eq!(p2.value, 2);
105-
assert!(p2.right.is_none());
106-
let p3 = p2.left.expect("invalid p2 left");
107-
let p3 = tree.node_at(p3).expect("invalid p3 node");
108-
assert_eq!(p3.value, 3);
109-
}
110-
111-
#[test]
112-
fn t_tree_topology2() {
113-
let tokens = vec!["1", "2", "#", "3", "4", "#", "#", "5"];
114-
let tree = new_tree(&tokens);
115-
let p0 = tree.root.expect("invalid p0");
116-
let p0 = tree.node_at(p0).expect("invalid p0 node");
117-
assert_eq!(p0.value, 1);
118-
assert!(p0.right.is_none());
119-
let p1 = p0.left.expect("invalid p0 left");
120-
let p1 = tree.node_at(p1).expect("invalid p1 node");
121-
assert_eq!(p1.value, 2);
122-
//p2: '#'
123-
let p3 = p1.left.expect("invalid p3");
124-
let p3 = tree.node_at(p3).expect("invalid p3 node");
125-
assert_eq!(p3.value, 3);
126-
let p4 = p1.right.expect("invalid p4");
127-
let p4 = tree.node_at(p4).expect("invalid p3 node");
128-
assert_eq!(p4.value, 4);
129-
//p5: '#'
130-
//p6: '#'
131-
let p7 = p3.left.expect("invalid p7");
132-
let p7 = tree.node_at(p7).expect("invalid p7 node");
133-
assert_eq!(p7.value, 5);
134-
assert_eq!(tree.arena.len(), 5);
135-
}

src/tree/binary/mod.rs

+5-24
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#![allow(unused)]
2-
mod construct;
3-
mod traverse;
4-
mod visualization;
2+
pub mod construct;
3+
pub mod traverse;
4+
pub mod visualization;
55

66
pub type TreeIndex = usize;
77

@@ -20,8 +20,8 @@ impl TreeNode {
2020
/// tree impl based Arena Allocators
2121
/// https://sachanganesh.com/programming/graph-tree-traversals-in-rust/
2222
pub struct Tree {
23-
arena: Vec<Option<TreeNode>>,
24-
root: Option<TreeIndex>,
23+
pub arena: Vec<Option<TreeNode>>,
24+
pub root: Option<TreeIndex>,
2525
}
2626

2727
impl Tree {
@@ -93,22 +93,3 @@ impl Tree {
9393
calc(self, self.root)
9494
}
9595
}
96-
97-
#[test]
98-
fn t_height() {
99-
let test_data = vec![
100-
(vec!["1", "#", "2", "3"], 3),
101-
(vec!["1", "2", "#", "3", "#", "#", "#", "4"], 4),
102-
(vec!["1", "2", "#", "3", "#", "#", "#", "#", "4"], 4),
103-
(vec!["1", "2", "#", "3", "4", "#", "#", "5"], 4),
104-
];
105-
for (t, expect) in test_data {
106-
let tree = construct::new_tree(&t);
107-
let r = tree.height();
108-
assert_eq!(
109-
expect, r,
110-
"tree = {:?}, expect = {:?}, r = {:?}",
111-
t, expect, r
112-
);
113-
}
114-
}

src/tree/binary/traverse.rs

+9-174
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ pub struct SameTree;
113113

114114
impl PreOrderVisitor {
115115
/// 时间复杂度 O(n), 空间复杂度 O(n)
116-
fn iterate(tree: &Tree) -> Vec<usize> {
116+
pub fn iterate(tree: &Tree) -> Vec<usize> {
117117
let mut results = vec![];
118118
let mut stack = vec![];
119119
//point current node
@@ -140,7 +140,7 @@ impl PreOrderVisitor {
140140
///
141141
/// 点评:利用tree本身的node记录回溯指针(避免用栈记录回溯),
142142
/// 使得空间复杂度由 O(n) => O(1)
143-
fn morris(tree: &mut Tree) -> Vec<usize> {
143+
pub fn morris(tree: &mut Tree) -> Vec<usize> {
144144
let mut results = vec![];
145145
let mut cur = tree.root;
146146

@@ -191,7 +191,7 @@ impl PreOrderVisitor {
191191
}
192192

193193
/// 时间复杂度 O(n), 空间复杂度 O(n)
194-
fn recursive(tree: &Tree) -> Vec<usize> {
194+
pub fn recursive(tree: &Tree) -> Vec<usize> {
195195
let mut results = vec![];
196196
fn visitor(tree: &Tree, p: Option<TreeIndex>, results: &mut Vec<usize>) {
197197
if let Some(node_idx) = p {
@@ -207,7 +207,7 @@ impl PreOrderVisitor {
207207
}
208208

209209
impl InOrderVisitor {
210-
fn iterate(tree: &Tree) -> Vec<usize> {
210+
pub fn iterate(tree: &Tree) -> Vec<usize> {
211211
let mut results = vec![];
212212
let mut stack = vec![];
213213
//point current node
@@ -235,7 +235,7 @@ impl InOrderVisitor {
235235
results
236236
}
237237

238-
fn recursive(tree: &Tree) -> Vec<usize> {
238+
pub fn recursive(tree: &Tree) -> Vec<usize> {
239239
let mut results = vec![];
240240
fn visitor(tree: &Tree, p: Option<TreeIndex>, results: &mut Vec<usize>) {
241241
if let Some(node_idx) = p {
@@ -289,7 +289,7 @@ impl PostOrderVisitor {
289289
results
290290
}
291291

292-
fn recursive(tree: &Tree) -> Vec<usize> {
292+
pub fn recursive(tree: &Tree) -> Vec<usize> {
293293
let mut results = vec![];
294294
fn visitor(tree: &Tree, p: Option<TreeIndex>, results: &mut Vec<usize>) {
295295
if let Some(node_idx) = p {
@@ -345,7 +345,7 @@ impl LevelOrderVisitor {
345345
results
346346
}
347347

348-
fn recursive(tree: &Tree) -> Vec<Vec<usize>> {
348+
pub fn recursive(tree: &Tree) -> Vec<Vec<usize>> {
349349
let mut results = vec![];
350350
fn visitor(
351351
tree: &Tree,
@@ -386,7 +386,7 @@ impl LevelOrderVisitor2 {
386386
r
387387
}
388388

389-
fn recursive(tree: &Tree) -> Vec<Vec<usize>> {
389+
pub fn recursive(tree: &Tree) -> Vec<Vec<usize>> {
390390
let mut r = LevelOrderVisitor::recursive(tree);
391391
r.reverse();
392392
r
@@ -443,7 +443,7 @@ impl ZigzagOrderVisitor {
443443
results
444444
}
445445

446-
fn recursive(tree: &Tree) -> Vec<Vec<usize>> {
446+
pub fn recursive(tree: &Tree) -> Vec<Vec<usize>> {
447447
let mut results = vec![];
448448
fn visitor(
449449
tree: &Tree,
@@ -482,168 +482,3 @@ impl ZigzagOrderVisitor {
482482
results
483483
}
484484
}
485-
486-
#[test]
487-
fn t_preorder_iter() {
488-
for (t, expect) in preorder_test_data() {
489-
let mut tree = construct::new_tree(&t);
490-
let r = PreOrderVisitor::iterate(&tree);
491-
assert_eq!(
492-
expect, r,
493-
"tree = {:?}, expect = {:?}, r = {:?}",
494-
t, expect, r
495-
);
496-
}
497-
}
498-
499-
#[test]
500-
fn t_preorder_morris() {
501-
for (t, expect) in preorder_test_data() {
502-
let mut tree = construct::new_tree(&t);
503-
let r = PreOrderVisitor::morris(&mut tree);
504-
assert_eq!(
505-
expect, r,
506-
"tree = {:?}, expect = {:?}, r = {:?}",
507-
t, expect, r
508-
);
509-
}
510-
}
511-
512-
#[test]
513-
fn t_preorder_recursive() {
514-
for (t, expect) in preorder_test_data() {
515-
let mut tree = construct::new_tree(&t);
516-
let r = PreOrderVisitor::recursive(&mut tree);
517-
assert_eq!(
518-
expect, r,
519-
"tree = {:?}, expect = {:?}, r = {:?}",
520-
t, expect, r
521-
);
522-
}
523-
}
524-
525-
#[test]
526-
fn t_inorder_iter() {
527-
for (t, expect) in inorder_test_data() {
528-
let tree = construct::new_tree(&t);
529-
let r = InOrderVisitor::iterate(&tree);
530-
assert_eq!(
531-
expect, r,
532-
"tree = {:?}, expect = {:?}, r = {:?}",
533-
t, expect, r
534-
);
535-
}
536-
}
537-
538-
#[test]
539-
fn t_inorder_recursive() {
540-
for (t, expect) in inorder_test_data() {
541-
let tree = construct::new_tree(&t);
542-
let r = InOrderVisitor::recursive(&tree);
543-
assert_eq!(
544-
expect, r,
545-
"tree = {:?}, expect = {:?}, r = {:?}",
546-
t, expect, r
547-
);
548-
}
549-
}
550-
551-
#[test]
552-
fn t_postorder_recursive() {
553-
let nodes = vec!["1", "#", "2", "3"];
554-
let tree = construct::new_tree(&nodes);
555-
let r = PostOrderVisitor::recursive(&tree);
556-
assert_eq!(vec![3, 2, 1], r);
557-
}
558-
559-
#[test]
560-
fn t_postorder_iter() {
561-
let nodes = vec!["1", "#", "2", "3"];
562-
let tree = construct::new_tree(&nodes);
563-
let r = PostOrderVisitor::iterate(&tree);
564-
assert_eq!(vec![3, 2, 1], r);
565-
}
566-
567-
#[test]
568-
fn t_levelorder_iter() {
569-
let nodes = vec!["3", "9", "20", "#", "#", "15", "7"];
570-
let tree = construct::new_tree(&nodes);
571-
let r = LevelOrderVisitor::iterate(&tree);
572-
assert_eq!(vec![vec![3], vec![9, 20], vec![15, 7]], r);
573-
}
574-
575-
#[test]
576-
fn t_levelorder_traverse() {
577-
let nodes = vec!["3", "9", "20", "#", "#", "15", "7"];
578-
let tree = construct::new_tree(&nodes);
579-
let r = LevelOrderVisitor::recursive(&tree);
580-
assert_eq!(vec![vec![3], vec![9, 20], vec![15, 7]], r);
581-
}
582-
583-
#[test]
584-
fn t_levelorder2_iter() {
585-
let nodes = vec!["3", "9", "20", "#", "#", "15", "7"];
586-
let tree = construct::new_tree(&nodes);
587-
let r = LevelOrderVisitor2::iterate(&tree);
588-
assert_eq!(vec![vec![15, 7], vec![9, 20], vec![3]], r);
589-
}
590-
591-
#[test]
592-
fn t_levelorder2_traverse() {
593-
let nodes = vec!["3", "9", "20", "#", "#", "15", "7"];
594-
let tree = construct::new_tree(&nodes);
595-
let r = LevelOrderVisitor2::recursive(&tree);
596-
assert_eq!(vec![vec![15, 7], vec![9, 20], vec![3]], r);
597-
}
598-
599-
#[test]
600-
fn t_levelorder_zigzag_iter() {
601-
let nodes = vec!["3", "9", "20", "#", "#", "15", "7"];
602-
let tree = construct::new_tree(&nodes);
603-
let r = ZigzagOrderVisitor::iterate(&tree);
604-
assert_eq!(vec![vec![3], vec![20, 9], vec![15, 7]], r);
605-
}
606-
607-
#[test]
608-
fn t_levelorder_zigzag_traverse() {
609-
let nodes = vec!["3", "9", "20", "#", "#", "15", "7"];
610-
let tree = construct::new_tree(&nodes);
611-
let r = ZigzagOrderVisitor::recursive(&tree);
612-
assert_eq!(vec![vec![3], vec![20, 9], vec![15, 7]], r);
613-
}
614-
615-
fn preorder_test_data() -> Vec<(Vec<&'static str>, Vec<usize>)> {
616-
vec![
617-
(vec!["1", "#", "2", "3"], vec![1, 2, 3]),
618-
(
619-
vec!["1", "2", "#", "3", "#", "#", "#", "4"],
620-
vec![1, 2, 3, 4],
621-
),
622-
(
623-
vec!["1", "2", "#", "3", "#", "#", "#", "#", "4"],
624-
vec![1, 2, 3, 4],
625-
),
626-
(
627-
vec!["1", "2", "#", "3", "4", "#", "#", "5"],
628-
vec![1, 2, 3, 5, 4],
629-
),
630-
]
631-
}
632-
633-
fn inorder_test_data() -> Vec<(Vec<&'static str>, Vec<usize>)> {
634-
vec![
635-
(vec!["1", "#", "2", "3"], vec![1, 3, 2]),
636-
(
637-
vec!["1", "2", "#", "3", "#", "#", "#", "4"],
638-
vec![4, 3, 2, 1],
639-
),
640-
(
641-
vec!["1", "2", "#", "3", "#", "#", "#", "#", "4"],
642-
vec![3, 4, 2, 1],
643-
),
644-
(
645-
vec!["1", "2", "#", "3", "4", "#", "#", "5"],
646-
vec![5, 3, 2, 4, 1],
647-
),
648-
]
649-
}

src/tree/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
mod binary;
1+
pub mod binary;

0 commit comments

Comments
 (0)