Оптимизация массива трибулеров для пространства

Позвольте мне начать с некоторой предыстории:

Под «трибуллом» я понимаю переменную, которая может содержать одно из следующих значений: true , false или null .

В вопросе Копируя массив целочисленных значений против указателей на булевые , ОП хотел получить массив триболов (более или менее), который был бы как можно меньше.

Используя «немного» самого основного бит-фу, я придумал решение, в котором использовалось 2 бита на трибул и позволяло хранить массив OP из 64 трибоулов в 16 байтах, и это нормально.

Механика трибула, которую я использовал, была проста, например:

  • логическое значение A означает «ноль или не ноль»,
  • логическое значение B означает «истина или ложь, если не ноль».

Но потом я подумал ... Алгоритмическое определение «бита» таково:

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

Очевидно, что значение истина / ложь имеет размер в 1 бит. Два значения true-false в целом имеют размер в 2 бита.

А как же наш концептуальный трибул?

Моя точка зрения: С точки зрения размера содержащейся информации, трибул больше 1 бита, но меньше 2 бит .

  • Обоснование 1. Предположим, мы реализуем логическое значение if, как описано выше. Если логическое значение A равно «null», значение логического B является избыточным и не несет никакой релевантной информации.
  • Обоснование 2: Невозможно хранить информацию из двух независимых логических значений в одном трибуле, поэтому он имеет

(Ничего из вышеперечисленного не является формальным доказательством, но я считаю, что мы можем согласиться с тем, что насчет «размера» трибул должен быть строго больше 1 бита и строго меньше 2.)


Мой вопрос:

Как программно воспользоваться преимуществом того факта, что трибул имеет меньше информации, чем 2 бита, и реализовать его в программном обеспечении (c, c ++?) массив из N трибоулов, объем памяти которых будет меньше, чем N / 4 байтов для некоторого N?

Да, я понимаю, что такая реализация не является t действительно дружественен к оборудованию и будет работать медленнее, чем любое обычное решение с избыточностью (как те, которые представлены в вопросе OP). Давайте просто оптимизируем пространство, а не эффективность.

Очевидно, что эта реализация требует другого представления трибула, чем пара булевых (что само по себе является избыточным, как описано ранее). Теория утверждает, что этой цели можно достичь, и мне нравится видеть реальную реализацию. Есть идеи?

9
задан Community 23 May 2017 в 11:55
поделиться