Skip to content

Commit b7f4b47

Browse files
now RMQ op can access variables in outside scope (#58)
* another approach for RMQ with closure * fix clippy --------- Co-authored-by: Luke Videckis <lukevideckis@gmail.com> Co-authored-by: Cameron Custer <73217097+cameroncuster@users.noreply.github.com>
1 parent 9282af4 commit b7f4b47

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

src/data_structures/rmq.rs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,27 @@
55
/// use programming_team_code_rust::data_structures::rmq::RMQ;
66
///
77
/// let a = [1, 3, 2, 4, 5];
8-
/// let rmq = RMQ::new(&a, std::cmp::min);
9-
/// assert_eq!(rmq.query(0..5), 1);
10-
/// assert_eq!(rmq.query(1..4), 2);
8+
/// let rmq1 = RMQ::new(&a, std::cmp::min);
9+
/// assert_eq!(rmq1.query(0..5), 1);
10+
/// assert_eq!(rmq1.query(1..4), 2);
11+
///
12+
/// let outside_var = 5;
13+
/// let rmq2 = RMQ::new(&a, |x, y| if x + outside_var < y + outside_var { x } else { y });
14+
/// assert_eq!(rmq2.query(0..5), 1);
15+
/// assert_eq!(rmq2.query(1..4), 2);
1116
/// ```
12-
pub struct RMQ<T> {
17+
pub struct RMQ<T, F> {
1318
t: Vec<Vec<T>>,
14-
op: fn(T, T) -> T,
19+
op: F,
1520
}
1621

17-
impl<T: Copy> RMQ<T> {
22+
impl<T: Copy, F: Fn(T, T) -> T> RMQ<T, F> {
1823
/// Create a new RMQ instance
1924
///
2025
/// # Complexity (n = a.len())
2126
/// - Time: O(n log n)
2227
/// - Space: O(n log n)
23-
pub fn new(a: &[T], op: fn(T, T) -> T) -> Self {
28+
pub fn new(a: &[T], op: F) -> Self {
2429
let mut t = vec![a.to_owned(); 1];
2530
let mut i = 0;
2631
while (2 << i) <= a.len() {

src/graphs/lca.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
use crate::data_structures::rmq::RMQ;
44
use crate::graphs::dfs_order::get_dfs_preorder;
55

6+
type OpType = fn((usize, usize), (usize, usize)) -> (usize, usize);
7+
68
/// # Example
79
/// ```
810
/// use programming_team_code_rust::graphs::lca::LCA;
@@ -25,7 +27,7 @@ use crate::graphs::dfs_order::get_dfs_preorder;
2527
pub struct LCA {
2628
tin: Vec<usize>,
2729
p: Vec<usize>,
28-
rmq: RMQ<(usize, usize)>,
30+
rmq: RMQ<(usize, usize), OpType>,
2931
}
3032

3133
impl LCA {
@@ -53,7 +55,7 @@ impl LCA {
5355
}
5456
}
5557
let d_with_order: Vec<(usize, usize)> = order.iter().map(|&u| (d[u], u)).collect();
56-
let rmq = RMQ::new(&d_with_order, std::cmp::min);
58+
let rmq = RMQ::<(usize, usize), OpType>::new(&d_with_order, std::cmp::min);
5759
LCA { tin, p, rmq }
5860
}
5961

0 commit comments

Comments
 (0)