压缩字符串

时间:2012-10-26 19:47:30

标签: string compression

在采访中有一个关于压缩字符串的常见问题。 我不是在寻找代码,我只需要一种能够解决问题的高效算法。

给定一个字符串(例如aaabbccaaadd ),压缩它( 3a2b2c3a2d )。

我的解决方案:

  

在绳子上旅行。每当我看到同一封信,我都会相信它。   当我看到一封不同的信件(并重新开始)时,我会输出信件和柜台。

有更有效的方法吗?

由于

3 个答案:

答案 0 :(得分:6)

这称为运行长度编码,您命名的算法基本上是您获得的最佳算法。它需要O(1)辅助存储(保存最后看到的符号,或者等效地检查即将到来的元素;还保存一个计数器,显示你看过多少个相同的符号)并在O(n)时间内运行。由于您需要至少检查一次符号以了解结果,因此无论如何都不能比O(n)时间好。更重要的是,它还可以一次处理一个符号流,并一次输出一个符号,因此实际上只需要O(1)RAM。

你可以采用一些技巧来更好地获得常数因子,但算法基本保持不变。这些技巧包括:

  • 如果您流式传输到慢速目标(如磁盘或网络),请缓冲。广泛。
  • 如果您期望长时间运行相同的符号,您可以对计算它们的循环进行矢量化,或者至少通过移出其他情况使该循环更紧密。
  • 如果适用,请告诉编译器不要担心输入和输出指针之间的别名。

如果您的数据源很慢,那么这种微优化可能没有实际意义。对于优化级别,我的一些点在上面解决,即使RAM也可以算慢。

答案 1 :(得分:1)

如果您的字符串足够长,请使用Lempel Ziv压缩。优点是:它不仅可以缩短不同的重复次数,还可以有效地缩短重复次数。见wikipedia: Lempel-Ziv-Welch

一个模糊的例子 - 这样你就可以得到这个想法:
aaabqxyzaaatuoiaaabhaaabi将被压缩为:
A {bqxyz {1}} {TUI {1}} {ħ{1}}我
其中[A = aaa]& [B = B b = aaab]

答案 2 :(得分:0)

许多压缩算法都基于Huffman Coding。这就是我在面试中给出的答案