我正在创建一个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个字节(为char提供2个字节,4个用于布尔变量,2 * 4将保留用于引用)
我认为我可以逐字节替换char。这将节省1个字节。但是我不知道在铸造中需要多少时间。这可能是一个糟糕的设计。
布尔值也需要4个字节,也许你知道我可以用什么来代替布尔值?
所以我需要你帮我减少节点的大小。提前谢谢。
答案 0 :(得分: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;
答案 1 :(得分:1)
如果你不需要一半的UTF-16字符,你可以使用letter
的最高位作为EOW标记。
例如,此处eoWletterA
变量的字母为' a'用EOW位编码:
char eoWletterA = 'a' + 0x8000;
char letter = (char) (eoWletterA & 0x7FFF);
boolean eow = BigInteger.valueOf(eoWletterA).testBit(15);
你的trie应该正确封装。确保在将角色存储到角色时不会意外设置EOW位。
更新:请注意,从节点中删除boolean
变量可能会或可能不会对JVM中Node对象的内存占用产生影响。您可以使用以下工具检查对象内存占用量:https://stackoverflow.com/a/52682/1207523