我对数据结构进行了分配,教授希望我们在项目中使用不同类型的DS,但我不知道他对的含义(在一个位置关系。数据结构中的每个单元格都可以容纳多个项目。 我尝试了对象的Arraylist,并与对象排队!
有什么主意可以节省时间的DS吗?
谢谢
答案 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)。您也可以对浮点值执行此操作,但是您需要注意负值,否则可能会在正值和负值之间产生裂痕。