1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//! This crate provides state-of-the-art O(1) or alike queries on large number of unsigned integers.
//!
//! The typical memory usage of this data structure is calculated like below.
//!
//! - `bit_len * num_of_elements / 8 * 1.25` [bytes]
//!
//! In other words, it roughly consumes additional 25% space compared with the original data.
//!
//! # Example
//!
//! ```rust
//! use wavelet_matrix::WaveletMatrix;
//!
//! let vec: Vec<u64> = vec![1, 2, 4, 5, 1, 0, 4, 6, 2, 9, 2, 0];
//! //                       0  1  2  3  4  5  6  7  8  9 10 11 (length = 12)
//! let wm = WaveletMatrix::new(&vec);
//!
//! // Basic access
//! assert_eq!(wm.len(), vec.len());
//! assert_eq!(wm.lookup(7), vec[7]);
//! assert_eq!(wm.dim(), 10); // max value + 1
//! assert_eq!(wm.bit_len(), 4); // bit length stored internally
//!
//! // Counting
//! assert_eq!(wm.count(0..wm.len(), 2), 3);
//! assert_eq!(wm.count(0..wm.len(), 4), 2);
//! assert_eq!(wm.count(0..wm.len(), 5), 1);
//! assert_eq!(wm.count(0..wm.len(), 7), 0);
//! assert_eq!(wm.count(0..wm.len(), 39), 0);
//!
//! assert_eq!(wm.count_prefix(0..wm.len(), 8, 3), 1);
//! assert_eq!(wm.count_prefix(0..wm.len(), 6, 1), 1);
//! assert_eq!(wm.count_prefix(0..wm.len(), 0, 1), 4);
//! assert_eq!(wm.count_prefix(0..wm.len(), 0, 2), 7);
//!
//! assert_eq!(wm.count_lt(0..wm.len(), 2), 4);
//! assert_eq!(wm.count_lt(0..wm.len(), 7), 11);
//!
//! assert_eq!(wm.count_gt(0..wm.len(), 2), 5);
//! assert_eq!(wm.count_gt(0..wm.len(), 7), 1);
//!
//! assert_eq!(wm.count_range(0..wm.len(), 0..wm.dim()), 12);
//! assert_eq!(wm.count_range(0..wm.len(), 4..6), 3);
//!
//! // Searching
//! assert_eq!(wm.search(0..wm.len(), 4).collect::<Vec<usize>>(), vec![2, 6]);
//! assert_eq!(wm.search(3..wm.len(), 4).collect::<Vec<usize>>(), vec![6]);
//! assert_eq!(wm.search(0..wm.len(), 7).collect::<Vec<usize>>(), vec![]);
//!
//! // Ranking: (value, count), frequent values first
//! assert_eq!(wm.top_k(0..wm.len(), 0..wm.dim(), 12),
//!            vec![(2, 3), (1, 2), (4, 2), (0, 2), (5, 1), (6, 1), (9, 1)]);
//! assert_eq!(wm.top_k(0..wm.len(), 0..wm.dim(), 4),
//!            vec![(2, 3), (1, 2), (4, 2), (0, 2)]);
//! assert_eq!(wm.top_k(0..wm.len(), 2..9, 12),
//!            vec![(2, 3), (4, 2), (5, 1), (6, 1)]);
//!
//! // Ranking: (value, count), max values first
//! assert_eq!(wm.max_k(0..wm.len(), 0..wm.dim(), 12),
//!            vec![(9, 1), (6, 1), (5, 1), (4, 2), (2, 3), (1, 2), (0, 2)]);
//! assert_eq!(wm.max_k(0..wm.len(), 0..wm.dim(), 4),
//!            vec![(9, 1), (6, 1), (5, 1), (4, 2)]);
//! assert_eq!(wm.max_k(0..wm.len(), 2..9, 12),
//!            vec![(6, 1), (5, 1), (4, 2), (2, 3)]);
//!
//! // Ranking: (value, count), min values first
//! assert_eq!(wm.min_k(0..wm.len(), 0..wm.dim(), 12),
//!            vec![(0, 2), (1, 2), (2, 3), (4, 2), (5, 1), (6, 1), (9, 1)]);
//! assert_eq!(wm.min_k(0..wm.len(), 0..wm.dim(), 4),
//!            vec![(0, 2), (1, 2), (2, 3), (4, 2)]);
//! assert_eq!(wm.min_k(0..wm.len(), 2..9, 12),
//!            vec![(2, 3), (4, 2), (5, 1), (6, 1)]);
//!
//! // Statistics
//! assert_eq!(wm.quantile(0..wm.len(), 0), 0);
//! assert_eq!(wm.quantile(0..wm.len(), 8), 4);
//! assert_eq!(wm.quantile(0..wm.len(), 11), 9);
//! ```

extern crate succinct;

mod rsdic_simple;
mod node_range;
mod wavelet_matrix;

pub use wavelet_matrix::*;