String 压缩字符串

String 压缩字符串,string,compression,String,Compression,在采访中有一个关于压缩字符串的常见问题。 我不是在寻找代码,我只需要一个有效的算法来解决这个问题 给定一个字符串(例如aaabbcaadd),压缩它(3a2b2c3a2d)。 我的解决方案: 用绳子旅行。每次我看到同一封信,我就数它。 当我看到一个不同的字母出现时,我将输出字母和计数器(然后重新开始) 有没有更有效的方法 感谢许多压缩算法都是基于。这就是我在采访中给出的答案许多压缩算法都基于此。这就是我在一次采访中给出的答案,这就是所谓的运行长度编码,而你命名的算法基本上是你能得到的最好的算法。

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

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

我的解决方案:

用绳子旅行。每次我看到同一封信,我就数它。 当我看到一个不同的字母出现时,我将输出字母和计数器(然后重新开始)

有没有更有效的方法


感谢

许多压缩算法都是基于。这就是我在采访中给出的答案

许多压缩算法都基于此。这就是我在一次采访中给出的答案,这就是所谓的运行长度编码,而你命名的算法基本上是你能得到的最好的算法。它需要O(1)个辅助存储器(保存最后看到的符号,或等效地检查即将出现的元素;还保存一个计数器,记录您看到的相同符号的数量),并以O(n)时间运行。由于您需要至少检查一次每个符号以了解结果,因此无论如何,您不会得到比O(n)时间更好的结果。此外,它还可以一次处理一个符号流,一次输出一个符号,所以实际上只需要O(1)RAM

您可以使用许多技巧来更好地获得常数因子,但算法基本上保持不变。这些伎俩包括:

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

如果您的数据源速度较慢,那么这种微观优化可能没有意义。对于优化级别,我在地址上面提到的一些要点,即使是RAM也可能算是慢的。

这就是所谓的运行长度编码,而您命名的算法基本上是您将得到的最佳算法。它需要O(1)个辅助存储器(保存最后看到的符号,或等效地检查即将出现的元素;还保存一个计数器,记录您看到的相同符号的数量),并以O(n)时间运行。由于您需要至少检查一次每个符号以了解结果,因此无论如何,您不会得到比O(n)时间更好的结果。此外,它还可以一次处理一个符号流,一次输出一个符号,所以实际上只需要O(1)RAM

您可以使用许多技巧来更好地获得常数因子,但算法基本上保持不变。这些伎俩包括:

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

如果您的数据源速度较慢,那么这种微观优化可能没有意义。对于优化级别,我上面提到的一些要点,即使是RAM也会被认为很慢。

如果字符串足够长,请使用Lempel Ziv压缩。。优点是:它不仅可以缩短明显的重复,而且可以有效地“分组”重复。看

一个模糊的例子——这样你就明白了:
aaabqxyzaatuoiaabhaaaabi将被压缩为:
A
bqxyz
A
tui
B
h
B
i

其中[
A
=aaa]&[
B
=
A
B=aaab]

如果字符串足够长,请使用Lempel Ziv压缩。。优点是:它不仅可以缩短明显的重复,而且可以有效地“分组”重复。看

一个模糊的例子——这样你就明白了:
aaabqxyzaatuoiaabhaaaabi将被压缩为:
A
bqxyz
A
tui
B
h
B
i

其中[
A
=aaa]&[
B
=
A
B=aaab]

@Wug-Huffman编码不会给出问题中指定的结果。您是在要求一个好的压缩算法,还是一个生成特定压缩的算法(运行长度编码,这就是您的示例输出)?@delnan用于特定压缩。。这就是为什么我没有使用哈夫曼。如果字符串包含一个数字,会发生什么?@IliaJerebtsov您可以忽略数字,或者假设不会有数字。@Wug-Huffman编码不会给出问题中指定的结果。您是要一个好的压缩算法,还是要一个生成特定压缩的算法(运行长度编码,这就是示例输出)?@delnan用于特定压缩。这就是我没有使用哈夫曼的原因。如果字符串包含数字会发生什么?@IliaJerebtsov你可以忽略数字,或者假设没有数字。它们是吗?今天广泛传播的档案中使用的算法似乎有很大的不同。如果你在采访中告诉我,我仍然会看着你再一次,AFAIK所有最广泛使用的压缩算法都与它无关,虽然哈夫曼编码有一些变体,这是一个很好的学习示例(它非常有启发性,我喜欢剖析它),它基本上只是一个庞大的压缩算法树中的一个小家族。它们是吗?今天广泛传播的档案中使用的算法似乎有着显著的不同。如果你在采访中告诉我,我仍然会困惑地看着你。再说一次,所有最广泛使用的压缩算法都与它无关,而这里有一些哈夫曼编码的变体,这是一个很好的学习示例(这非常有启发性,我喜欢剖析它),它基本上只是一个庞大的压缩算法树中的一个小家族。