字符串编码用于内存优化

String encoding for memory optimization

本文关键字:优化 内存 用于 编码 字符串      更新时间:2023-10-16

我在格式中具有类似于 a:bd:at:wi:r等类似的字符串流。

我正在尝试编码:

a:b -> 1
d:a -> 2
etc.

我的目的是使最终字符串尽可能小,以节省内存。因此,我需要给单位值以最大次数的字符串。

我有以下方法:

创建:map<string, int>-这将保持字符串及其计数。最后,我将以1的最大计数替换字符串,接下来使用2,依此类推,直到地图的最后一个元素。

当前最终字符串的大小为约100,000个字符。

我无法妥协速度,请建议如果有人有更好的技术来实现这一目标。

如果我正确理解您的输入字符串是范围" a:a":a" ..." z:z",您只需要计算流中每个的外观,无论如何订单。如果您的分布足够,则可以使用UINT16_T来计数它们。地图是使用树实现的,因此数组在内存和时间上都比地图更有效。因此您可以定义数组

array<array<uint16_t, 26>, 26> counters = {{}};

,假设您的输入是input = "c:d",则可以填充数组如下

    counters[input[0]-'a'][input[2]-'a']++;

然后,您可以打印出输入的频率

for (auto i=0; i < counters.size() ; ++i) {
  for (auto j=0; j < counters[i].size(); ++j) {
    cout<<char(i+'a')<<":"<<char(j+'a')<<" "<<counters[i][j]<<endl;
  }
}