我通过优化生命游戏计划来自学一些更高级的Java。
到目前为止,我已经使用多线程加速并标记了世界的一部分Dirty。 但是,World数组当前是一个2D字节数组,并且创建一个远大于30000 * 30000的世界大小会导致java堆空间错误。 有什么更好的方法可以存储一个非常大的布尔/比特二维数组?
答案 0 :(得分:3)
你可以使用一个大的BitSet
和30,000 x 30,000位。
但即便如此,内存消耗也会相当高,您可能会遇到严重的性能问题。可能需要使用稀疏数据结构的更聪明的解决方案,该结构仅包含整个世界的非空部分。
另见SparseBitSet。
答案 1 :(得分:1)
考虑一下' Hashlife'算法。这将您的2D位阵列实现为四叉树'。非叶节点指向具有父节点跨度的一半的4个子节点(西北,东北,西南,东南)。这构建了一个2D位阵列,并且有一个非常聪明的记忆'计算后代的算法。
幸运的是,您可以在Java中演示:
http://www.drdobbs.com/jvm/an-algorithm-for-compressing-space-and-t/184406478