From 9addd3810bb209eaafe5ecffbb70c949205d8062 Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Thu, 11 Feb 2021 11:55:27 +0100 Subject: [PATCH] Use more compact cache key --- src/lib.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 12e32e5..ad12e71 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -148,13 +148,18 @@ impl<'a> SegmentState<'a> { let previous = previous.clone().map(|range| &self.text[range]); let prefix_score = self.data.score(&self.text[start..split], previous).log10(); - let pair = (split..end, start..split); - let (suffix_score, suffix_splits) = match self.search.memo.get(&pair) { + let key = ( + (start - self.offset) as u8, + (split - self.offset) as u8, + (end - self.offset) as u8, + ); + + let (suffix_score, suffix_splits) = match self.search.memo.get(&key) { Some((score, suffix_splits)) => (*score, *suffix_splits), None => { let suffix_score = self.search(level + 1, split..end, Some(start..split)); let suffix_splits = self.search.best[level + 1]; - self.search.memo.insert(pair, (suffix_score, suffix_splits)); + self.search.memo.insert(key, (suffix_score, suffix_splits)); (suffix_score, suffix_splits) } }; @@ -175,7 +180,7 @@ impl<'a> SegmentState<'a> { #[derive(Clone)] pub struct Search { - memo: HashMap, + memo: HashMap<(u8, u8, u8), (f64, BitVec)>, best: [BitVec; SEGMENT_SIZE], result: Vec, } @@ -264,8 +269,6 @@ impl Iterator for Splits { } } -type MemoKey = (Range, Range); - #[derive(Debug)] struct Ascii<'a>(&'a [u8]);