1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
pub struct Slot {
slot: String,
count: usize,
}
pub fn generate_dictionary<'a>(data: String, slen: usize) -> Vec<String> {
const MLEN: usize = 896;
let mut dict: Vec<Slot> = Vec::new();
for i in 0..data.len() - slen {
for j in 2..slen {
let slot: String = data[i..i + j].to_string();
if dict.iter().any(|r| r.slot == slot) {
} else {
dict.push(Slot {
slot: slot.to_string(),
count: data.matches(&slot).count(),
});
}
}
}
dict.sort_by(|a, b| b.count.cmp(&a.count));
let mut v: Vec<String> = dict[0..MLEN].iter().map(|r| r.slot.to_string()).collect();
v.sort_by(|a, b| b.len().cmp(&a.len()));
v.to_vec()
}
pub fn tiny_string_deflate (data: String, dict: Vec<String>) -> String {
let mut compressed: String = data;
let mut i: u32 = 0;
for slot in dict {
let r: String = std::char::from_u32(128 + i).unwrap().to_string();
compressed = compressed.replace(&slot, &r);
i += 1;
}
compressed
}
pub fn tiny_string_inflate (data: String, dict: Vec<String>) -> String {
let mut compressed: String = data;
let mut i: u32 = 0;
for slot in dict {
let r: String = std::char::from_u32(128 + i).unwrap().to_string();
compressed = compressed.replace(&r, &slot);
i += 1;
}
compressed
}