Я создаю trie, которое мое приложение будет хранить в нем. У Trie будет много узлов, и я думаю о том, как уменьшить использование пространства. Из-за причины я буду использовать trie для алгоритма DAWG, чтобы повторно использовать количество узлов, но насколько я знаю, этого недостаточно.
Вот класс узлов
class Node{
char letter;
boolean EOW; // end of word
Node child; // first child
Node next; // next Node on this level
}
Насколько я знаю, объект этого класса будет иметь 14 байтов (2 байта для char, 4 для логической переменной и 2 * 4 будут зарезервированы для ссылок)
Я думаю, что я могу заменить char байтом. Это спасет 1 байт. Однако я не знаю, сколько времени потребуется на литье. И, вероятно, это плохой десигин.
Также boolean принимает 4 байта, возможно, вы знаете, что я могу использовать вместо логического?
Поэтому мне нужно, чтобы вы помогли мне уменьшить размер узлов. Заранее спасибо.
Если вам не нужна более большая половина символов UTF-16, вы можете использовать самый старший бит letter
в качестве маркера EOW.
Например, здесь переменная eoWletterA
имеет букву "a", закодированную с битом EOW:
char eoWletterA = 'a' + 0x8000;
char letter = (char) (eoWletterA & 0x7FFF);
boolean eow = BigInteger.valueOf(eoWletterA).testBit(15);
Ваша тройка должна быть инкапсулирована должным образом. Убедитесь, что бит EOW не может быть случайно установлен при сохранении символа в trie.
UPDATE: Обратите внимание, что удаление boolean
переменной из узла может или не может повлиять на размер памяти объекта Node в JVM. Вы можете изучить область памяти объекта с помощью следующего инструмента: qaru.site/questions/15105/...
Если letter
берет только 5 бит и eow
один бит, вы можете упаковать их в один byte
чтобы сохранить память.
char letter = ...;
boolean eow = ...;
byte packed = (byte) ((eow ? 0b10_0000 : 0) | letter);
letter = (char) (packed & 0b1_1111);
eow = (packed & 0b10_0000) != 0;
EndOfWordNode extends Node
, неявно указывая логическое значение?