【问题标题】:LZW Data Compression In Lua [duplicate]Lua中的LZW数据压缩[重复]
【发布时间】:2012-08-01 01:27:07
【问题描述】:

可能重复:
LZW Compression In Lua

这是我在 Lua 中使用 LZW 压缩方法压缩数据的代码。我的问题是该函数返回字符“T”,而不是返回完整的压缩字符串“TOBEORNOTTOBEORNOT”。谢谢!

 function compress(uncompressed)
 local dict_size = 256
 local dictionary = {}
   w = ""
   result = {}
     for i = 1, #uncompressed do
       local c = string.sub(uncompressed, i, i)
       local wc = w .. c
       if dictionary[wc] == true then
           w = wc
       else
           dictionary[w] = ""
           dictionary[wc] = dict_size
           dict_size = dict_size + 1
           w = c
       end
     if w then
       dictionary[w] = ""
     end
     return w
   end
 end

 compressed = compress('TOBEORNOTTOBEORTOBEORNOT')
 print(compressed)

【问题讨论】:

  • 可能重复:LZW Compression In Lua
  • 两个关于同一个算法的问题,奇怪的是使用相同的示例文本进行压缩。这是作业吗?

标签: function dictionary lua compression lzw


【解决方案1】:

只是一个提示:你 return w 在 for 循环中

编辑一些解释

如果您在循环中返回结果,则循环将只进行一次迭代。在第一次迭代结束时,您的函数将完成。这是没有意义的。所以你的 return 语句应该在 for 循环之后。

另外,你声明一个变量result = {} 然后你从不使用它是很可疑的。

所以我建议您将 return 语句放在循环之后,并在每次迭代结束时打印变量的值(您可以将 print 语句放在您现在拥有 return 的位置),这样您就可以看看到底发生了什么。

【讨论】:

  • 'return w' 在 for 循环中,不是吗?
  • return 语句应该在循环之后,请参阅我添加到答案中的解释
  • 感谢您的解释。我放了一些打印语句,它正在打印我想要的。 'WC' 打印出“T TO OB BE EO OR RN NO OT TO OB BE EO OR RN NO OT T”。既然有了这个,应该返回什么?
  • 如果print(w) 在最后一次迭代结束时打印TOBEORNOTTOBEORNOT,则在循环后执行return w
  • 将 print(w) 放在 for 循环中,在 if 语句结束后 - 打印“TOBEORNOTTOBEORNOT nil”(每个字母在单独的行上)。如果我将 return w 放在与 print(w) 相同的位置,则在 if 语句在 for 循环内结束后,它只会打印“T”。将 return w 放在 for 循环之外/之后会打印相同的“T”。
猜你喜欢
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
相关资源
最近更新 更多