一种三维数据结构,将项目彼此保持位置关系

时间:2018-08-06 01:24:01

标签: java data-structures

我对数据结构进行了分配,教授希望我们在项目中使用不同类型的DS,但我不知道他对的含义(在一个位置关系。数据结构中的每个单元格都可以容纳多个项目。 我尝试了对象的Arraylist,并与对象排队!

有什么主意可以节省时间的DS吗?

谢谢

2 个答案:

答案 0 :(得分:0)

如果允许您使用番石榴,那么我会考虑MyObj索引的XyzCoord中的Multimap,其中XyzCoord是一个自定义对象,可容纳三个位置数字,而MyObj是您希望在各种坐标下存储一个或多个对象的自定义对象。

避免使用番石榴,您可以使用Map中的标准List<MyObj>。也可以用长度为3的List<Integer>进行索引。

事实是有很多方法可以做到这一点。结果您的问题可能有点太广泛了。进一步了解一下收集类,如果您不知道如何使用它们,请尝试对每个收集类提出具体问题。

答案 1 :(得分:0)

最简单的空间数据结构是3D数组。在Java中,您可以使用以下方法创建一个:

Object[][][] my3DArray = new Object[10][10][10];

在这里您可以按照空间关系存储10 * 10 * 10 = 1000个对象。不幸的是,每个维度只有10个可能的坐标。

如果您想要更有效的方法,请寻找四叉树/八叉树,kd树(如@BeyelerStudios在评论中所述),R树,LSH(位置敏感哈希)或什至是空间填充曲线(Z曲线) ,希尔伯特曲线,...)。这些只是主要系列,每种类型的DS都有很多版本。

编辑以回答评论。 除了3D阵列方法外,以上所有解决方案都非常节省空间。在某些情况下,最节省空间的可能是PH-Tree(一种由我自己开发的四叉树类型),它可能需要比普通坐标数组更少的内存。不幸的是,理解和实施相对复杂。

如果要使用一维排序方案(例如数组或列表),请尝试使用空间填充曲线。 Z曲线可能最简单。 使用空间填充曲线,您可以为空间中的每个点计算一个“键”(z键或莫顿数),然后在数组或列表中对它们进行排序。在这样的有序列表/数组中,直接邻居也很可能(但不能保证)在3D空间中接近。相反,在3D空间中接近的点往往(但不能保证)在列表/数组中接近。

对于整数坐标,可以通过交织坐标的位来计算z键(也称为MortonNumber)。您也可以对浮点值执行此操作,但是您需要注意负值,否则可能会在正值和负值之间产生裂痕。