2024 年 Clojure 调查问卷中分享您的想法!

欢迎!请访问关于页面以了解更多有关这一机制的信息。

0

在 clojure.data.int-map 辅助库中,INode 实现 Branch 始终使用长度为 16 的 INode[] 来存储其子节点,尽管通常情况下并非所有 16 个子节点位置都被占用。例如,表示

(int-map 0 0 1 0) 

的节点将以 Branch 节点表示,其中 INode[] 的 0 位置包含 0-0,1 位置包含 1-0,而数组的其他 14 个空间都是 null,见下文

这与核心 hashmap/hashset 实现不同,后者使用位图来跟踪数组中哪些位置存在,在读取时可以看到在您想要读取的索引右侧有多少位(设置为 1),这可能告诉您在压缩数组中的真实索引。

也许可以考虑如果使用位图可以积极影响 int-map 的性能和内存使用的话。

还可以通过组合位图和/或掩码和/或前缀和/或偏移量来进一步压缩,因为这些字段足够大,以至于它们没有使用所有位。例如,掩码(long)始终是 15、15 << 4、15 << 8、15 << 12 等。偏移量(int)我认为始终是 0 ... 60。前缀(long)类似地仅存储长度在 0...64 之间的位掩码的二进制表示,因此原则上可以压缩很多。在这些字段中,我敢打赌有一个字段可以存储位掩码的 16 位,而不必添加其他字段。

1 答案

+1

选定
...