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