我有一个5维数组,其中所有的索引都在2-14之间。它包含一个5位数序列的所有可能的排列。这个数组包含525720个排列,这需要相当长的时间来计算。(在我的Macbook pro上5-7秒)。它应该用作查找表,以访问固定时间内的值,或者更具体地说,访问某个扑克手的值:
array[2][3][4][5][7] // 1
array[5][5][5][5][14] // 2000
有没有更快的方法来创建这个数组?我在考虑以某种方式持久化数组,然后在每次程序启动时加载它--但是有什么有效的方法可以做到这一点吗?
我不太熟悉持久化。我真的不知道这是否值得我从磁盘加载它,而不是每次都创建它。我知道Hibernate,但这似乎有点过头了,仅仅为了持久化单个数组?
发布于 2010-02-05 04:19:58
如果数组的计算开销太大,您可能要做的就是序列化它。这基本上是将数据的二进制副本放到您可以非常快速加载的存储介质(例如硬盘)上。
序列化非常简单。下面是专门解决序列化数组问题的a tutorial。
由于这些值可能只会在评估扑克牌牌的算法发生变化时才会发生变化,因此只提供序列化的文件应该没什么问题。如果存储在每个数组元素中的数据不是太大(例如,如果是16位整数,则文件大小约为1MB ),则文件大小应该是合理的。
发布于 2010-02-05 04:19:46
通过MappedByteBuffer将其写出来。创建一个足够大的文件,映射它,获取一个asIntBuffer(),输入您的数字。
然后,您可以稍后映射它,并通过IntBuffer.get(明显的索引上的数学)访问它。
这大大加快了序列化的速度。
发布于 2010-02-05 04:48:26
我将首先折叠您的维度以进行索引:
假设您有一组索引(在第一个示例中,允许值为2到14):
i1 = 2
i2 = 3
i3 = 5
i4 = 6
i5 = 7
创建了你的数组
short array[] = new short[13 * 13 * 13 * 13 * 13];
...
那么访问每个元素就变成了
array[(i1 - 2) * 13 * 13 * 13 * 13 + (i2 - 2) * 13 * 13 * 13 + (i3 - 2)
* 13 * 13 + (i4 - 2) * 13 + (i5 - 2)]
这个数组占用的内存要少得多,因为您不需要在每个维度上创建额外的对象层,而且您可以轻松地将整个内容存储在一个文件中,并将其加载到一个列表中。
遍历此数组也会更快,因为您将执行1/5的数组查找。
此外,收紧每个维度中的元素数量将节省大量内存。
为了保持代码的整洁,这个数组应该隐藏在一个带有get和set方法的对象中,该方法接受5个索引。
https://stackoverflow.com/questions/2202836
复制相似问题