Algorithm 算法的大O复杂性——LZW和Huffman

Algorithm 算法的大O复杂性——LZW和Huffman,algorithm,compression,big-o,time-complexity,space-complexity,Algorithm,Compression,Big O,Time Complexity,Space Complexity,Lempel-Ziv-Welch和Huffman压缩算法在空间和时间上的复杂性是什么?谷歌让我失望了 谢谢 Francisco取决于实施情况。他们一直在进步。“哈夫曼”这个词有点太常见了。例如,你可以指一棵显式树,一棵隐式树,一棵动态树。。。 但是在任何情况下,我想如果你做得非常聪明,你应该能够在O(n)上实现几乎所有的“哈夫曼”,n是文本长度 LZW也依赖于实现。我不知道“O”的常见实现有什么。我想对于大的表,您可能会有类似于O(n log n)的内容,但这只是一个猜测。因为字典大小是固定的,

Lempel-Ziv-Welch和Huffman压缩算法在空间和时间上的复杂性是什么?谷歌让我失望了

谢谢


Francisco取决于实施情况。他们一直在进步。“哈夫曼”这个词有点太常见了。例如,你可以指一棵显式树,一棵隐式树,一棵动态树。。。 但是在任何情况下,我想如果你做得非常聪明,你应该能够在O(n)上实现几乎所有的“哈夫曼”,n是文本长度


LZW也依赖于实现。我不知道“O”的常见实现有什么。我想对于大的表,您可能会有类似于O(n log n)的内容,但这只是一个猜测。

因为字典大小是固定的,并且与输入长度无关,所以是以O(n)为单位的,因为每个字节只读取一次,每个字符的操作复杂性是恒定的


也是O(n):首先计算每个输入字节的出现次数,然后对其进行排序并构建输出编码。

您是否考虑了实现?请发布代码。你只需要对字节的频率进行排序,而不是文本本身,对吗?因此,对于一个恒定的字母表来说,哈夫曼应该是文本大小的O(n)。@Igor Nazarenko:是的,需要对字母表进行排序。谢谢你的评论。LZW压缩字典有树字符。如果相应地存储,则字典可以每个输入字节遍历一个节点,基本上使压缩算法基于输入长度进行O(n)-时间。以这种方式存储字典可能会浪费大量内存,因此这是通常的速度-空间权衡,并且内存高效的实现可能至少是O(n logn),如您所述。O(n)超过输入长度?这棵树会有多大?超过O(n)?不可能,因为写一棵比O(n)大的树需要更多的时间。因此,为什么这个O(n)字典浪费空间?O(n)听起来非常理想。假设字典需要10字节的输入字符,这是一个很大的内存,但如果它值得的话。。。因此我的问题是:它真的是O(n)吗?考虑到新的输入值,问题是从一个节点到下一个节点。让那部分变成O(1)是个诀窍。我怀疑,如果不让每个树节点像哈希表一样工作,或者仅仅拥有一个长度等于字母表大小的数组,这是很容易做到的。哈希表仍然可以是O(1),但仍然存在着臭名昭著的常数因子和可能必须增长表的开销。顺便说一句:如果你允许树无限增长,它的节点数将等于输入长度。@Wormbo:啊,这就是你的意思。除此之外还有其他一些技巧。这是我所知道的一个例子,我相信这也可以(而且很可能)应用于LZW。