don't allocate ngrams on the heap (lol)

This commit is contained in:
mehbark 2026-04-16 14:07:32 -04:00
parent c3c60e38dd
commit c92d9d99a2
Signed by: mbk
GPG key ID: E333EC1335FFCCDB

View file

@ -8,7 +8,7 @@ fn main() {
let mut src = Vec::new();
io::stdin().read_to_end(&mut src).unwrap();
let mut table: HashMap<Box<[u8]>, u64> = HashMap::new();
let mut table: HashMap<&[u8], u64> = HashMap::new();
for n in 1..=20 {
let (ngrams, freqs) = ngram_freqs(n, &src, &mut table);
let bits = entropy(freqs);
@ -19,17 +19,17 @@ fn main() {
}
}
fn ngram_freqs(
fn ngram_freqs<'a>(
n: usize,
src: &[u8],
counts: &mut HashMap<Box<[u8]>, u64>,
src: &'a [u8],
counts: &mut HashMap<&'a [u8], u64>,
) -> (usize, impl Iterator<Item = f64>) {
assert!(n > 0);
counts.clear();
for ngram in src.windows(n) {
*counts.entry(Box::from(ngram)).or_default() += 1;
*counts.entry(ngram).or_default() += 1;
}
let total_count: u64 = counts.values().sum();