Java уменьшить размер объекта

1

Я создаю 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 байта, возможно, вы знаете, что я могу использовать вместо логического?

Поэтому мне нужно, чтобы вы помогли мне уменьшить размер узлов. Заранее спасибо.

  • 0
    Можете ли вы сделать это объектно-ориентированным способом, поэтому у вас EndOfWordNode extends Node , неявно указывая логическое значение?
  • 0
    @ AndyTurner с тем, как обычно создаются попытки, что, вероятно, усложнит ситуацию.
Показать ещё 12 комментариев
Теги:
char
boolean

2 ответа

1
Лучший ответ

Если вам не нужна более большая половина символов 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/...

  • 0
    Я проверю)
  • 0
    довольно хороший код)
Показать ещё 4 комментария
2

Если 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;
  • 0
    вау, мужик, мне нужно некоторое время, чтобы разобраться в этом коде) спасибо проверю

Ещё вопросы

Сообщество Overcoder
Наверх
Меню