2017-10-12 56 views
1

我在正方形(即区域)的网格中执行一些地理计算。我使用的是Delphi,但是这个逻辑也可能应用于C++。让我先解释一下我想做什么。访问或省略不存在的数据

下面的图像是“穿过层运动”一个我的网格,其通过二维阵列Square,它表示在每个正方形的中心点表示的部分,并且:

Image

绿色方块的X和Y坐标为2,因此是Square[2,2]。实际坐标存储在Square[2,2].LatitudeSquare[2,2].Longitude中,以及例如其他信息。我用于计算的Square[2,2].Info

现在的目的是:我需要对周边地区进行一些计算。有多少周边地区可以称为“邻居”,取决于我定义了多少“层”。在上面的图片中,我使用了这两个“图层”。这意味着,从绿色单元开始时,我绕过一次(蓝色箭头),然后再次在第二层(红色箭头)中移动。

现在出现这个问题:如果我开始在Square[1,1](绿色正方形)而不是Square[2,2](如下图所示),第二层(红色)会尝试访问左侧和底部的数据不存在(即在“-1”列和行中)。看到下面的图片。当然,这个问题发生在所有边界。

Image

我大概可以用IF语句为每个场景中的例外,但如果有常见的编程“招数”,您试图访问数据不存在,可以处理这种情况我不知道。

例如,我想如果我可以按照第一张图片中描绘的箭头的图案每次访问所有相邻方块,即使存在不存在的方块,它也会非常方便。所以,看着第一张图片,在Square[3,0]之后,你会看到Square[3,-1]等东西,然后最终回到Square[0,3]的“可行”区域。

+0

我投票结束这个过于宽泛。 StackOverflow不适合人们为您编写算法,或者推荐关于算法设计的教程。请将您的问题重点放在特定问题上。 –

+0

在尝试优化代码之前,需要处理的最大可能数据集是什么?您是否通过循环遍历每个元素,在最大的数据集上尝试了传统的O(n)方法?如果访问每个元素的作品,你可能会这样做。 – user3437460

+0

@RemyLebeau:对不起,我已经编辑了这篇文章,以便更加关注点和编程问题。 – artnaz

回答

0

要访问邻域,您可以使用某种BFS(广度优先搜索)。

但是对于稀疏结构(如最后一张图所示),使用一些数据结构以良好方式组织单元格是值得的。也许kd-tree是合适的 - 你添加树中所有现有的单元格,并在给定单元格周围进行范围搜索以获得其附近的其他单元格。

另请参见另一空间数据结构(请参阅kd-tree页面底部的列表)。

+0

不应该是*广度*首先搜索? (你不是在谈论你在面包店买的东西,是吗?)https://en.wikipedia.org/wiki/Breadth-first_search – dummzeuch

+0

谢谢,这确实是一种可能的方法。但是,如果我有一百万个位置,那么在所有位置上执行这样的分区技术将是非常低效的。 就我而言,我确切地知道我的邻居,并可以用我所说明的箭头访问它们。但问题是如何编程访问区域外的位置,因此不存在。或者,也许这不应该像我想的那样容易...... – artnaz