Автор Тема: Алгоритмы сжатия информации  (Прочитано 10597 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Алгоритмы сжатия информации
« : 26 Апрель 2009, 20:44:03 »
Занимаюсь написанием своих программ под приставочное железо, но столкнулся с проблемой

имеется пространство в 1 мегабайт, а нужно уместить данных на 2 мегабайта
но данные имеют свойство повторяться или быть очень похожими
вот пример:

00003236223642465246223762371247
52471246424713477247723672370347
00005246334652471347334772472348
00000000000000000000000000000000
00003346524742473347134723480000
00000000000000000000000000000000
00003346134633471347234723486348
00000000000000000000000000000000
00000347134633462347134733472348
72476348535813580000000000000000
00002347334633472348035863483348
53584358135800000000000000000000
00003346234772465246334762474247
03472348634873470358435853570000
00005246134603464246424703472347
33477347000000000000000000000000

да видно что 0 повторяются, но избавление от них в общей массе дает процентов 20% сжатия, нужно 50%

может кто знает и посоветует метод и алгоритм его реализации?
желательно для M68K

ну в сеге там разные бывают алгоритмы сжатия графики - вот ченить из этой серии бы мне :?

Оффлайн Йобан Матич

  • Emu-Land Team
  • Сообщений: 2593
  • Пол: Мужской
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #1 : 26 Апрель 2009, 20:49:03 »
Можно скомбинировать пару методов: нули пожать с помощью RLE, остальное хаффманом или LZx.

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #2 : 26 Апрель 2009, 21:01:58 »
А ченить типа примера как это реализовать нет? :?

Вот еще такие данные
04000401040204030404040504060407
04080409040A040B040C040D040E040F
04100411041204130414041504160417
04180419041A041B041C041D041E041F
04200421042204230424042504260427
04280429042A042B042C042D042E042F
04300431043204330434043504360437
04380439043A043B043C043D043E043F
04400441044204430444044504460447
04480449044A044B044C044D044E044F
04500451045204530454045504560457
04580459045A045B045C045D045E045F
04600461046204630464046504660467
04680469046A046B046C046D046E046F
04700471047204730474047504760477
04780479047A047B047C047D047E047F
04800481048204830484048504860487
04880489048A048B048C048D048E048F
04900491049204930494049504960497
04980499049A049B049C049D049E049F
04A004A104A204A304A404A504A604A7
04A804A904AA04AB04AC04AD04AE04AF
04B004B104B204B304B404B504B604B7
04B804B904BA04BB04BC04BD04BE04BF
04C004C104C204C304C404C504C604C7
04C804C904CA04CB04CC04CD04CE04CF
04D004D104D204D304D404D504D604D7
04D804D904DA04DB04DC04DD04DE04DF
04E004E104E204E304E404E504E604E7
04E804E904EA04EB04EC04ED04EE04EF
04F004F104F204F304F404F504F604F7
04F804F904FA04FB00

Оффлайн lupus

  • Пользователь
  • Сообщений: 3830
  • Пол: Мужской
  • man with no face
    • ВКонтакте
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #3 : 26 Апрель 2009, 21:11:25 »
http://shedevr.org.ru/forum/viewtopic.php?t=3590 - хорошая дока по алгоритмам

Оффлайн Йобан Матич

  • Emu-Land Team
  • Сообщений: 2593
  • Пол: Мужской
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #4 : 26 Апрель 2009, 21:16:12 »
http://ru.wikipedia.org/wiki/Код_Хаффмана
http://ru.wikipedia.org/wiki/LZW =)

sergi,
тебе в ROM или в RAM надо затолкать 2Мб ?


Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #5 : 26 Апрель 2009, 21:18:06 »
Ну это из ром брать и в рам засовывать нужно кусками по 8 килобайт
т.е. в реале каждые 8 килобайт пожать до 4-х
просто в роме места на метр, а данных нужно метра на 2 засунуть незапакованных, но есть несколько тысяч свободных тактов процессора, поэтому ищу распаковщик ибо запихать без запаковки очень сложно и много места потребует

Оффлайн Йобан Матич

  • Emu-Land Team
  • Сообщений: 2593
  • Пол: Мужской
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #6 : 26 Апрель 2009, 21:23:30 »
sergi,
Почему именно метр, хак делаешь?
Если SEGA, то может поковыряешь "Street Fighter" пятиметровый, может получится побольше места раздобыть =)

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #7 : 26 Апрель 2009, 21:32:20 »
Это не для сеги и не хак делаю, свой код пишу просто с 0, ну подспутно изучаю как там что

пишу в асме цифрами в хексе, поэтому конечно бы всего этого исходник иметь в асме
ну в общем я почитаю конечно, но может кто уже реально с этим сталкивался и есть типа опытных образцов?

в стрит файтере маппер стоит, перелопатьте ром в обычных но без маппера и без некоторых бойцов и все будет работать ;)
хотя игра чистый отстой SF2 Turbo на SNES лучше :-\

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #8 : 26 Апрель 2009, 21:49:59 »
Используй LZ + Huffman сверху. Для случаев, когда мало повторяющихся цепочек - просто хаффман.

Цитата
пишу в асме цифрами в хексе
Сам себе компилятор, что ли? о_О

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #9 : 26 Апрель 2009, 22:01:24 »
Так мне проще понимать суть вещей

я пытался конечно с компиляторами возиться, но получалось так что то что я хотел он не всегда видел

а самому проще, я еще и дизасемблер заодно
просто код перекидываю из цифр в буквы мнемоники даже свои сделал, ну точнее они немного полнее описывают что куда и откуда ложиться
есть еще сводные таблицы опкодов для M68K и Z80

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

в общем нужно попробовать конечно мне сделать эти типы сжатия
одно только еще интересно что zip жмет как раз гдето в 2 раза это дело, поэтому есть к чему стремиться ^_^

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #10 : 26 Апрель 2009, 22:42:53 »
Чувак, это путь в могилу. Разберись уж лучше с копмиляторами. И не надо придумывать своих мнемоник - те, что есть, не зря такие, они были очень хорошо продуманы.

Оффлайн Smoke

  • Пользователь
  • Сообщений: 3430
  • Пол: Мужской
  • Get Serious!
    • Steam
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #11 : 26 Апрель 2009, 23:26:32 »
sergi, RNC не пробовал?

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1292
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #12 : 27 Апрель 2009, 00:26:21 »
Хотел сказать RNC, пока читал тему, но полдня не мог зайти на форум :(
sergi, посмотри RNC, в инете есть паковщик под PC и процедуры распаковки для разных процев, т.ч. для 68-ки - в играх он и используется. Т.к. есть и паковщик и процедуры распаковки, тебе в общем-то не надо будет копать алгоритм.
Я разбирал процедуру распаковки и выяснил, что RNC - это LZ + Хаффман для кодирования ДЛИН указателей. Он достаточно быстрый. Если им не сможешь запихнуть свои 2 метра в 1, то с более сильными алгоритмами 68K вряд ли справится.

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #13 : 29 Апрель 2009, 18:46:20 »
В общем принцип любого сжатия информации заключается в том, чтобы повторяющиеся данные, заменить меньшим числом данных, а также данные встречающиеся по определенному закону тоже заменить на некоторое количество данных описывающих этот закон

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

Оффлайн HoRRoR

  • Пользователь
  • Сообщений: 983
  • Пол: Мужской
  • Ромхакер
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #14 : 29 Апрель 2009, 19:32:38 »
проблема в том что если буквально это будут разнобойные тупо разные байты идущие в разных порядках и не будут повторятся, то сжатия не будет никакого - некуда просто
Не все данные имеет смысл сжимать.

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #15 : 29 Апрель 2009, 20:53:22 »
Ну эти смысл конечно есть и нужно

в общем такой вариант есть и крутится  в голове

у меня не более 512 разновидноестей 2-х байтовых цепочек на 8 килобайт
поэтому обозначу каждую не 16 битами как они есть а всего лишь 9-ю
0x0000 обозначу как 000000000b
и тогда буду восстанавливать данные так
если 000000000b значит это начало, далее все как обычно но в соответствии с таблицей соответствия и последние нули учитывать не буду, т.к. они по умолчанию в памяти будут, а новые 9 нулей обозначат новую линию данных - там в общем по 16 2-х байтовых цепочек на линию

таким образом получится что освобождение от нулей даст процентов 20% сжатия
а 9 бит вместо 16 дадут соответственно гдето около 44% сжатия, получится в лучшем случае даже 64% на выходе, в худшем 44%
так будет в среднем 50% от исходного кода

не знаю как это будет называться. но чегото типа RLE+LZ77 :?

В принципе в начале каждой такой сборки по 8 килобайт, можно еще писать цифру
допустим 9 значит 9 бит на сцепку по 2 байта
ну и так от 0 до 16
т.е. 16 это и так понятно - оно и есть, можно не корячится
зато если допустим там только 0 и несколько значений всего, допустим 4 или 5, то соответственно можно и 2-3 бита на сцепку по 2 байта взять и указать в начале байтом т.е. соответственно 02 или 03

если всего 256 оригинальных значений по 2 байта, то вообще 1 байтом менять, получится сжатие в 2 раза сместа

в общем я думаю если кому нужно то соответственно понятно расписано, хотя все это и так знают

В начале этих 8 килобайт должна быть такая инфа:
1 байт - сколько бит на сцепку по 2 байта
2 байта - сколько вообще оригинальных сцепок
сами сцепки по порядку начиная с 0000 обозначенная 000000000b и далее сколько их там будет по возрастанию( это будет в максимуме 512 по 2 байта = 1 килобайт)
а далее уже ужатая инфа по 9 бит, размер собственно четко обозначен
« Последнее редактирование: 29 Апрель 2009, 21:53:13 от sergi »

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1292
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #16 : 29 Апрель 2009, 22:30:03 »
Ну у тебя есть 9 бит вместо 16, а нужно 8, т.е. ужимать нужно не очень сильно. Отсюда и надо плясать.
Подойдёт нечто Хаффманоподобное и таблица 512*2 байта.

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #17 : 29 Апрель 2009, 22:36:21 »
Ну сложнее алгоритм пока мне не нужно, а то т.к. в асме для M68K пишу, сложнее мне сложно будет придумать и сделать, тут вроде можно просто через память и регистры перекинуть, ну по сдвигать придется конечно если брать по 72 байта чтоли получится брать нужно будет, ну там посмотрим на результат и на скорость выполнения его

сложнее и компактнее наверняка можно, но нужно ли еще вопрос :-\

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1292
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #18 : 29 Апрель 2009, 22:40:59 »
Но ужимать всё равно придётся, т.к.9 бит больше 8.
Короче, давай пример 8-кбайтового куска и таблицу 512*2, посмотрим.

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #19 : 29 Апрель 2009, 23:51:25 »
Ну больше, так больше 9 бит может быть кратным 8 при числе 72
т.е. берем 9 байт и там будет 8 наших уникальных идетнификаторов сцепок
т.е. брать нужно по 9 байт из этих 8 килобайт последовательно и вытягивать потихоньку

Вот сами 8 килобайт, ну там немножко меньше даже
выборки уникальных пока нет - позже сделаю

00002237623752471347424733477237
73486348034804595358234800000000
00000348234833471347634873480000
00000000000000000000000000000000
00003347134723487348000000000000
00000000000000000000000000000000
00003347234863487348535843590000
00000000000000000000000000000000
00002348634833487348535843590000
00000000000000000000000000000000
00002348634873485358435904590000
00000000000000000000000000000000
00003347234843586348535843590000
00000000000000000000000000000000
00002347334633472348634843585357
53580000000000000000000000000000
00001346334652462347334773475357
43580000000000000000000000000000
00005246134633464246234733470000
00000000000000000000000000000000
00005246134633462347634700000000
00000000000000000000000000000000
00004246524613462347000000000000
00000000000000000000000000000000
00004246134633462347000000000000
00000000000000000000000000000000
00000246424652461346334623470000
00000000000000000000000000000000
00004246524613463346234700000000
00000000000000000000000000000000
00004246524672461346334623470000
00000000000000000000000000000000
00005246724662473346234733470000
00000000000000000000000000000000
00007246334623473347135753570000
00000000000000000000000000000000
0000734903484249345A22382127156B
01366137502510244025602532367136
00003347234863487348334863492349
00000000000000000000000000000000
00007348634943595359535800000000
00000000000000000000000000000000
00006349045943595359000000000000
00000000000000000000000000000000
00004359535973590000000000000000
00000000000000000000000000000000
00004359535973593459245A00000000
00000000000000000000000000000000
0000435973595359635A000000000000
00000000000000000000000000000000
000043595358535973596359635A436A
00000000000000000000000000000000
00005358435863484359635973590000
00000000000000000000000000000000
00003347234713467347634753574358
53584359635900000000000000000000
00006347034723477347535743586348
23480000000000000000000000000000
00002347034733477347535743582348
00000000000000000000000000000000
00002347334773476348000000000000
00000000000000000000000000000000
00002347334773476348435800000000
00000000000000000000000000000000
00002347334763480000000000000000
00000000000000000000000000000000
00002347334723487347634800000000
00000000000000000000000000000000
00003347734723486348000000000000
00000000000000000000000000000000
00007347634843582348035853587348
00000000000000000000000000000000
0000312432366349535A546B60145135
03470348634832375248512322384248
000053597348535A1347323622365246
72485247223702364136424723473347
00006349045A23482237413661253124
21254135234771240236634713465135
00005359146A546A446B256B646B345A
356B645A046B33484248134803594359
00007359635A735A245A345A146A046A
046B446B646B546A245B535900000000
0000245A156A746A356A756A146A546A
557A457B067B267B446B256B767B568B
0000345A356A156A746A557A756A256A
067B457B546A667B467B167A178B767B
0000635A245A046A146A546A00000000
00000000000000000000000000000000
0000635A245A046A146A000000000000
00000000000000000000000000000000
0000735963594359635A3459245A046A
14695369436A00000000000000000000
00004359035843586359045953587359
34592459245A1469046A436A5369635A
00006348435873475358145804594359
24593459635973587359245A046A635A
00004358634823485358435963592459
34590000000000000000000000000000
00006348435954691469446A746A356A
646A057B646B157A346A447B246B2459
000023486359646A356A746A446A646B
346A146A046A436A23590359635A5369
00002348535813583459245904594359
256A446A54691469646A63597359046A
00004358634853584359000000000000
00000000000000000000000000000000
00004358535800000000000000000000
00000000000000000000000000000000
00004024123503471457545843481236
6349056A4248056B345A056C557C345B
00007236323571245247134853471459
756B167C645B3349635B735A535A446B
00007246223602353336634763482449
045A61265247745B546A156C457C756B
00007236134773485136513553573459
546A446B156A245A056B745A356A7459
000003584359245A046B424722364135
62352224023461240346634724585468
0000546A667A188A699C6AAC589C6AAD
5BBC589B535852477236513573477458
0000799B478B557A6AAD245973475346
545726694236155873485247067C778C
0000256A046A167A277B535954586459
25596359435903592349145873483348
0000046A63593348724722373569356A
457B557B656B156A256B056B645B056A
0000046A046953583347124771361135
31245246323505691457356A157B046B
00004247735814691135312412341235
42450457546A53591569546B656B635B
00003459035923480247256A446B157B
557B657C057B256C057C457C735A345A
0000735953586248346A024741366136
013631257469446914685469256B057B
00006359746A536A436A046A346A146A
635A245A546974596348334823486248
0000046A635903584358234833475357
23471357634753585246134603474247
00006359035823474246223632356246
52457235223523460346134662350235
00005358735933470247446A51352236
61363235623572355246623622350235
00005358724773473346134663475246
23474246623672350346034742473235
00002349245A3237524742482348435A
22370247424713473347034872370347
0000535A446B256C5359334873593459
72482349435953587348234863490348
0000067D256C245B245A5359635A2349
0359435A435973593459634973485358
0000546B146A345A546A536A046A635A
436A245A735953593459745A4359645A
000034592348223741363124156A6236
03470458167B567C356B345A468C146A
0000256C377B078D689E399C7AAC5BBC
2AAE1BBD1CBB5CBA089B49AB2BAB099B
0000777B177A788B59AC6AAD3A9D199D
199C0BBE1CBC7CBB5CBA6DBB1DBA4DBB
00005AAB699B788A677A567A457B646A
0BBC478B1CBB5AAA457A499A5CBA7BAA
0000156A546A146A356A746A046A0000
00000000000000000000000000000000
0000546A73595369436A746B157B046A
146A746A245A34594359535853592348
0000057B057C546A635A435923486248
43583347724703581347546923470347
0000635A446A63597248334853582459
23484359035833474358424713472237
0000746A245A53583347723633467235
14576235723452343235023522351234
00003347424642456235223532347234
22340234423412345234423502355235
00001346234752466236000000000000
00000000000000000000000000000000
00001346034642465245723562352235
02356236233600000000000000000000
00007234723513465246234753573347
62364246323552451234323402355235
00003346524542351457745862343223
22236123512271223222023412334122
00003236723652464247034713472236
62375135023671251235623652470000
00000348034703461235012430133012
00121011001151343011101070112000
00007348712413460013101120013001
00122000300072351123011212236000
000053581459345A7347134662362347
03473347123542460235723563477124
0000245A046A446A646A356A746A546A
645A3459535943590459145900000000
0000367A178A299B2AAC5BBB4CBB288A
4AAB656A7679646A76697779398A245A
00001DBA3CAA1CBB3B9A098A599A5AAB
47797669077A477A677A287A088A5779
00005CBA3B9A0A9A398A777A666A6BAB
5889656A467B256A446A54695779056A
0000256A056A446A046A546A146A356A
756A245A746A646B7359635A00000000
0000245A045863473348623762366235
02342459012371365135724723462223
00003346734772356236123462351345
41340234222452346124712342343223
00005357134622361345223502344123
51233223222472235233711231121223
00000346623502340235123452344234
42357234222432237123123352337223
00005234723503461346334652454246
22246124322371235123123402346224
00000346723562356236223552354235
52340235123432242224023442343223
00006236223541340234123342345233
52344235623522246224322302351234
00007234523412340234423562354234
22246224333432232335000000000000
00001345723452332223322251224122
12331222023372334233112152344234
00002237034713473347734723480236
22367236623652464246123532354247
00004247023501236012101000102000
63473124623630004246001200111011
00002000600040110112311261132112
41234012211351233000122332230223
00004124033553467347535813454458
53597459546A02357236524642470236
000043595359145934590459245A546A
446A645A6349046A0000000000000000
00007459645A446A056A256A756A3459
54690459245943596359535814580000
0000366A167A656A756A266A067A056A
645A446A745934592459045914586459
0000167A056A34595358734742476236
41356125123402354346712413450346
0000546A345973587247524661361134
63482235734763470235723514576458
00007358135762466235023422234135
21240224233614561457045774583459
00003223523433351346734714584359
63597359345904595458245914596459
00000234222321122335734604582459
14590459435923366236645973596359
00001222722371235234211224473335
25586346044674583557745724461445
00004234712361234123222351226112
21121222022341227112733463354345
00002224423562350223412371122223
51223112611333346335523423354345
00000235423422235122612341237123
53452335434613455233233433345344
00003223523423353335434653466347
03462446344654564457545764582447
00004235034513455245222402343223
12337123622422230223434652337223
00004135623662357123512270122001
30001012300220020001300120001000
00000234412360120011200130002000
10110111211111107000600040111000
00002000600030002112222303344345
61136335534523352113033573352224
00004235423613461347334763487347
04472447534603470234222461247123
000033480459446A1347535713465245
13457235623522350346524602353346
00004359134733472348634873474358
23475358145813463346045803475246
00001458245904593459535863487348
33474358034773470000000000000000
00000458134622366347645904592459
14593459635973595359435933472348
00001346734704587458645914583458
24593459635973594359535804594358
00003459245963597358435953584358
63485357734700000000000000000000
00003459735963592459435953581458
43585357734700000000000000000000
00002459635943595358435800000000
00000000000000000000000000000000
00003458344753460569745954691569
23483347723662360236123522364246
00006336233524473558023414580347
62360235234733465246424632352235
00004234412342352336334604571457
03474135234751347124734661240124
00000346523463471235712404587458
24586458546834576124513471235123
00006236034714581569034822351234
02346235222452347234233562244234
00001457134672351234023432237234
52344234334771242224534533343224
00002000600070000000000000000000
00000000000000000000000000000000
00006000700050104011000000000000
00000000000000000000000000000000
00006000111141237223423452343000
52331334233563357334022320007112
00004124123472351346244753454458
32253112401221135011211241230123
00004236134614573558145813472225
61254125712402353224512462354235
00000347045862360569445943480235
12346124222571246125623541240124
00002559145853476236612571246124
02352225623512345346134633464246
00000347634814575357623612350235
32352236424603461346334623476347
00007347634804584358634714575357
03471346723623472236023662365246
00007347535714576347045823470347
13466236223602367236524600000000
00006347734743470347534613460346
23360000000000000000000000000000
00002347424662363235223502355245
41355134312403467235234603471346
00000346023562351235222512347124
61256124523563474347233672356236
00005134723513463346234752464246
62365245623542457123513312336123
00000234023541241123512301240346
73461345424613463346434652453235
00000346623512344134712361244235
72340234023512335133322442343223
00002224423502357234623533357235
23350346434613454123612312335233
00004234712323351345534503456235
33356124512322244123012332236123
00002000600070003000501000000000
00000000000000000000000000000000
00006000700050101110011140110000
00000000000000000000000000000000
00005010700011100000000000000000
00000000000000000000000000000000
00004011211222235234333562360346
13464347233613450123200121136000
00005346434763471346623623360346
00000000000000000000000000000000
00001346634773470347723603464246
62360000000000000000000000000000
00006347034773471346723662364246
72350346000000000000000000000000
00006347734673470347134643470000
00000000000000000000000000000000
00002347634773470000000000000000
00000000000000000000000000000000
00006347034713463346034673460000
00000000000000000000000000000000
00000346623623361346000000000000
00000000000000000000000000000000
00005245723503464246623613466235
22351345123442453234000000000000
00005245023541346124222402347123
61231233513332232223523342346234
00001234523472346235723542350235
33351345233532242224612471235123
00005234123442356235723562360000
00000000000000000000000000000000
00001234623542352235424552453335
72351345034623460235623623364246
00005234123352451346045714576458
74580458535724587347334712355135
00005234612452337235534604570568
04580569245833475246723641356125
00005010700001114011211100000000
00000000000000000000000000000000
00007000401101115010111060011111
31117111611270010000000000000000
00005010401101117000000000000000
00000000000000000000000000000000
00005010501171123223423412236224
41233112600011113111211230001010
00001345134652347123134731122446
14585457244760023447045873485235
00001346734714587348333712360236
12355235023512342235623572357124
00000346145703477458145854586237
23371347734742363225023612356347
00000346134662363336233653466347
24473447434772363346034773462347
00001346234763473346034642466236
72355346734600000000000000000000
00005346134633460346424662367235
52452235623513450000000000000000
00001346034642466236723552351345
02356235423533350000000000000000
00007235723443462224412321124012
01236012501110117012001200111012
00006235222403464123211200111010
40110010200050105011700030006000
00003223512260127001200130001010
50102000700060004010111021115121
00004234233562362113300171230235
01112001101121126000300020001010
00007235723401231011012232230011
20013000300100122000700060005010
00000246623561242113712302344012
22245011311221125122322342342223
00007235123411237012123371225011
70114011211131114122512150101121
00006001211231115122200171123000
31125000200070005010501111114122
00002112111150114011600101117111
31116112711270010112000000000000
00000111401160011111311171114122
61120222000000000000000000000000
00006001401060003111512271234234
52345345233524463223333501234346
00006112022322241334023533357346
73470123145853587348045943594358
00007123712412350347435853576348
23360346045853587347145714580459
00004358634833475358000000000000
00000000000000000000000000000000
00001346034733477347234753574247
72364358524663485358000000000000
00006347734653461346623672353235
03463346123502354246734753573347
00003346134673466347734753571357
00000000000000000000000000000000
00003346134673465346634703477347
53574358000000000000000000000000
00000346723451225011600071233000
61110347722204444345633324470457
00006000200001111221711114430333
61110444633353432333733313326222
00006000122114430333011121112000
63336111044471117333722211107000
00006000700020005010000000000000
00000000000000000000000000000000
00006000200070006001000000000000
00000000000000000000000000000000
00004122222342340334523472343234
62354235723533356224222411115011
00004234412321120333522260010444
43440111633474455344545514442434
00002000300061125122711201123112
11113111401271112112501141227001
00000112401160015122412302231222
70017112311221121111111261134012
00002112401170006001011112220223
31117112611211115122501141220112
00002111401261243335734641236112
01235234023542347234711233340223
00003347535813461235323562360347
23475135524642463346634772350346
00005358435963484358734753573347
23476347034700000000000000000000
00005358145804584358634873470000
00000000000000000000000000000000
00006348435853577347535800000000
00000000000000000000000000000000
00007347535743580000000000000000
00000000000000000000000000000000
00007347634763485357000000000000
00000000000000000000000000000000
00007347435853576347234713460347
33467346000000000000000000000000
00002447534542342112401130006235
60002223022232220111111050104010
00007000600011100111000000000000
00000000000000000000000000000000
00007000111021116000611101110000
00000000000000000000000000000000
00005010700011107111512121110111
61116000401131110000000000000000
00006000200050107000111001112111
71116111022251212222401141226001
00002001322372343335134631123346
23466346711200125012001130015011
00002224412323341444232302220333
62237222611241227111233503455222
00002000300040113111611211115011
60012112700001127001100020010000
00006112501170014012611360010223
60024123122320013223722301127112
00000223311261120112111121123111
40115011700160012001401271125122
00004011611232233334333534456346
03464346534673451345734672352336
00003335723503465346334613466235
42466236423552450235134543460000
00001346034763473346734603460000
00000000000000000000000000000000
00007347334763472347000000000000
00000000000000000000000000000000
00005357734763470000000000000000
00000000000000000000000000000000
00004358734753576347234743571457
00000000000000000000000000000000
00007347344743470347634713467236
62360346723532350235334612345134
00005357034703461234112310110345
12330011222310105233712232230233
00005346034541236112011102341011
60000011300020001010001040100110
00000111600020005121300032221222
02225222722261126223222341220223
00003000600031112000022262232223
03334344333363344455744413334233
00002111711101115010611151211110
02222222000000000000000000000000
00007000600050101110000000000000
00000000000000000000000000000000
00001110111151225233300060002001
23343334534403342335523442341233
00005233512271115222722233342335
71235234733311100444700061110111

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #20 : 01 Май 2009, 20:00:54 »
К сожалению обнаружено что бывает и больше 512 разнообразие сборок по 2 байта
их бывает и 1500, но редко
поэтому 1024 т.е. 10 бит еще можно както использовать - хоть немножко пожать, а вот 2048 уже нет смысла, файл только больше будет
зато бывает всего 1 разнообразие, т.е. только одна сборка 2 байта которая повторяется, значит собственно только 1 бит и нужен что очень выгодно получается

в общем смысл жать палюбому есть ;)

использовать алгоритмы которые будут распределять по частоте встречаемости разделять сборки а потом более часто повторяющиеся обозначать меньшим количеством бит, а редкие большим конечно тоже можно теоретически, но практически написать такой алгоритм сложновато будет, да и еще не известно успеет ли все это дело распаковаться в установленное время, т.к. распаковывать нужно фактически каждое обновление кадра
« Последнее редактирование: 01 Май 2009, 20:03:16 от sergi »

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1292
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #21 : 01 Май 2009, 21:30:27 »
Почему-то я ожидал, что ты запостишь кусок сюда ;) Мог бы аттачем архив выложить.
Пример посмотрю, потом отпишу.

Добавлено позже:
Ты дал кусок размером 8064 байта в текстовом виде. Я перевёл его в двоичный вид и для интереса сравнил: двоичный файл сжимается сильнее хексового, т.е. внутрибайтные связи слабее внешних. Но увы, больше чем в два раза (до 4032 байт) этот кусок сжимается только сильными архиваторами, причём ППМдшными (раром и 7-зипом). LZ-схемы в архиваторах его толком не берут (Zip, LZMA), правда, LZMA сжимает, но почти впритык, а если кусок был бы хуже, он бы его не сжал.... Про простые схемы, которые можно пихнуть на 68k, и говорить нечего - RNC сжимает кусок до 4613 байт - это много.
Тебе обязательно сжимать отдельно куски по 8 кб или можно больше?

Добавлено позже:
Цитата
Ну больше, так больше 9 бит может быть кратным 8 при числе 72
т.е. берем 9 байт и там будет 8 наших уникальных идетнификаторов сцепок
т.е. брать нужно по 9 байт из этих 8 килобайт последовательно и вытягивать потихоньку
Насчёт 9 бит ты наверно не так понял. Ты говорил, что есть не более 512 разных слов (2 байта), правда, я подумал, что ВООБЩЕ не больше 512 разных слов во всех двух Мбайтах. Поэтому решил, что можно составить ОБЩУЮ таблицу этих слов (512*2), перекодировать 8кбайтные куски из 16-битного кода в 9-битный, НО... тебе надо сжать в 2 раза, т.е. в среднем по 8 бит на слово, а не по 16 и не по 9. Поэтому я и сказал, что раз 9 бит больше 8, то сжимать перекодированный кусок всё равно надо.
А позже ты сказал, что последовательности разные для всех кусков. Это сильно усложняет дело, потому что таблица займёт 1 кб, и 3 кб останется для архива - это очень мало.

В любом случае можно обойтись без хранения таблицы. Объясню, почему. Нам известно, что весь кусок разбит на слова. Всего разных слов пусть будет 512. Если бы ты закодировал их в таблицу и использовал 9-битные коды слов и пытался бы сжимать их последовательность LZ-схемой, ты бы использовал указатели назад от 0 до 4095 слова (или 4.7 кбайта), т.е. указатели всё равно по 12-13 бит. А раз слова выровнены по 2 байта, то исходную последовательность можно сжать, используя чётные указатели. В общем, я всё это к тому говорю, что сжатие перекодированного (по 9 бит) куска можно свести к сжатию исходного куска, зная его особенности, а поэтому таблица будет лишней.
Это всё равно что сводимость словарных методов к статистическим. Словарные методы выделили в отдельный класс только из-за удобства.

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #22 : 01 Май 2009, 23:31:32 »
Ну я жал зипом и раром эти 8 килобайтные куски и получал гдето +- 4 кб в зависимости от типа сжатия
самым крутым раром то вообще 3,15

это код в хексе, собственно запостил и жал его также

на счет сложности - пока сложности не вижу, как и поинтеры на таблицы пока тоже собственно
у меня да таблица 512 или больше уникальных 2-х байтовых слов тогда это 1 килобайт весит
9 бит как поинтер на конкретную спарку дают компактную запись всей 8 килобайтной последовательности в виде (9*4032)/8=4536 байт
но при этом там будут 0, которые я не буду указывать, т.к. они только в конце появляются и всеравно в памяти по умолчанию лежат и так, поэтому достаточно обозначить только следующую 32 байтную последовательность которая всегда начинается с 0000
поэтому это позволит съэкономить ну 15-20% как я оценял
вот и будет гдето 4 килобайта вместо 8, ну больше, ну меньше, всеравно и не ровно 512 там, и бывает всего 200 и даже еще меньше, бывает правда и больше, в среднем гдето на 4 кило выходит
но сложнее алгоритм конечно же M68K просто так не исполнит

т.е. данные специфичные, повторяющиеся, похожие друг на друга и закон у них общий, что дает возможность сжатия ^_^

а что там на счет четных указателей?
т.е. это как можно использовать?
« Последнее редактирование: 01 Май 2009, 23:51:08 от sergi »

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1292
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #23 : 01 Май 2009, 23:50:57 »
Цитата
у меня да таблица 512 или больше уникальных 2-х байтовых слов тогда это 1 килобайт весит
9 бит как поинтер на конкретную спарку дают компактную запись всей 8 килобайтной последовательности в виде (9*4032)/8=4536 байт
Так таблица для каждого 8-кбайтного куска своя, т.е. 1 килобайт уже забит под таблицу, а под архив остаётся 3 кб.
Обязательно сжимать куски по 8 кб или можно больше?

Цитата
самым крутым раром то вообще 3,15
Ты не смотри на рар, смотри на чистые LZ-схемы вроде LZMA или Zip. Они этот кусок из примера толком не могли сжать. А сеговский архиватор тем более не сможет.

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #24 : 02 Май 2009, 12:06:04 »
Ну потому что общая разновидность этих сборок вообще существующих 32768+1
поэтому общую таблицу возможно конечно тоже можно сделать, но в реале это будет 15 бит если 0 не учитывать вместо 16 и сомнительно что это уменьшит размер даже если умножить на миллион

поэтому каждый 8 килобайтный кусок, складывающийся из 256 сборок по 32 байта, где первый всегда 0000 - нужно ужать до 4 килобайт, ну гдето в этот размер, т.к. бывает и легко пожать т.к. разнообразия там нет или сложно это более 1000 разновидностей
Зип гдето обычно жмет до 4,20 килобайт, ну это потому что там алгоритм сложнее, скорее всего идет учет повторяемости спарок и прочее

жать куски большего размера может будет и эффективнее, но проблема в том что нужно четко разжимать в установленное время несложным алгоритмом именно по 8 килобайт в определенное место памяти, чтобы из нее потом взять этот разжатый кусок

да и место в памяти мало
хотя пачкой жать конечно еще круче, вытягивать сложно будет - машинных циклов понадобится больше чтобы распаковать - собственно время распаковки зависит от размера файла

ну и так то было бы неплохо иметь универсальный архиватор для M68K на любой случай жизни - думаю любому пригодится - я выложу если сделаю в асме его ;)

в сущности не суть важно сколько именно килобайт кусок, важно зажать гдето в 2 раза несложно и недорого, собственно этот алгоритм вроде подходит

то что таблица нужна будет - ну что делать - нужна значит будет :-\

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1292
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #25 : 02 Май 2009, 16:14:10 »
Цитата
в сущности не суть важно сколько именно килобайт кусок, важно зажать гдето в 2 раза несложно и недорого, собственно этот алгоритм вроде подходит
Ты же сам видишь, что в 2 раза даже мощные LZ-архиваторы сжать не могут, что говорить о простом алгоритме для 68к?
Самый лучший универсальный пакер, годный для 68к, - RNC. Для декодирования указателя, сжатого Хаффманом, он делает в самом худшем случае не больше 16 простых сравнений, побитовая реализация окажется хуже. LZ-часть тоже простая - обычное копирование байт.
LZ без Хаффмана будет чуть быстрее, но сжимать будет хуже.
К тому же для RNC есть готовый пакер.

Поэтому остаётся один выход: если циклов достаточно, надо увеличить кусок. Если нет, то придётся бросить это дело.
Сколько точно циклов имеется?

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #26 : 02 Май 2009, 16:32:19 »
Ну 1000 точно имеется

а непосредственно его алгоритм можно расписать применительно к M68K, а то я так и не понял что там как конкретно делается :?

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1292
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #27 : 02 Май 2009, 17:05:40 »
1000 тактов на 68к - это 100-120 средних команд. Это ОЧЕНЬ мало.
Исходник анпакера есть в архиве Propack.zip или как его там, в инете он есть.
Хотя... ладно, вот мои комментарии. Может, поймёшь что-нибудь :)

Оффлайн sergi

  • Пользователь
  • Сообщений: 1651
    • ВКонтакте
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #28 : 02 Май 2009, 18:07:06 »
А сколько тактов нужно?
в принципе может пару тысяч наберется

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1292
    • Просмотр профиля
Re: Алгоритмы сжатия информации
« Ответ #29 : 02 Май 2009, 18:32:33 »
Простое побайтовое копирование
move.b (An)+,(Am)+
dbra dn
занимает 22 такта на байт. На 8 кб - 176 тыщ тактов. Учитывая сжатие, нужно время на чтение указателей, чтение битов, итого в лучшем случае тактов надо в 2-3 раза больше. А с декодированием указателей в RNC - раз этак в 5.

Добавлено позже:
Вон в Аладдине для пояснительного экрана разжимается кусок в 32 кб. И на это уходит около секунды (7.5 млн тактов).