1. 一组点的数组 - 假设有10000个点。 2. 六边形中心点的数组,大约有1000个六边形。 3. 每个点只属于一个六边形,有些(大多数)六边形是空的。 4. 这些六边形形成了一个完美的网格,其中一个六边形的点从左上角开始(它将重叠整个区域的边缘)。
我的当前解决方案虽然可以工作,但速度比较慢,我认为时间复杂度会是n * (m log m),其中n=length(points),m=length(hexagons)。
我怀疑我可以做得比这更好,其中一个解决方案是仅对点和六边形按照它们到某个任意点(可能是中心,也可能是角落)的距离排序(仅一次),然后遍历点和六边形的子集,从第一个距此点距离> =最后匹配的六边形开始。同样,我们可以在(点 - >参考点)和(六边形中心 - >参考点)之间的距离差大于六边形的“半径”时停止查看六边形。理论上,由于我们知道每个点都属于一个六边形,我甚至不必考虑这种可能性。
我的问题是:有比这更好的方法吗?从时间复杂度的角度来看,最坏情况下的复杂度会略微降低到n * m,但平均情况下应该非常好,可能在n * 20左右(例如,我们只需要查看每个点的20个六边形)。下面是我当前低效解决方案供参考。
points.forEach((p) => {
p.hex = _.sortBy(hexes, (hex) => {
const xDist = Math.abs(hex.middle.x - p.x);
const yDist = Math.abs(hex.middle.y - p.y);
return Math.sqrt((xDist * xDist) + (yDist * yDist));
})[0];
});