LZW Compression In Lua

喜夏-厌秋 提交于 2019-11-27 08:36:04

问题


Here is the Pseudocode for Lempel-Ziv-Welch Compression.

 pattern = get input character
 while ( not end-of-file ) {
     K = get input character
     if ( <<pattern, K>> is NOT in 
             the string table ){
         output the code for pattern
         add <<pattern, K>> to the string table
         pattern = K
     }
     else { pattern = <<pattern, K>> }
 }
 output the code for pattern
 output EOF_CODE

I am trying to code this in Lua, but it is not really working. Here is the code I modeled after an LZW function in Python, but I am getting an "attempt to call a string value" error on line 8.

 function compress(uncompressed)

 local dict_size = 256
 local dictionary = {}

 w = ""
 result = {}
 for c in uncompressed do
  -- while c is in the function compress
     local wc = w + c
     if dictionary[wc] == true then
         w = wc
     else
         dictionary[w] = ""
         -- Add wc to the dictionary.
         dictionary[wc] = dict_size
         dict_size = dict_size + 1
         w = c
    end
 -- Output the code for w.
 if w then
   dictionary[w] = ""
 end
 end
 return dictionary
 end

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

I would really like some help either getting my code to run, or helping me code the LZW compression in Lua. Thank you so much!


回答1:


Assuming uncompressed is a string, you'll need to use something like this to iterate over it:

for i = 1, #uncompressed do
  local c = string.sub(uncompressed, i, i)
  -- etc
end   

There's another issue on line 10; .. is used for string concatenation in Lua, so this line should be local wc = w .. c.

You may also want to read this with regard to the performance of string concatenation. Long story short, it's often more efficient to keep each element in a table and return it with table.concat().




回答2:


You should also take a look here to download the source for a high-performance LZW compression algorithm in Lua...



来源:https://stackoverflow.com/questions/11744573/lzw-compression-in-lua

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!