Parameterize priority queue

This commit is contained in:
hal8174 2025-03-27 20:25:10 +01:00
parent 6f74f1345e
commit ffe51bede9
14 changed files with 276 additions and 183 deletions

View file

@ -1,5 +1,7 @@
use std::ops::Deref;
use tracing::trace_span;
use crate::{graph::Graph, priority_queue::PriorityQueue};
#[derive(Debug, Clone, Copy)]
@ -130,6 +132,7 @@ where
G: Graph<Node = usize>,
P: PriorityQueue<SetUncovered>,
{
let _complete_span = trace_span!("greedy connectd set cover").entered();
let mut covered = vec![false; universe];
let mut covered_count = 0;

View file

@ -64,7 +64,13 @@ where
G: WheightedGraph,
E: Fn(&'_ G::Node) -> bool,
{
let span = trace_span!("graph", seen_nodes = Empty, visited_nodes = Empty).entered();
let span = trace_span!(
"dijkstra",
insert_count = Empty,
pop_min_count = Empty,
decrease_key_count = Empty,
)
.entered();
if end(&start) {
return Some(vec![start]);
}
@ -74,11 +80,12 @@ where
let mut q = P::new();
q.insert(QueueObject::new(start.clone(), 0));
let mut visited_nodes: usize = 1;
let mut pop_min_count: usize = 0;
let mut decrease_key_count: usize = 0;
let mut end_node = None;
while let Some(o) = q.pop_min() {
visited_nodes += 1;
pop_min_count += 1;
if let Some(m) = map.get_mut(&o.node) {
m.key = None;
}
@ -93,6 +100,7 @@ where
if let Some(n) = map.get_mut(&node) {
if let Some(h) = &n.key {
if score < n.score {
decrease_key_count += 1;
n.parent = o.node.clone();
n.score = score;
q.decrease_key(h, |i| i.score = score);
@ -106,8 +114,9 @@ where
// dbg!(&q);
}
span.record("seen_nodes", map.len());
span.record("visited_nodes", visited_nodes);
span.record("insert_count", map.len());
span.record("pop_min_count", pop_min_count);
span.record("decrease_key_count", decrease_key_count);
if let Some(end_node) = end_node {
map.get(&end_node)?;

View file

@ -1,3 +1,5 @@
use tracing::trace_span;
use crate::priority_queue::PriorityQueue;
use std::hash::Hash;
use std::{collections::HashSet, fmt::Debug};
@ -35,6 +37,7 @@ where
G::Node: Eq + Hash + Clone + Debug,
G: WheightedGraph,
{
let _complete_span = trace_span!("takaheshi_matsuyama").entered();
if nodes.is_empty() {
return Some(Vec::new());
}