В прошлом я использовал это для декодирования Хаффмана (или любой схемы с переменной длиной бит).
Если вы поддерживаете свое двоичное дерево с символами на листьях, каждый входящий бит решает, переместиться ли вы в левый или правый узел.
Когда вы достигнете листового узла, у вас будет ваш декодированный символ, и вы сможете начать со следующего.
Например, рассмотрим следующее дерево:
.
/ \
. C
/ \
A B
Это будет дерево для файла, в котором преобладающая буква была C
(поскольку для обычных букв используется меньше битов, файл короче, чем для схемы с фиксированной длиной в битах). Коды для отдельных букв:
A: 00 (left, left).
B: 01 (left, right).
C: 1 (right).
Класс проблем *, которые вы используете для решения проблем, - это те, в которых вы хотите иметь возможность достаточно эффективно вставлять и получать доступ к элементам. Помимо несбалансированных деревьев (например, приведенного выше примера Хаффмана), вы также можете использовать сбалансированные деревья, которые делают вставки немного более дорогостоящими (так как вам, возможно, придется балансировать на лету), но много разыскивать более эффективный, поскольку вы пересекаете минимально возможное количество узлов.