|
ZX Review
#7-8-9-10
08 ноября 1997 |
|
Этюды - Процедура составления оптимальной таблицы символов.

(c) Татаринов М., г.Соликамск Хочу предложить процедуру, которая будет полезна создате- лям компрессоров, использующих алгоритм Хаффмана (битовая ком- прессия). Как известно, подобный метод требует наличия справочной таб- лицы символов. Чем меньше бу- дет номер символа в таблице, тем меньше потребуется бит для коди- ровки этого символа. Данная про- цедура составляет для каждого файла оптимальную таблицу. Программа работает следующим образом: первым делом подсчиты- ваются коэффициенты повторения каждого символа в файле, за- тем коэффициенты сортируются, и идентификаторы этих коэффициен- тов упаковываются в таблицу. Программа для работы требует буфер, максимальный размер кото- рого равен 3*256=768 байт (т.е., если в файле 256 различных сим- волов. 3 - это размер одной за- писи в буфере). Таблица будет записана также в начало буфера. 140. ;Программа для составления ;таблицы ;(C) Mat Software'96 MKTREE LD A,#FF LD (TSIZE),A LD D,0 ;начальный символ - 0 LD IX,(TREE) ;адрес буфера AG LD HL,(RAW) ;адрес файла LD BC,(LEN) ;длина файла CALL ONE LD A,D CP #FF ;все символы проверены? JR NC,SORT ;да - идем на сортировку. INC D ;иначе - повтор для всех 256 JR AG ONE XOR A LD (PEP),A LD (PEP+1),A SEEK LD A,(HL) CP D JR NZ,NXT PUSH HL LD HL,(PEP) INC HL LD (PEP),HL POP HL NXT LD A,B OR C JR Z,EOF DEC BC INC HL JR SEEK EOF LD HL,(PEP) LD A,H OR L RET Z LD (IX+0),D LD (IX+1),L LD (IX+2),H LD BC,3 ADD IX,BC LD HL,TSIZE INC (HL) RET ;Процедура сортировки символов SORT LD A,(TSIZE) LD B,A PS2 LD IX,(TREE) LD A,(TSIZE) LD C,A PS1 LD D,(IX+2) LD E,(IX+1) LD H,(IX+5) LD L,(IX+4) AND A SBC HL,DE JR C,NOPF PUSH BC LD A,(IX+3) LD B,(IX+0) LD (IX+0),A LD (IX+3),B LD A,(IX+4) LD B,(IX+1) LD (IX+1),A LD (IX+4),B LD A,(IX+5) LD B,(IX+2) LD (IX+2),A LD (IX+5),B POP BC NOPF LD DE,3 ADD IX,DE DEC C JR NZ,PS1 DJNZ PS2 ;формирование таблицы FORM LD A,(TSIZE) LD IX,(TREE) LD HL,(TREE) LD B,A ALL LD A,(IX+3) INC HL LD (HL),A LD DE,3 ADD IX,DE LD A,B ;вместо DJNZ! AND A RET Z DEC B JR ALL ;переменные: RAW DW 0 ;адрес файла TREE DW 0 ;адрес буфера LEN DW 0 ;длина файла PEP DW 0 ;рабочая пере- ;менная TSIZE DB 0 ;размер таблицы, ;причем если TSIZE=0, то ;размер - 1 байт. 2 Теперь немного о странном на- чальном значении TSIZE - #FF (-1). Логичнее, казалось бы, ус- тановка TSIZE в 0. Однако, если в файле будет содержаться макси- мум - 256 различных символов, то TSIZE, установленный в 0, на вы- ходе даст тоже 0, поэтому прихо- дится так изворачиваться. И еще: процедура компрессора, преобразующая код символа в его номер в таблице, тоже может сра- ботать ошибочно при TSIZE = max, поэтому придется в ней DJNZ за- менить на: LD A,B AND A JR NZ,XXXX Это, конечно, если Вы не наш- ли в вашей процедуре лучший ме- тод. А вообще-то можно обойтись без ухищрений: надо размер TSIZE определить не в байт, а в слово. Тогда, правда, придется жертво- вать дополнительной регистровой парой, а значит, неизбежны вся- кие PUSH'ы и POP'ы, замедляющие и без того медленную программу. Кстати, о скорости. В моей про- цедуре компрессии большую часть времени отнимало составление таблицы. Очень много времени уходит на сортировку, поэтому метод, предложенный выше, жела- тельно заменить на более быстрый (типа алгоритмов Шелла и "пу- зырька". Советую прочитать в ZX РЕВЮ N5, 1994 статью о методах сортировки). Прим. ред.: Одним из наиболее быстрых способов сортировки является метод "быс- трой сортировки Хоара". * * *
Другие статьи номера:
Похожие статьи:
В этот день... 1 января
SibNews #08,
Woot! #01,
Spectrum Magazine #01,
ACNews #25,
Psychoz #14,
ACNews #14,
Last 128 #08,
Last 128 #06,
Last 128 #05,
Last 128 #04,
Last 128 #03,
Last 128 #02,
Last 128 #09,
Last 128 #3.5,
Last 128 #8.025,
Sinclair Club #05,
Last 128 #M!R 01,
Fantadrom #01,
Buzz #20,
Last 128 #01,
DonNews #13,
Nicron #120,
Promised Land #01,
Inferno #01,
Marazm #25,
Ultimathum #01,
Marazm #21,
Hooy Mag #02,
KrNews #11,
Marazm #22,
Marazm #23,
ZX Football 2000 #01,
Codemania #01,
Always #03,
Bugs #02,
IzhNews #08,
Virtual Worlds #01,
Listok #04,
Scenergy #02,
Flash Info #18,
Marazm #16,
Marazm #17,
Zed #01,
Balagan #02,
ZX Format #08,
ZX Power #03,
Shock #01,
Impulse #02,
Deja Vu #03,
ZX Club #08,
ZX Club #06,
Numberology #01,
Marazm #13,
Marazm #12,
Marazm #14,
Gorodok #02,
Zodiac #01,
Marazm #15,
Deja Vu #07,
Marazm #11,
Deja Vu #07,
Playboy #03,
Crazy News #2,
Crazy News #4,
ZX Light #01,
Crazy News #5,
Playboy #02,
ZX News #03,
ZX Review #1-2,
Read Me #02,
Crazy News #3,
Nicron #13,
Read Me #01,
Public Spirit #01,
Faultless #06,
Faultless #05,
ZX Software #01,
Stump #04,
Speccy #07,
Возраждение #0,
Speccy #03,
On-Line #17,
Scene+ #01,
Welcome Press #01,
ZX Konig #04,
Adventurer #01,
Faultless #05,
Faultless #04,
Di Halt #01,
Faultless #01,
Playboy #01,
Crazy News #1,
Faultless #03,
Pioneer #03,
Sinclair Town #02,
ZX Magazine #01,
Eldorado #01,
ZX Magazine #02,
Spectron #01,
ZX News #01,
ZX Konig #02,
200 #W,
Welcome Press #00,
Dune #07,
Subliminal Extacy #01,
Subliminal Extacy #02,
ZX Konig #01,
Subliminal Extacy #00,
Muchomor #01,
Spectrofon #01,
ZX Revija #02,
Outlet #01,
Outlet #1-3