Skip to content

Commit 5741c91

Browse files
committed
[day12] Replace HashMap/HashSet with Vec
Significantly faster
1 parent 2e6c59f commit 5741c91

File tree

2 files changed

+16
-14
lines changed

2 files changed

+16
-14
lines changed

day12a/src/main.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::collections::{BTreeSet, HashMap};
1+
use std::collections::BTreeSet;
22
use std::io::Read;
33

44
fn main() {
@@ -28,11 +28,11 @@ fn main() {
2828

2929
let start_f_score = h(start);
3030

31-
let mut f_scores = HashMap::new();
32-
f_scores.insert(start, start_f_score);
31+
let mut f_scores: Vec<Vec<_>> = map.iter().map(|row| row.iter().map(|_| 0).collect()).collect();
32+
f_scores[start[0] as usize][start[1] as usize] = start_f_score;
3333

34-
let mut g_scores = HashMap::new();
35-
g_scores.insert(start, 0);
34+
let mut g_scores: Vec<Vec<_>> = map.iter().map(|row| row.iter().map(|_| None).collect()).collect();
35+
g_scores[start[0] as usize][start[1] as usize] = Some(0);
3636

3737
let mut open_set = BTreeSet::new();
3838
open_set.insert((start_f_score, start));
@@ -45,7 +45,7 @@ fn main() {
4545
println!("{}", f_score);
4646
break;
4747
}
48-
let g_score = g_scores[&pos];
48+
let g_score = g_scores[pos[0] as usize][pos[1] as usize].unwrap();
4949
let old_height = map[pos[0] as usize][pos[1] as usize];
5050

5151
for delta in [
@@ -64,15 +64,15 @@ fn main() {
6464
continue;
6565
}
6666
let tentative_g_score = g_score + 1;
67-
let old_g_score = g_scores.get(&new_pos).copied();
67+
let old_g_score = g_scores[new_pos[0] as usize][new_pos[1] as usize];
6868
if tentative_g_score < old_g_score.unwrap_or(i16::MAX) {
6969
if old_g_score.is_some() {
70-
open_set.remove(&(f_scores[&new_pos], new_pos));
70+
open_set.remove(&(f_scores[new_pos[0] as usize][new_pos[1] as usize], new_pos));
7171
}
7272

7373
let new_f_score = tentative_g_score + h(new_pos);
74-
f_scores.insert(new_pos, new_f_score);
75-
g_scores.insert(new_pos, tentative_g_score);
74+
f_scores[new_pos[0] as usize][new_pos[1] as usize] = new_f_score;
75+
g_scores[new_pos[0] as usize][new_pos[1] as usize] = Some(tentative_g_score);
7676
open_set.insert((new_f_score, new_pos));
7777
}
7878
}

day12b/src/main.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::collections::{HashSet, VecDeque};
1+
use std::collections::VecDeque;
22
use std::io::Read;
33

44
fn main() {
@@ -24,7 +24,8 @@ fn main() {
2424

2525
let mut open_set = VecDeque::new();
2626
open_set.push_back((0, start));
27-
let mut visited = HashSet::new();
27+
let mut visited: Vec<Vec<_>> = map.iter().map(|row| row.iter().map(|_| false).collect()).collect();
28+
visited[start[0] as usize][start[1] as usize] = true;
2829

2930
while let Some((dist, pos)) = open_set.pop_front() {
3031
let old_height = map[pos[0] as usize][pos[1] as usize];
@@ -46,11 +47,12 @@ fn main() {
4647
}
4748

4849
if new_pos.iter().any(|&x| x < 0) || new_pos[0] >= height || new_pos[1] >= width ||
49-
old_height > map[new_pos[0] as usize][new_pos[1] as usize] + 1 || visited.contains(&new_pos) {
50+
old_height > map[new_pos[0] as usize][new_pos[1] as usize] + 1 ||
51+
visited[new_pos[0] as usize][new_pos[1] as usize] {
5052
continue;
5153
}
5254

53-
visited.insert(new_pos);
55+
visited[new_pos[0] as usize][new_pos[1] as usize] = true;
5456
open_set.push_back((new_dist, new_pos));
5557
}
5658
}

0 commit comments

Comments
 (0)