在采访中有一个关于压缩字符串的常见问题。 我不是在寻找代码,我只需要一种能够解决问题的高效算法。
给定一个字符串(例如aaabbccaaadd ),压缩它( 3a2b2c3a2d )。
我的解决方案:
在绳子上旅行。每当我看到同一封信,我都会相信它。 当我看到一封不同的信件(并重新开始)时,我会输出信件和柜台。
有更有效的方法吗?
由于
答案 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。这就是我在面试中给出的答案