powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Компактная нотация бинарной записи числа
25 сообщений из 83, страница 3 из 4
Компактная нотация бинарной записи числа
    #39583607
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, конкретный оптимальный алгоритм будет зависеть от распределения получаемых значений по диапазону.

Вот например вариант [длина + значение]:

Разбиваем значение на диапазоны, с разрядностью кратной 4 битам, т.е.: 0..15, 16..270, 271..4365, ...
Сначала записываем длину в блоках, причём размер длины кратен 2м битам, т.е.: 00 = 1, 01 = 2, 10 = 3, 1100 = 4, 1101 = 5, ...
После длины идёт N*4 бит числа.

Число 100500 будет записано как 1101 0001 1000 1000 1001 0100 -> 24 бита.
Число '127213652436512428173512214698378623721714738352374' в двоичную систему переводить лень, но оно займет 196 бит.

Имеется некоторая избыточность (например, число 1 займёт 6 бит), но без этого никуда :)
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583608
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpЧисло 100500 будет записано как 1101 0001 1000 1000 1001 0100 -> 24 бита.

На самом деле: 1101 0000 0111 0111 1000 1000
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583627
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как бы писал я.

Я бы меньше байта не мельчил - только расстраиваться.
У каждого байта я бы считал старший разряд флагом конца числа. А младшие семь - значимыми разрядами. И число 0-127 помещались бы в один байт, 0.....128*128-1 - в два байта и так далее.

Двухбайтные из диапазона 0....127 я бы оставил себе на память как эскейп- коды.

Если жалко терять один бит из восьми, то тогда бы брал слова (или двойные слова) с битом-флагом. Тогда потери на флаг конца - 1/16 32 64 - Это хорошо. Но, диапазон ноль-127 кодируется в два байта - это небольшая потеря, если маленьких чисел мало, большая - если много.

Опять же, если чисел в диапазоне 0...32000 мало, в общем объеме, то флагом можно снабжать уже не слово, а двойное, или даже четверное слово. Или даже кусок бОльшей разрядности.

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

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


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

Но нужна все же статистика - каких чисел в потоке много, каких - мало, без этого решать вопрос о кодировании оптимальном неправильно.....
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583652
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir BaskakovЯ бы меньше байта не мельчил - только расстраиваться.
У каждого байта я бы считал старший разряд флагом конца числа. А младшие семь - значимыми разрядами. И число 0-127 помещались бы в один байт, 0.....128*128-1 - в два байта и так далее.

Зачем вы оперируете байтами? В битовом потоке решительно все равно.

Вообще если брать Левенштейна, и ему подобные (с унарным префиксом) то изначально
предполагается что меньшие числа занимают меньшую разрядную сетку.

Но если изначально гистограмма чисел идущих на вход известна и имеет
некий перекос (чаще встречаются большие числа чем меньшие) то
тогда Омега*, Левенштейн* и прочие теряют смысл. Нужно искать другие
подходы.
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583671
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mayton - байтами удобно работать процессору. Это может быть неидеальный код, на байтах. Но. Он не запредельно хуже хорошего, который на битовой строке. И немного заплатить эффективностью за удобство работы по моему, на практике, вполне логично.

И, я согласен с мнением ранее высказанным в теме - не имея представления о гистаграмме входного массива, оценивать эффективность кода невозможно....

Как с сортировкой - каждому алгоритму можно подобрать такой набор входной, что он поработает подольше.

То есть, если задачу рассматривать как игру разума - то тогда битовый массив, а только соберешься в сторону прикладного - байты, слова, двойные и четверные - тут как тут....

Ну, мнение. Уважаю тех, кто способен к более абстрактному, менее приземленному мышлению.
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583684
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В конце концов, ну давайте нагоним тест. На вход впихнем поток рандомных натуральных 0...2^64-1.

И посмотрим, какой компактификатор сделает среднюю битность меньше 60?

В среднем 64 разрядном числе вероятность иметь 64 бита - половина, больше 62 - 3/4, больше 61 - 7/8, > 60 ----- 15/16.....
И так далее. В общем средняя длина в битах числа из равномерного рандомного потока - немногим меньше разрядности.

Исхитряйся или нет. Если поток сильно отличается от равномерного, и мелочи там много - тогда конечно дело другое. Но, как справедливо отмечали выше, тогда эту неравномерность и перекос надо описывать? Перед моделированием для битвы кодировок, в которой побеждает компактнейшая.
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583831
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir BaskakovВ конце концов, ну давайте нагоним тест. На вход впихнем поток рандомных натуральных 0...2^64-1.

И посмотрим, какой компактификатор сделает среднюю битность меньше 60?

В среднем 64 разрядном числе вероятность иметь 64 бита - половина, больше 62 - 3/4, больше 61 - 7/8, > 60 ----- 15/16.....
И так далее. В общем средняя длина в битах числа из равномерного рандомного потока - немногим меньше разрядности.

Это немного разные задачи ИМХО. Исходная задача была: использовать для записи числа минимально необходимое число бит. Т.е. не записывать 32-х разрядные числа 64ю битами и т.п, но при этом иметь возможность записать число любой разрядности.

А вы хотите сжимать поток 64-х разрядных чисел с равномерным распределением значенией, а это уже конкретно сжатие, к тому же случайных [в общем случае] данных. Разные задачи - разные решения, к тому же вторая задача [в случае действительно случайных данных с равномерным распределением] решения [скорее всего] не имеет.
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583860
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpсжимать поток 64-х разрядных чисел с равномерным распределением значенией ... [в случае действительно случайных данных с равномерным распределением] решения [скорее всего] не имеет
если нам дан поток "действительно случайных данных с равномерным распределением", то он нам дан в какой-то нотации ("битовой нотации", поскольку в компе есть только биты). Вопрос "удастся ли сжать" имеет смысл только с указанием двух нотаций -- исходной и сжатой.

Так почему исходную нотацию нельзя сжать? Потому что нотации вообще все одинаково компактны или потому что исходная всегда самая компактная?
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583862
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте уточним формулировку.

Например, создать битовый код для натуральных чисел 1...N , позволяющий записывать их в поток и считывать в произвольном количестве и порядке, такой что сумма битовых длинн по всему набору была минимальна? Или как? Или с доп ограничением, что длинна битовой последовательности для маленького числа была заметно меньше, чем для числа очень большого?

или доп- требование минимакса - чтобы максимальная длинна кодирующей последовательности по всему набору была как можно меньше? Для последнего выгодно кодирование в равной разрядности.

---- критерии к.м.к. не заданы точно, отсюда разночтения
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583866
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для кодировки произвольного натурального числа можно построить ф-цию R(n) - сколько разрядов бинарного представления нужно для представления числа n.

Какой интеграл, или максимум, или еще чего от этой ф-ции мы оптимизируем на всем множестве возможных кодировок? Понятно, что наитупейшая кодировка такова - столько единичек, какое число а потом нолик. Такими кодами можно кодить любое натуральное и r(n)=n по такому случаю,
Самая остроумная кодировка по моему не может давать стабильно лучше чем log 2 (N).

какой интеграл от ф-ции разрядности соответствует интуитивному идеалу --компактного представления числа-- ?
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583870
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе, я могу предложить простенькую кодировку для r(n) = A* log B (n) + C.

Например берем X. Кодируем n. В системе по основанию 2^x-1 - если икс=2 - то в троичной.

Каждому знаку этой кодировки ставим в соответствие ее двоичный код, разрядности икс.

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

Ну вот, вышли на логарифмическую метрику, с константами A, B, C. Она хорошая, или нет? И почему? В каком смысле другие ==кодировки== лучше или хуже..... практичнее? В принципе, вариант ==байт с маркером== дает такую же метрику

чем больше икс, тем меньше лишних разрядов будет на больших числах, но больше - на маленьких, вроде так.......
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583872
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXSСловарь {"однобитныйдиапазон", "двухбитныйдиапазон", "трёхбитныйдиапазон","четырёхбитныйдиапазон", ... "М-битныйдиапазон"} должен обладать свойствами префиксности и оптимальности (для нашей задачи), то есть, например, битовые значения

0, 10, 110, 1110, ... (М_минус_одна_единица)0

-- должны быть распределены по нему в соответствии с нашими априорными ожиданиями частот записи нами разных чисел.
-- вот там (точнее на одну реплику выше) у меня было озарение, что ставить самое короткое префиксное слово "0" для обозначения "однобитногодиапазона"-- множества занимающих один бит чисел, -- которых всего два: 0 и 1, ... это совсем не компактно. А если тупо инвертировать порядок префиксных слов, то получаем нотацию с одинаковым размером записи слов по всему диапазону от "однобитных" до "М-битных" ... и почему тогда не пользоваться самой обычной нотацией с фиксированным размером записи числа?
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583875
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakov простенькую кодировку для r(n) = A* log B (n) + C.

Например берем X лично я не понял, как у вас тут соотносятся r и Х ...
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583951
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXSalekcvpсжимать поток 64-х разрядных чисел с равномерным распределением значенией ... [в случае действительно случайных данных с равномерным распределением] решения [скорее всего] не имеет
если нам дан поток "действительно случайных данных с равномерным распределением", то он нам дан в какой-то нотации ("битовой нотации", поскольку в компе есть только биты). Вопрос "удастся ли сжать" имеет смысл только с указанием двух нотаций -- исходной и сжатой.

Так почему исходную нотацию нельзя сжать? Потому что нотации вообще все одинаково компактны или потому что исходная всегда самая компактная?
Сжатие как процесс - это удаление избыточности из данных. В случайном потоке 64-х битных чисел с равномерным распределением значений избыточности нет по-определению. Соответственно и сжатию без потерь он не поддаётся.
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583955
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp, кажется, в вашей формулировке "случайный поток 64-х битных чисел с равномерным распределением значений"
-- склеены описание распределения (а именно: равномерно-случайно распределённые целые числа в диапазоне от 0 до 2^64-1 ) и описание нотации (а именно: двоичная запись числа с дополнением слева нолями до полного числа 64 бита). Интересно, как такой нетривиальной конструкции из смежных дисциплин приписывается квалификация "избыточности нет по-определению" ...
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583964
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXSИнтересно, как такой нетривиальной конструкции из смежных дисциплин приписывается квалификация "избыточности нет по-определению" ...
Ну простой пример: при сжатии текста нам не обязательно хранить все буквы и знаки препинания, из которых он состоит. Ведь в любом тексте есть повторяющие-ся слова или как минимум слоги. Поэтому можно составить словарик этих повторений, отсортировать их по частоте появления и закодировать последовательностями бит разной длины, чем чаще встречается - тем короче последовательность (код Хаффмана).

В случае же абсолютно случайной последовательности (любой разрядности) - повторяющихся групп чисел либо не будет вовсе, либо будет минимальное количество минимальной длины, соответственно и сжать таким образом её не получится.
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583965
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXSalekcvp, кажется, в вашей формулировке "случайный поток 64-х битных чисел с равномерным распределением значений"
-- склеены описание распределения и описание нотации
Читать как "случайный поток чисел в диапазоне от 0 до 2^64 - 1".
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583970
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpВ случае же абсолютно случайной последовательности (любой разрядности) - повторяющихся групп чисел либо не будет вовсе, либо будет минимальное количество минимальной длины, соответственно и сжать таким образом её не получится.
-- будут и повторы, и любой, вообще говоря, длины. А сжать не получится потому, что нужно будет сохранить также и словарь, который "сожрёт" весь эффект от сжатия (это перекличка с соседней темой про "генерируемый словарь").

А если был бы "параллельный льготный тариф" для отправки (хранения) словаря, то можно было бы забацать "словарь" из одного слова ( = отправляемый текст). Тогда сам "архив" имел бы длину 1 бит.
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583972
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpЧитать как "случайный поток чисел в диапазоне от 0 до 2^64 - 1".
тогда ваше утверждение состоит в том, что нотация "двоичная запись чисел с дополнением слева нолями до полного числа 64 бита и выкладыванием этих записей вплотную одна за другой (без префиксов и разделителей, которые не требуются)" -- является наиболее компактной (в том смысле, что никакой более компактной нотации не существует).
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583982
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXSVladimir Baskakov простенькую кодировку для r(n) = A* log B (n) + C.

Например берем X лично я не понял, как у вас тут соотносятся r и Х ...

Для случая икс=2.

2^x-1 = 3.

Кодируем число в троичной системе.

Каждый знак кода заменяем
0 на 00
1 на 01
2 на 10

11 - стоп-биты.

Длина кода в тоичной системе для числа N - log 3 (N), каждый знак кодируется двумя битами - A=2, стоп-битов тоже два С=2.

Икс=3 - два в кубе=8, кодируем в семиричной системе

3 (log 7 (n)) + 3.

Умные кодировки, они конечно получше. Намного ли? Вопрос.

На практике, я бы этим кодом кодировал длину битовой последовательности числа. а само число оставлял как есть.

Ноль
01 11 0
1 01 11 1
2 - 10 11 10

-- на практике от этого польза сбалансирована вредом. Так, на тысячебитное целое В заголовке будет 6*2+2 - 10 бит.... вроде немного, но такие длинные целые малотипичны. Для 64 разрядного - 4*2+2 = 10 бит. Потери больше 10 %...
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583984
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

а представьте, что задача стоит передавать "случайный поток чисел в диапазоне от 0 до К* 2^64 - 1", где К=0.55 ... тогда "стандартная битовая нотация" очевидно (для меня, по крайней мере) не является самой компактной ...
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583987
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpВ случае же абсолютно случайной последовательностиАбсолютно случайно может быть только бесконечная последовательность. В любой конечной, включая подпоследовательность случайно, можно поискать какие-нибудь закономерности. Не факт, что повезёт, но шанс - не нулевой.

P.S. Другой вопрос, что:
1. Всё равно глупость: проблема (исходной) технологии не в применимости, а в практичности;
2. 512 (да хоть и 4096) битов - коротковато в любом случае.
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39583995
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВ любой конечной, включая подпоследовательность случайно, можно поискать какие-нибудь закономерности. Не факт, что повезёт, но шанс - не нулевой.
Найти какие-нибудь отдельные закономерности вы может и найдёте, но накладные расходы на их кодирование съедят весь выигрыш от этой операции ИМХО.

Иван FXSalekcvp,
а представьте, что задача стоит передавать "случайный поток чисел в диапазоне от 0 до К* 2^64 - 1", где К=0.55 ... тогда "стандартная битовая нотация" очевидно (для меня, по крайней мере) не является самой компактной ...
Ну, тут оптимальнее будет разве что запись с дробным количеством бит на число, и то не факт. Мне лень считать, если честно :)
Во всех остальных случаях ИМХО всё равно 64-х битная запись будет оптимальнее.
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39584008
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кому как, но лично мне достаточно очевидно, что любой алгоритм сжатия (с потерями или без) создаёт детерминированную последовательность. Да, не произведя сжатия, результат мы не знаем, но повторные сжатия выдадут тот же самый результат.
Что изменится, если одним и тем же алгоритмом (схема сжатия плюс параметры конкретного режима) одни и те же данные обработает миллион участников? Ничего.
Сколько участников не просто готовы, а реально могут изобрести новый алгоритм сжатия, адаптированный под конкретную последовательность? А повторять этот подвиг ежесекундно?
Если быть реалистом - строгий ноль. Что, собственно, и делает бессмысленной исходную затею.
...
Рейтинг: 0 / 0
Компактная нотация бинарной записи числа
    #39584020
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov, адаптировать алгоритм сжатия под конкретную последовательность (подбирая в нём значение некоторого параметра) -- это всё-таки совершенно не называется "изобрести новый алгоритм сжатия"
...
Рейтинг: 0 / 0
25 сообщений из 83, страница 3 из 4
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Компактная нотация бинарной записи числа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]