Сжатие LZW в Lua

Вот псевдокод для сжатия Лемпеля-Зива-Уэлча.

 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

Я пытаюсь закодировать это в Lua, но на самом деле это не работает. Вот код, который я смоделировал на основе функции LZW в Python, но я получаю сообщение об ошибке «попытка вызвать строковое значение» в строке 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)

Мне бы очень хотелось, чтобы кто-нибудь помог мне запустить мой код или помог мне закодировать сжатие LZW в Lua. Большое спасибо!


person Nicholas Rubin    schedule 31.07.2012    source источник
comment
Возможный дубликат: сжатие данных LZW в Lua   -  person Martin Schröder    schedule 31.07.2012
comment
возможный дубликат сжатия данных LZW в Lua   -  person JosephH    schedule 31.07.2012


Ответы (2)


Предполагая, что uncompressed является строкой, вам нужно будет использовать что-то вроде этого, чтобы перебрать ее:

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

В строке 10 есть еще одна проблема; .. используется для объединения строк в Lua, поэтому эта строка должна быть local wc = w .. c.

Вы также можете прочитать это относительно производительности конкатенации строк. Короче говоря, зачастую более эффективно хранить каждый элемент в таблице и возвращать его с помощью table.concat().

person furq    schedule 31.07.2012
comment
Извините, я новичок в этом... Но что должно быть после комментария --etc? Большое спасибо! - person Nicholas Rubin; 31.07.2012
comment
Запускается без ошибок! Благодарю вас! Теперь моя небольшая проблема заключается в том, что она печатает таблицу: 0x7861e7f0... спасибо! - person Nicholas Rubin; 31.07.2012
comment
Кроме того, я попытался изменить «возвратный словарь» на «возврат w» и переместил его внутрь цикла for, но теперь он печатает только T. - person Nicholas Rubin; 31.07.2012
comment
return table.concat(dictionary) выведет его в виде строки. - person furq; 31.07.2012
comment
Сейчас печатает, ничего. - person Nicholas Rubin; 31.07.2012
comment
A) убедитесь, что вы вернули его из цикла (B) почему вы продолжаете очищать словарь (dictionary[w] =)? - person mackworth; 31.07.2012
comment
Я удалил его из цикла, все равно то же самое. Удаление оператора if, в котором я очищаю словарь, не меняет его. Он до сих пор печатает Т. - person Nicholas Rubin; 31.07.2012

Вы также должны посмотреть здесь, чтобы загрузить источник для высокопроизводительного алгоритма сжатия LZW в Lua...

person mackworth    schedule 31.07.2012
comment
Ах, но это показывает некоторые хорошие методы Lua, которые могут быть полезны. - person mackworth; 31.07.2012
comment
Также обратите внимание, что его лицензия — GPL версии 2. - person Perry; 01.02.2014