Кодовая строка

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Кодовая строка

Сообщение Cryonyx » 30.05.2005 (Пн) 18:37

Привет всем. Мне собственно нужно вот что:
Есть набор различных подстрок, входящих в исходную строку, и есть их частоты, вычисленные по LZW. Как лучше всего на их основе сгенерировать коды, которые бы, по Хаффману, были наименьшей длины для наиболее часто встречающихся подстрок и наибольшей - для наиболее редких. И ещё - как это потом скомпоновать в результирующую строку таким образом, чтобы можно было потом эти коды выковырять. :D
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.05.2005 (Пн) 18:58

Ищи где-нибудь на algolist.manual.ru
Алгоритм существует, но я его помню весьма приблизительно. Строится какое-то дерево, 1 в коде - спуск по левому ребёнку, 0 - по правому, или типа того. Получается легковыковыриваемый префиксный код :-)
Изображение

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 30.05.2005 (Пн) 19:46

Это Хаффман и есть. Дело здесь не столько в том, чтобы сгенить коды, а в том, чтобы сгенить их так, что потом легко будет выковырнуть из код-строки. К примеру, у нас есть коды 11, 100, 101, 1000...
Если мы просто запихнём их в код-строку, то получим примерно следующее: 111001011000... А отсюда выдрать коды фактически невозможно. Если же делать разделитель, скажем, "00", то нужно следить, чтобы в кодах этот разделитель не встречался, понимаешь?
В общем, я такой алг накидал, но он очень быстро приводит к переполнению буфера :( Примерно при 30-40 различных кодах. Вот я и хочу это как-то обойти..
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.05.2005 (Пн) 22:14

Cryonyx, Хаффман даёт префиксный код. Т.е. коды 100 и 1000 одновременно получиться не могут.
Префиксный код можно записывать в строку безо всякого разделителя, и однозначно потом восстановить.
Перечитай Алголист, а? ;-)
Изображение

Arcanoid
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 162
Зарегистрирован: 01.01.2005 (Сб) 15:44

Сообщение Arcanoid » 31.05.2005 (Вт) 7:56

Надо в результирующую строку ещё и структуру дерева запихать чтобы можно было коды потом достать.. по крайней мере так в JPEGе делается.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 31.05.2005 (Вт) 11:15

Arcanoid писал(а):Надо в результирующую строку ещё и структуру дерева запихать чтобы можно было коды потом достать.. по крайней мере так в JPEGе делается.

Вовсе не обязательно. В Deflate, например, предопределённое дерево, и его не надо передавать со строкой.
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 165

    TopList