如何知道两个空间点是否在 50000 点的数组中重合?
How to know if two spatial points are coinciding in an array of 50000 points?
假设我在一维数组中有 50000 个“3D 空间坐标”。我想让两个人知道是否有两点重合。如果有,是哪几对?
我知道我可以使用距离公式,但这真的很昂贵,并且会创建一个 50k X 50k 的二维数组,即每列表示每个点 w.r.t 其他点的相对距离。
我正在寻找一种高效的算法。
第一种方式:使用hashtable/map/dictionary。 O(n) 分摊复杂度,O(n) 内存
在那里放点 one-by-one。如果字典中还没有这样的键,添加对(coordinates; value=1)
,否则增加值字段。
例如Python中就有Counter
就是针对这类问题的
第二种方式:排序。 O(nlogn) 通常的复杂度。
排序点,使用特殊的比较器:先比较X-coordinate,如果相等则比较Y-coordinate,如果相等则比较Z。然后遍历排序后的数组,相似的点会站在一起.
在 Python 中,此类结构的默认比较器会根据需要工作。
假设我在一维数组中有 50000 个“3D 空间坐标”。我想让两个人知道是否有两点重合。如果有,是哪几对?
我知道我可以使用距离公式,但这真的很昂贵,并且会创建一个 50k X 50k 的二维数组,即每列表示每个点 w.r.t 其他点的相对距离。
我正在寻找一种高效的算法。
第一种方式:使用hashtable/map/dictionary。 O(n) 分摊复杂度,O(n) 内存
在那里放点 one-by-one。如果字典中还没有这样的键,添加对(coordinates; value=1)
,否则增加值字段。
例如Python中就有Counter
就是针对这类问题的
第二种方式:排序。 O(nlogn) 通常的复杂度。
排序点,使用特殊的比较器:先比较X-coordinate,如果相等则比较Y-coordinate,如果相等则比较Z。然后遍历排序后的数组,相似的点会站在一起.
在 Python 中,此类结构的默认比较器会根据需要工作。