【发布时间】:2019-06-12 03:41:49
【问题描述】:
我正在尝试找出最快的方法来检索二维数组中某个范围内给定坐标周围的所有点/坐标。
我目前正在遍历 X/Y 并将所有点添加到列表中,但是当范围开始增加时,它变得非常慢。 有没有比我目前的做法更有效地实现这一目标的其他方法?
我当前的代码:
public static List<coords> GetCoordinates(coords Position, int nRange)
{
List<coords> inRange = new List<coords>();
for (int i = Position.X - nRange; i <= Position.X + nRange; i++)
for (int j = Position.Y - nRange; j <= Position.Y + nRange; j++)
inRange.Add(new coords() { X = i, Y = j });
return inRange;
}
【问题讨论】:
-
最快的方法是不要把所有的点都列出来,如果你需要计算某个东西是否是范围,只需使用一些
if语句。取决于您要解决的问题 -
这是一个
O(n^2)算法,对于大的n,预计会很慢。为什么需要这样做?也许原来的问题可以用不同的方式解决。 -
是的,没有上下文很难说,但是利用已经有一些优化方法供您使用的库,您可能会得到更好的服务。例如如果您正在使用 GeoJSON,请使用 GeoJSON.Net.Contrib.MsSqlSpatial,它附带查看点/2d 区域是否与其他区域相交等的方法。
-
这个函数在 3-4 种不同的情况下被调用,但在所有情况下,检索到的点都将受到一些
if语句的影响,以查看在这些检查之后哪些仍然可用。例如,人 A 在坐标 x,y 处,他想跳到 3 范围内的另一个坐标,该坐标中还没有任何人。我得到给定范围内所有坐标的列表,然后删除其中已经包含某人的坐标,最后选择仍然留在列表中的那些坐标的 random 坐标。 -
我仍然认为您做事倒退且慢,如果您有一个范围内的人员列表,请在需要时枚举他们,并使用您的位置进行范围检查。
标签: c#