Информация об изменениях

Сообщение Re[7]: Хранение массива целых чисел от 04.04.2024 13:58

Изменено 04.04.2024 13:59 vsb

Re[7]: Хранение массива целых чисел
Здравствуйте, _FRED_, Вы писали:

_FR>Спасибо. Правильно я понимаю, что в таком разе с каждой дельтой нужно будет ещё и хранить и размер этой дельты или полагаться, что она всегда не болшьше некоторого значения (если мы не говорим о представлении данных в виде строки)?

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

Нужно использовать какую-нибудь схему кодирования с переменной длиной. Простой пример:

Число от 0 до 2^7 — 1 хранится в одном байте со старшим нулевым битом.
Число от 0 до 2^14 — 1 хранится в двух байтах, в первом байте старший бит единица и 7 битов на число, во втором байте старший бит ноль и 7 битов на число.
Число от 0 до 2^21 — 1 хранится в трёх байтах, в первом байте старший бит единица и 7 битов на число, во втором байте старший бит единица и 7 битов на число, в третьем байте старший бит ноль и 7 битов на число.

Тут идут пересечения по первому диапазону, поэтому можно чуть лучше сделать, это не суть.

Это один из примеров, можно и другие примеры кодировки придумать.

_FR>Просто всё ещё кажется, что просто хранить данные в бинарном виде фиксированного размера "одно за другим" будет значительно экономнее.


Надо считать на конкретных данных. Вряд ли будет значительно экономней.
Re[7]: Хранение массива целых чисел
Здравствуйте, _FRED_, Вы писали:

_FR>Спасибо. Правильно я понимаю, что в таком разе с каждой дельтой нужно будет ещё и хранить и размер этой дельты или полагаться, что она всегда не болшьше некоторого значения (если мы не говорим о представлении данных в виде строки)?

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

Нужно использовать какую-нибудь схему кодирования с переменной длиной. Простой пример:

Число от 0 до 2^7 — 1 хранится в одном байте со старшим нулевым битом.
Число от 0 до 2^14 — 1 хранится в двух байтах, в первом байте старший бит единица и 7 битов на число, во втором байте старший бит ноль и 7 битов на число. В итоге на число уходит 14 битов и 2 служебных бита.
Число от 0 до 2^21 — 1 хранится в трёх байтах, в первом байте старший бит единица и 7 битов на число, во втором байте старший бит единица и 7 битов на число, в третьем байте старший бит ноль и 7 битов на число. В итоге на число уходит 21 бит и три служебных бита.

Тут идут пересечения по первому диапазону, поэтому можно чуть лучше сделать, это не суть.

Это один из примеров, можно и другие примеры кодировки придумать.

_FR>Просто всё ещё кажется, что просто хранить данные в бинарном виде фиксированного размера "одно за другим" будет значительно экономнее.


Надо считать на конкретных данных. Большого проигрыша тут быть не должно.