从多个字符串中,有效地构建具有跨度的单个缓冲区

From multiple strings, efficiently build single buffer with spans to it

提问人:Lukáš Kužel 提问时间:11/11/2023 更新时间:11/11/2023 访问量:62

问:

我正在尝试找到一种体面的算法来有效地创建不可变的字符串缓冲区。 我有一个字符串值数组,我希望将它们转换为指向单个缓冲区的string_view。

我可以通过简单地将输入字符串附加到单个字符串中来做到这一点,但我希望通过排列尽可能少重复子字符串的输入字符串来使结果字符串尽可能小。

下面是一个实际的例子:

inputs:
  settings
  array
  node_data
  raycast
  dataset
  ray

output buffer:
  arraycastnode_datasettings

output_spans:
....................settings
..array.....................
...........node_data........
....raycast.................
................dataset.....
....ray.....................

为了可视化,缩进output_spans以显示它们在主缓冲区中的起始位置。根据设计,输出值必须与输入完全相同。

下面是一个 C++ 示例:

std::vector<std::string> inputs{"settings","array","node_data","raycast","dataset","ray"};

std::vector<std::string_view> outputs;

// mainBuffer will be: arraycastnode_datasettings
std::string mainBuffer = CompressStrings(std::move(inputs), outputs);

有人知道算法名称或更好的是实现这一点的库吗? 这似乎是相当简单的压缩,我敢肯定 60 年代的某个人已经写过一些关于这个的东西。

C++ 压缩

评论

2赞 Artyer 11/11/2023
根据<en.wikipedia.org/wiki/...>,这是NP硬的。将其实现为查找最低权重集覆盖的方法可能会有一些库来完成繁重的工作。
0赞 Lukáš Kužel 11/11/2023
谢谢@Artyer最短的公共超弦正是我一直在寻找的。请将其作为答案发布。

答: 暂无答案