Parameterize priority queue
This commit is contained in:
parent
6f74f1345e
commit
ffe51bede9
14 changed files with 276 additions and 183 deletions
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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)?;
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue