Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可扩展三维阵列的数据结构?_C#_Data Structures - Fatal编程技术网

C# 可扩展三维阵列的数据结构?

C# 可扩展三维阵列的数据结构?,c#,data-structures,C#,Data Structures,我正在寻找一种类似于T[,,](一种3D数组)的数据结构,只是我事先不知道随着时间的推移会向外扩展的维度(也没有合理的上限)。我也希望使用负索引 我唯一想到的是一本字典,它以某种类型的Point3struct作为键。还有其他选择吗?我想尽快查找。数据将始终聚集在0,0,0周围。它可以向任何方向扩展,但点之间永远不会有任何“间隙” 我想我现在就用一本字典,看看效果如何。如果是性能问题,我将尝试围绕T[,]构建一个包装器,这样我就可以使用负索引。我假设您需要动态方面,因为数组可能非常大。在这种情况

我正在寻找一种类似于
T[,,]
(一种3D数组)的数据结构,只是我事先不知道随着时间的推移会向外扩展的维度(也没有合理的上限)。我也希望使用负索引

我唯一想到的是一本字典,它以某种类型的
Point3
struct作为键。还有其他选择吗?我想尽快查找。数据将始终聚集在
0,0,0
周围。它可以向任何方向扩展,但点之间永远不会有任何“间隙”



我想我现在就用一本
字典
,看看效果如何。如果是性能问题,我将尝试围绕
T[,]
构建一个包装器,这样我就可以使用负索引。

我假设您需要动态方面,因为数组可能非常大。在这种情况下,您可以尝试将阵列分配为一组3d“分幅”。在顶层,您有一个3d数据结构,用于存储指向平铺的指针。您可以在执行过程中扩展和分配此功能

每个单独的瓷砖可以包含32x32x32体素。或者任何适合你目标的数量。 查找平铺是通过将坐标索引除以32(当然是通过位移位)来完成的,平铺中的索引是通过屏蔽掉高位来计算的

这样的查找相当便宜,可能与.NET字典相当,但它将使用更少的内存,这对性能也有好处。


不过,生成的数组将是粗块的:数组边界是平铺大小的倍数。

我假设您需要动态特性,因为数组可能很大。在这种情况下,您可以尝试将阵列分配为一组3d“分幅”。在顶层,您有一个3d数据结构,用于存储指向平铺的指针。您可以在执行过程中扩展和分配此功能

每个单独的瓷砖可以包含32x32x32体素。或者任何适合你目标的数量。 查找平铺是通过将坐标索引除以32(当然是通过位移位)来完成的,平铺中的索引是通过屏蔽掉高位来计算的

这样的查找相当便宜,可能与.NET字典相当,但它将使用更少的内存,这对性能也有好处。


不过,生成的数组会很粗:数组边界是平铺大小的倍数。

显然,您需要将其存储在类似稀疏数组的数据结构中,因为您不知道数据集将有多大。所以一本字典似乎是合理的


我有点疯了,但我认为你的指数应该在。随着您的数据向外扩展,这对我来说很有意义。它还将使在(0,0,0)的特定范围内查找元素变得非常容易。

显然,您需要将其存储在类似稀疏数组的数据结构中,因为您不知道数据集将有多大。所以一本字典似乎是合理的


我有点疯了,但我认为你的指数应该在。随着您的数据向外扩展,这对我来说很有意义。它还将使在(0,0,0)的特定范围内查找元素变得非常容易。

如果您可能需要范围查询,KD树会出现在您的脑海中。它们是树状的结构,在每一个层次上,沿着一个轴将宇宙分成两个。它们提供了O(logN)查找时间(对于恒定数量的维度),这可能不够快,也可能不够快,但它们还为范围查询提供了O(logN+S)时间,其中S是找到的项的大小,这通常非常好。它们可以处理动态数据(插入和删除以及查找),但树可能因此变得不平衡。此外,您还可以从给定的点进行最近邻或搜索(即获取到点(7,8,9)的10个最近对象)。Wikipedia始终是一个很好的起点:


如果世界上有大量的东西,或者如果世界是非常动态的(东西总是在移动,被创造/毁灭),kd树可能不够好。如果大多数时候你只会问“在(7,8,9)处给我东西”,你可以使用你在问题中提到的哈希或类似于
列表的东西。我只想在接口中实现更简单的方法,以后再考虑性能。

如果您可能需要范围查询,我会想到KD树。它们是树状的结构,在每一个层次上,沿着一个轴将宇宙分成两个。它们提供了O(logN)查找时间(对于恒定数量的维度),这可能不够快,也可能不够快,但它们还为范围查询提供了O(logN+S)时间,其中S是找到的项的大小,这通常非常好。它们可以处理动态数据(插入和删除以及查找),但树可能因此变得不平衡。此外,您还可以从给定的点进行最近邻或搜索(即获取到点(7,8,9)的10个最近对象)。Wikipedia始终是一个很好的起点:


如果世界上有大量的东西,或者如果世界是非常动态的(东西总是在移动,被创造/毁灭),kd树可能不够好。如果大多数时候你只会问“在(7,8,9)处给我东西”,你可以使用你在问题中提到的哈希或类似于
列表的东西。我只想在接口中实现更简单的方法,以后再考虑性能。

阵列访问是一种非常快速的线性查找-如果查找速度是您的首要任务,那么这可能是一种方法,具体取决于您需要修改阵列的频率

如果您的目标是保持玩家周围的区块,您可能希望在玩家周围安排一个“当前世界”数组结构,这样它是一个三维数组,中心区块位于
9,9,9
,大小为
[20,20,20]
。每次玩家离开分币