Skip to content

Commit 4dd424d

Browse files
committed
docs: add deque examples and benchmarks
1 parent 804ab69 commit 4dd424d

10 files changed

Lines changed: 288 additions & 0 deletions

Cargo.toml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,18 @@ path = "examples/soluciones/queue_round_robin.rs"
6161
name = "solution_queue_filter_ready_jobs"
6262
path = "examples/soluciones/queue_filter_ready_jobs.rs"
6363

64+
[[example]]
65+
name = "solution_deque_trace_ends"
66+
path = "examples/soluciones/deque_trace_ends.rs"
67+
68+
[[example]]
69+
name = "solution_deque_sliding_window"
70+
path = "examples/soluciones/deque_sliding_window.rs"
71+
72+
[[example]]
73+
name = "solution_deque_browser_history"
74+
path = "examples/soluciones/deque_browser_history.rs"
75+
6476
[[bench]]
6577
name = "vector_bench"
6678
path = "benches/vector_bench.rs"
@@ -80,3 +92,8 @@ harness = false
8092
name = "queue_bench"
8193
path = "benches/queue_bench.rs"
8294
harness = false
95+
96+
[[bench]]
97+
name = "deque_bench"
98+
path = "benches/deque_bench.rs"
99+
harness = false

benches/deque_bench.rs

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
use rust_data_structures::deque::Deque;
2+
use rust_data_structures::linked_list::LinkedList;
3+
use rust_data_structures::vector::Vector;
4+
use std::hint::black_box;
5+
use std::time::{Duration, Instant};
6+
7+
const SIZE: usize = 30_000;
8+
9+
fn main() {
10+
println!("deque benchmark (manual, std::time::Instant)");
11+
println!("size: {SIZE}");
12+
println!("push/pop front: {:?}", bench_deque_front());
13+
println!("push/pop back: {:?}", bench_deque_back());
14+
println!("indexed access: {:?}", bench_deque_get());
15+
println!(
16+
"linked list front comparison: {:?}",
17+
bench_linked_list_front()
18+
);
19+
println!("vector front remove comparison: {:?}", bench_vector_front());
20+
}
21+
22+
fn bench_deque_front() -> Duration {
23+
let start = Instant::now();
24+
let mut deque = Deque::new();
25+
26+
for value in 0..SIZE {
27+
deque.push_front(black_box(value));
28+
}
29+
30+
while let Some(value) = deque.pop_front() {
31+
black_box(value);
32+
}
33+
34+
start.elapsed()
35+
}
36+
37+
fn bench_deque_back() -> Duration {
38+
let start = Instant::now();
39+
let mut deque = Deque::new();
40+
41+
for value in 0..SIZE {
42+
deque.push_back(black_box(value));
43+
}
44+
45+
while let Some(value) = deque.pop_back() {
46+
black_box(value);
47+
}
48+
49+
start.elapsed()
50+
}
51+
52+
fn bench_deque_get() -> Duration {
53+
let start = Instant::now();
54+
let mut deque = Deque::new();
55+
56+
for value in 0..SIZE {
57+
deque.push_back(value);
58+
}
59+
60+
for index in 0..SIZE {
61+
black_box(deque.get(index));
62+
}
63+
64+
start.elapsed()
65+
}
66+
67+
fn bench_linked_list_front() -> Duration {
68+
let start = Instant::now();
69+
let mut list = LinkedList::new();
70+
71+
for value in 0..SIZE {
72+
list.push_front(black_box(value));
73+
}
74+
75+
while let Some(value) = list.pop_front() {
76+
black_box(value);
77+
}
78+
79+
start.elapsed()
80+
}
81+
82+
fn bench_vector_front() -> Duration {
83+
let start = Instant::now();
84+
let mut vector = Vector::new();
85+
86+
for value in 0..SIZE {
87+
vector.push(black_box(value));
88+
}
89+
90+
while !vector.is_empty() {
91+
black_box(vector.remove(0));
92+
}
93+
94+
start.elapsed()
95+
}

diagrams/05-deque.mmd

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
flowchart LR
2+
title["Deque: dos extremos sobre buffer circular"]
3+
4+
subgraph metadata["Metadatos"]
5+
head["head = 4"]
6+
len["len = 5"]
7+
cap["capacity = 8"]
8+
end
9+
10+
subgraph buffer["Buffer fisico"]
11+
slot0["0: D"]
12+
slot1["1: E (back)"]
13+
slot2["2: libre"]
14+
slot3["3: libre"]
15+
slot4["4: A (front)"]
16+
slot5["5: B"]
17+
slot6["6: C"]
18+
slot7["7: libre"]
19+
end
20+
21+
head --> slot4
22+
len --> slot1
23+
cap --> slot7
24+
25+
push_front["push_front(Z)<br/>mueve head hacia atras"]
26+
pop_front["pop_front()<br/>toma front y avanza head"]
27+
push_back["push_back(F)<br/>escribe en (head + len) % capacity"]
28+
pop_back["pop_back()<br/>toma (head + len - 1) % capacity"]
29+
30+
push_front --> slot3
31+
pop_front --> head
32+
push_back --> slot2
33+
pop_back --> slot1

examples/deque_advanced.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
use rust_data_structures::deque::Deque;
2+
3+
fn main() {
4+
let mut deque = Deque::with_capacity(4);
5+
6+
deque.push_back("B");
7+
deque.push_back("C");
8+
deque.push_back("D");
9+
deque.pop_front();
10+
deque.push_back("E");
11+
deque.push_front("A");
12+
13+
println!("capacidad: {}", deque.capacity());
14+
println!(
15+
"orden logico: {:?}",
16+
deque.iter().copied().collect::<Vec<_>>()
17+
);
18+
println!("indice 2: {:?}", deque.get(2));
19+
}

examples/deque_basic.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use rust_data_structures::deque::Deque;
2+
3+
fn main() {
4+
let mut deque = Deque::new();
5+
6+
deque.push_back("centro");
7+
deque.push_front("inicio");
8+
deque.push_back("final");
9+
10+
println!("frente: {}", deque.front().unwrap());
11+
println!("fondo: {}", deque.back().unwrap());
12+
}

examples/deque_intermediate.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
use rust_data_structures::deque::Deque;
2+
3+
fn main() {
4+
let mut work = Deque::new();
5+
6+
work.push_back("sincronizar docs");
7+
work.push_back("correr tests");
8+
work.push_front("incidente urgente");
9+
10+
while let Some(job) = work.pop_front() {
11+
println!("procesando: {job}");
12+
}
13+
}

examples/deque_real_case.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
use rust_data_structures::deque::Deque;
2+
3+
fn main() {
4+
let mut tabs = Deque::new();
5+
6+
tabs.push_back(Tab::new("Inicio"));
7+
tabs.push_back(Tab::new("Curso"));
8+
tabs.push_front(Tab::new("Pin: Roadmap"));
9+
10+
while let Some(tab) = tabs.pop_front() {
11+
println!("visitando: {}", tab.title);
12+
}
13+
}
14+
15+
struct Tab {
16+
title: &'static str,
17+
}
18+
19+
impl Tab {
20+
fn new(title: &'static str) -> Self {
21+
Self { title }
22+
}
23+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
use rust_data_structures::deque::Deque;
2+
3+
fn main() {
4+
let mut history = Deque::new();
5+
history.push_back("inicio");
6+
history.push_back("curso");
7+
history.push_back("capitulo");
8+
9+
assert_eq!(go_back(&mut history), Some("capitulo"));
10+
history.push_front("pin-roadmap");
11+
12+
assert_eq!(
13+
history.iter().copied().collect::<Vec<_>>(),
14+
vec!["pin-roadmap", "inicio", "curso"]
15+
);
16+
println!("{:?}", history.iter().copied().collect::<Vec<_>>());
17+
}
18+
19+
fn go_back(history: &mut Deque<&'static str>) -> Option<&'static str> {
20+
history.pop_back()
21+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
use rust_data_structures::deque::Deque;
2+
3+
fn main() {
4+
let values = [4, 2, 12, 3, 8];
5+
let maximums = sliding_window_maximums(&values, 3);
6+
7+
assert_eq!(maximums, vec![12, 12, 12]);
8+
println!("{maximums:?}");
9+
}
10+
11+
fn sliding_window_maximums(values: &[i32], window: usize) -> Vec<i32> {
12+
let mut indexes = Deque::new();
13+
let mut maximums = Vec::new();
14+
15+
for index in 0..values.len() {
16+
while let Some(&front) = indexes.front() {
17+
if front + window > index {
18+
break;
19+
}
20+
indexes.pop_front();
21+
}
22+
23+
while let Some(&back) = indexes.back() {
24+
if values[back] >= values[index] {
25+
break;
26+
}
27+
indexes.pop_back();
28+
}
29+
30+
indexes.push_back(index);
31+
32+
if index + 1 >= window {
33+
let front = indexes.front().copied().expect("window has a maximum");
34+
maximums.push(values[front]);
35+
}
36+
}
37+
38+
maximums
39+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
use rust_data_structures::deque::Deque;
2+
3+
fn main() {
4+
let mut deque = Deque::new();
5+
let mut trace = Vec::new();
6+
7+
deque.push_back("B");
8+
deque.push_front("A");
9+
deque.push_back("C");
10+
trace.push(deque.pop_front());
11+
trace.push(deque.pop_back());
12+
trace.push(deque.pop_front());
13+
14+
assert_eq!(trace, vec![Some("A"), Some("C"), Some("B")]);
15+
println!("{trace:?}");
16+
}

0 commit comments

Comments
 (0)