Наиболее эффективный способ хранения двоичного пути (например, через двоичное дерево) - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь сохранить бинарный путь настолько эффективным, насколько это возможно (с точки зрения использования как можно меньшего количества памяти / возможности). Путь, который ведет к указанному c узлу в связанном двоичном дереве (например, начиная с root). Простой способ сохранить это - сохранить сами узлы (или их значения).

Но это не эффективно и не элегантно. Если я хочу применить один и тот же путь к другому BinaryTree, это не работает.

Таким образом, вы можете сохранить только последовательность, например строку, например "lrllrrr", где l означает левую ветвь, r означает правую ветвь. Но хранение этой информации в строке все еще не очень эффективно.

Это можно улучшить, используя массив логических значений. Но я не знаю, как они обрабатываются в Java в фоновом режиме. Кроме того, я хотел бы избегать строк / массивов фиксированного размера.

Моя следующая идея состояла в том, чтобы напрямую сохранить путь в двоичном целом числе, например 0100111 (чтение слева направо). Затем можно добавить «движение влево» с помощью << и «движение вправо» с помощью <<, за которым следует ++. Но у этого подхода есть три недостатка:

  1. В Java нет целых чисел без знака. Я не очень разбираюсь в побитовых операторах в Java, поэтому мне интересно, как работать со знаковым битом примитива int или long?
  2. Количество записей такого представления ограничено количеством двоичных цифр, составляющих целое число (например, 63 для long). Вероятно, это можно решить с помощью BigInteger.
  3. . Путь, начинающийся хотя бы с одной «левой» записи, не может быть сохранен правильно, поскольку цифры «0» в левой части по умолчанию игнорируются при работе с целые числа.

Итак, есть ли в Java какой-либо способ сохранить определенную c серию битов, чтобы я мог читать их по отдельности без особых усилий? Если что-то подобное уже существует, я бы хотел больше узнать о том, как оно реализовано. Если в Java такого нет, и это слишком сложно или просто невозможно, как бы вы подошли к этому в другой среде / на другом языке?

Заранее спасибо.

РЕДАКТИРОВАТЬ : цифры '0' слева

Ответы [ 2 ]

0 голосов
/ 07 января 2020

Взято из комментария @ RealScepti c: A BitSet отлично работает для меня.

0 голосов
/ 07 января 2020

Вы можете использовать одно целое число для обозначения пути. Дерево увеличивается в размере 1,2,4,8 и c

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

0 1 2 3 4 5 6

...