多维数组的替代数据结构

时间:2011-05-12 00:23:12

标签: java arrays multidimensional-array performance 2d

我有一个简单的问题,我正在开发一个项目,需要一个具有id和x,y坐标的对象。这都存储在一个对象中,其想法是将它放入一个2D数组中。但是,有可能创建和存储大量对象,并且阵列的大小可能很大。是否存在可以存储数据的大小和速度更高效的东西?我读到使用地图可能这是我最好的选择。

2 个答案:

答案 0 :(得分:5)

答案取决于您的应用程序的主要访问模式。

如果主要访问模式在特定的x,y坐标处查找对象,那么您可能最好通过以下方式之一服务:

  • 一个2D数组(就像你现在一样);即Thing[][]
  • a Map<Point, Thing>
  • a Map<Integer, Map<Integer, Thing>>

(我建议使用第3个选项,因为每次对数据结构进行查找时,第二个选项都会导致创建临时Point对象。还有其他方法可以解决这个问题,但是它使应用程序更加复杂。)

如果2D阵列是稀疏填充的,那么Map方法将节省空间,但需要花费时间。如果阵列密集,那么Map方法可能比2D阵列使用更多空间。

如果主要访问模式是在给定的x,y坐标(或区域)附近查找对象,那么您可能需要类似四叉树数据结构的东西。

最后要注意的是,使用标准集合类型时会产生不可避免的开销,尤其是当一个或多个参数类型是基本类型时。 如果您的性能要求特别“难”,那么手动设计和实现自定义数据结构将节省空间和时间......如果您做得对。但缺点是您需要编写,测试和维护的代码要多得多,并且自定义数据结构与标准集合API不兼容。

答案 1 :(得分:2)

Map<Double, java.awt.Point>

java.awt.Point可以工作,或者您可以创建自己的数据类型来保存x,y坐标。

这将为您提供快速查找但使用比直接数组更多的内存(不确定多少,可能不是太糟糕)。

另一种选择是结合三件事(ID,x,y)并将它们存储在一个数组中然后使用Arrays.binarySearch来获取它们。它需要对数组进行排序。

编辑:

如果你想从x,y映射到你想做的双倍:

Map<java.awt.Point, Double>