Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм сжатия сортированных данных 
:(
    Опции темы
Lived
Дата 19.10.2006, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 18.10.2006

Репутация: нет
Всего: нет



Необходимо сжать N 256-байтных отсортированных (неважно как: по убыванию, возрастанию или ещё как) последовательностей.
элементы последовательностей представляют собой значения в диапазоне [0-255].
интересует возможность, сжать до размера ~12,5% от исходного материала.
PM MAIL   Вверх
nostromo
Дата 19.10.2006, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Отсортированную последовательность можно сопоставить неупорядоченному множнеству. Можно составить список из присутствующих элементов с указанием их количества (частотный словарь).  В нем будет не более 22 различных значений частоты,   поэтому частотные значения можно проиндексировать 5-битными (или меньше) ссылками. 
Степень сжатия оказывается в общем случае около 70 процентов и уменьшить ее (в общем случае) не удастся.

--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
maxim1000
Дата 19.10.2006, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



ну, например, вот что пришло в голову:
когда мы сохраняем последовательность, порядок, которой можно восстановить на приёмном конце, мы можем изменить порядок и закодировать в нём какую-то информацию о следующей последовательности
всего различных перестановок последовательности из 256 разных элементов существует 256! (если есть повторения - меньше), что не так уж и мало
это число можно округлить до степени двойки и такое количество бит от следующей последовательности можно с помощью него запомнить...

Добавлено @ 11:15 
Цитата(nostromo @  19.10.2006,  10:10 Найти цитируемый пост)
поэтому частотные значения можно проиндексировать 5-битными (или меньше) ссылками.

а как восстановить на приёмном конце таблицу индексирования?


--------------------
qqq
PM WWW   Вверх
nostromo
Дата 19.10.2006, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Цитата
а как восстановить на приёмном конце таблицу индексирования? 

Ее придется включать в архивированные данные.

Добавлено @ 11:27 
Цитата

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

Что-то не совсем понял идею, почему рассматриваются перестановки, если речь идет об отсортированных последовательностях (читай, о неупорядоченных множествах)?
(кстати, log2(256!) ~ 1684)


--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
maxim1000
Дата 19.10.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(nostromo @  19.10.2006,  10:18 Найти цитируемый пост)
Ее придется включать в архивированные данные.

два вопроса:
1. какой у неё будет размер
2. её нужно будет отдельно дописывать для каждой последовательности?

Цитата(nostromo @  19.10.2006,  10:18 Найти цитируемый пост)
Что-то не совсем понял идею, почему рассматриваются перестановки, если речь идет об отсортированных последовательностях (читай, о неупорядоченных множествах)?

пример на последовательности из двух элементов (разных):
1,2
мы можем передать её двумя вариантами:
(1,2) и (2,1)
в любом случае на приёмном конце знают, что её надо отсортировать по возрастанию и из обоих вариантов передачи последовательность будет восстановлена правильно
выбирая один из этих вариантов можно передать 1 бит информации. в общем случае  log2(n!) (меньше при наличии повторений)

Добавлено @ 11:42 
кстати, ещё одна идея: просто взять разности соседних элементов и передавать их
т.к. мы знаем, что число > 128 может встретиться не более одного раза, то можно спокойно записать его позицию (или маркер, что такого нету) в отдельный байт, а при передаче самих разностей обрезать старший бит (т.к. и так уже достаточно информации для его восстановления)
передаваемая информация станет короче на (256-8) бит, что даёт 12.1%
проще некуда smile

если надо сильнее сжать - можно эту же идею распространить на значения > 64
но чем дальше, тем процент сжатия будет расти медленнее...


--------------------
qqq
PM WWW   Вверх
Lived
Дата 19.10.2006, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 18.10.2006

Репутация: нет
Всего: нет



Вот какой алгоритм был у меня.

для элементов массива от 0 до 255
{
 если элемент присутствует
 {
   записать бит 1 
   записывать бит 1 пока есть повторения элемента
   записать бит 0
 }
 иначе
  записать бит 0
}

Пример (здесь рассматривается сортировка по возрастанию):

Исходная посл.: 11244456...
Результат: 011010011101010...

Конечный результат ровно 512 бит (64 байта), что не есть нужный результат. (Степень сжатия гарантированно 75%).

В идеале нужен размер 32 + (2|3) байт.

P.S. Может есть какие-нибудь ссылки где можно почитать по этой теме?

Это сообщение отредактировал(а) Lived - 19.10.2006, 12:36
PM MAIL   Вверх
nostromo
Дата 19.10.2006, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Цитата(maxim1000 @ 19.10.2006,  11:37)
Цитата(nostromo @  19.10.2006,  10:18 Найти цитируемый пост)
Ее придется включать в архивированные данные.

два вопроса:
1. какой у неё будет размер
2. её нужно будет отдельно дописывать для каждой последовательности?

1. До 22 байтов.
2. Да. Вопрос о сжатии N последовательностей я вообще не рассматривал.

[QUOTE=maxim1000,19.10.2006,  11:37]
Цитата(nostromo @  19.10.2006,  10:18 Найти цитируемый пост)

пример на последовательности из двух элементов (разных):
...

Почему разных??? Мне кажется постановка задачи можно прочитать, например, так: 
передаются упорядоченные по возрастанию последовательности...

Если все элементы разные, то в данном случае, очевидно, последовательность может быть только одна. В общем, что-то Ваши рассуждения я все равно не понял.

[QUOTE=maxim1000,19.10.2006,  11:37]
Цитата(nostromo @  19.10.2006,  10:18 Найти цитируемый пост)

кстати, ещё одна идея: просто взять разности соседних элементов и передавать их
т.к. мы знаем, что число > 128 может встретиться не более одного раза, то можно спокойно записать его позицию (или маркер, что такого нету) в отдельный байт, а при передаче самих разностей обрезать старший бит (т.к. и так уже достаточно информации для его восстановления)
передаваемая информация станет короче на (256-8) бит, что даёт 12.1%
проще некуда smile

если надо сильнее сжать - можно эту же идею распространить на значения > 64
но чем дальше, тем процент сжатия будет расти медленнее...

Да, вот только картину портит то, что элементы могут повторяться по многу раз (если я правильно понял задачу). Что будем делать если вся последовательность состоит, скажем, из одних пятерок?

Добавлено @ 12:34 
Lived, Ваш алгоритм очень хорош.
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
esperant0
Дата 19.10.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



В такой постановке, задача в общем виде не решается. Ибо всегда найдутся данные которые не сожмуться.


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
maxim1000
Дата 19.10.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(nostromo @  19.10.2006,  11:28 Найти цитируемый пост)
Почему разных???

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

Цитата(nostromo @  19.10.2006,  11:28 Найти цитируемый пост)
Если все элементы разные, то в данном случае, очевидно, последовательность может быть только одна. В общем, что-то Ваши рассуждения я все равно не понял.

но передать её можно N! способами:
изменить упорядочивание перед передачей на одно из N! возможных, а при приёме восстановить его (при этом запомнив, какой порядок использовался)

Цитата(nostromo @  19.10.2006,  11:28 Найти цитируемый пост)
Да, вот только картину портит то, что элементы могут повторяться по многу раз (если я правильно понял задачу). Что будем делать если вся последовательность состоит, скажем, из одних пятерок?

тогда их разности будут нулевые...

Добавлено @ 14:26 
Цитата(esperant0 @  19.10.2006,  12:54 Найти цитируемый пост)
В такой постановке, задача в общем виде не решается. Ибо всегда найдутся данные которые не сожмуться.

ну почему же?
есть ограничение - упорядоченность последовательности
т.е. мы кодируем не одну из 256^256 возможных последовательностей, а из значительно меньшего множества...


--------------------
qqq
PM WWW   Вверх
Lived
Дата 19.10.2006, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 18.10.2006

Репутация: нет
Всего: нет



Цитата(maxim1000 @  19.10.2006,  15:25 Найти цитируемый пост)
есть ограничение - упорядоченность последовательности
т.е. мы кодируем не одну из 256^256 возможных последовательностей, а из значительно меньшего множества...

Я тут поразмышлял... smile 

256^256 - множество всех последовательностей(П.).

X - кол-во П. из этого множества, удовлетворяющих некоторому условию (например, каждый a(i+1) >= a(i), т.е. элементы отсортированы по возрастанию).

Алгоритм предложенный мной несколькими сообщениями выше, сопоставляет любой такой П. число из диапазона 2^512.

...

Значит если знать X, то можно представить его в виде 2^N,
где N и будет кол-во бит затрачиваемых на кодирование одной такой П.

Есть ли способы найти X? (простой перебор не приемлем)

P.S. Да, в алгоритме не учитывается что таких П. N-ное кол-во. Подозреваю что это тоже можно как-нибудь использовать. Но пока не знаю как.
PM MAIL   Вверх
maxim1000
Дата 19.10.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(Lived @  19.10.2006,  14:17 Найти цитируемый пост)
Значит если знать X, то можно представить его в виде 2^N,
где N и будет кол-во бит затрачиваемых на кодирование одной такой П.

кстати, тот подход, который я предложил, использует похожее представление:
мы передаём всё-таки одну из 256^256 последовательностей, но избыток информации, появляющийся из-за того, что X<256^256, используем сразу для передачи следующей последовательности

Цитата(Lived @  19.10.2006,  14:17 Найти цитируемый пост)
P.S. Да, в алгоритме не учитывается что таких П. N-ное кол-во. Подозреваю что это тоже можно как-нибудь использовать. Но пока не знаю как.

если они независимы, то много пользы от этого не получится
ну разве что иногда немного "размазывать" информацию по времени бывает удобнее, но не более того...

можно ещё посмотреть такой вариант:
берём разности соседних элементов
и используем что-то типа Хаффманна или арифметического кодирования
основная проблема в этом подходе - распределение вероятностей
можно использовать реальное: как показал nostromo, его можно передать довольно-таки сжато
а можно найти какую-то глобальную аппроксимацию, которая, конечно, не даст оптимального результата, но не потребует передачи самого распределения
то, что я показал с выделением разности, большей 128, - небольшое приближение
в принципе, может быть, получится найти такое распределение, которое будет давать достаточный _гарантированный_ результат...

Добавлено @ 15:37 
касательно нахождения X
можно попробовать так:
f(n,m) - количество неубывающих последовательностей из n элементов, каждый из которых принадлежит [0..m-1]
тогда X=f(256,255)
дальше можно сделать рекурсивный подсчёт этой функции:
f(1,m)=m
f(n+1,m)=сумма[i=0..m-1] f(n,m-i)
(не исключено, что что-то где-то потерял, но смысл такой)

Это сообщение отредактировал(а) maxim1000 - 19.10.2006, 15:32


--------------------
qqq
PM WWW   Вверх
sergejzr
Дата 19.10.2006, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



Цитата(nostromo @  19.10.2006,  11:28 Найти цитируемый пост)
Да, вот только картину портит то, что элементы могут повторяться по многу раз (если я правильно понял задачу). Что будем делать если вся последовательность состоит, скажем, из одних пятерок?

Тут можно использовать два бита 0-элемента нет, 1-элемент есть,  2- элемент повторяет предидущий. но тут конечно 1/4 (если не считать, что полученную строку Хаффманом можно пройти)


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
maxim1000
Дата 19.10.2006, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(maxim1000 @  19.10.2006,  14:32 Найти цитируемый пост)
f(n+1,m)=сумма[i=0..m-1] f(n,m-i)

проверил - похоже на правду
только можно упростить:
f(n+1,m)=f(n+1,m)+f(n,m-1)
(кстати, где-то я подобное встречал, но не помню где)
промоделировал в excel для случая 16^16: 3*10^8
количество бит для оптимального запоминания - 28
при прямом методе (тупо всё записать) - 64
для 32^32: 60/160
динамика выглядит оптимистично: степень компрессии растёт с увеличением n
решил для 256 excel не нагружать (да и растягивать так далеко неудобно smile )


--------------------
qqq
PM WWW   Вверх
esperant0
Дата 19.10.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Проанализируем одну последовательность

ее исходный размер 256*8=2048 б.


Возрастающих последовательностей порядка 256^256/256!
Если их пронумеровать то потребуется  365 б.


сжали в 17%


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0995 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.