假设我有一张地理地图,其中各点由纬度\经度表示。 我在这张地图上有很多点,可以随时添加\删除\移动点。
我需要的是获得“最热点” - 包括最大点数除以面积的区域 - 或者换句话说,点数密度最高的区域。
我需要一个高效的数据结构,并且还需要一种算法来重新计算任何变化的最热点。计算复杂度和内存复杂度必须最小,因为点数可能会非常高。
我希望知道并保持一份按降序排列的最热门景点列表 - 首先是最拥挤的区域,然后是不那么拥挤的区域。有一个有限大小的列表是可以的 - 例如,100个最热点。
当然,为了防止一个孤立点上的100%密度,有一个最小区域(定义为常数)。
这里“区域”的定义是地图上包含点的任何可感知区域。它可能是整个地图,但算法不应该将其视为当然的热点=)
非常感谢! 如果需要澄清,请说出来......
答案 0 :(得分:5)
您所做的事情在统计上被称为“二维密度估算”(因此您知道在哪里查看)。
一种常见的方法是'内核平滑'。想象一下,您的每个数据点都有一张光盘。在该区域上平滑的内核是在每个点处重叠的盘的数量。这是使用固定半径的统一内核进行内核平滑。
您不必使用统一内核,也不必在所有点都使用相同的大小 - 现在这是“自适应带宽内核平滑”。
这为你提供了一个可以很容易更新的网格,特别是如果你有一个有限的内核(你可以使用一个无限的高斯(又名正常)内核,但会被剪切到你的研究区域)。每次添加或删除一个点时,都会添加或删除其内核对密度的贡献。
这就是问题的一半 - 你现在有一个密度网格。然后,您可以使用聚类算法对其进行分区,并根据任何标准找到单独的峰值a)定义“峰值”,b)将其定义为与相邻峰值分开。其他人已经建议了聚类算法。我(十年前)使用统计软件包“R”中的聚类函数完成了这项工作。虽然速度不是它的强项......
您可能希望将其转到http://stats.stackexchange.com
答案 1 :(得分:2)
这对评论来说太长了,但这只是一个关于我如何“玩”这个的想法,看看我是否能想出一些有趣的东西。但有一点是肯定的:以下内容可以快速非常。
这可以轻易转化为某些离散问题吗?您首先将所有坐标“对齐”到一个大地图(您可以定义每个方块的大小,并将每个条目映射到一个这样的点)。然后你最终得到这样的东西:
0000000000000000000000000000
00XX000000000000000000X00000
00X00000000000000X0000000000
0000000000000000000000000000
0000000000000000000000000000
000000X00000000X000000000000
0000000000000000000000000000
000000000000X000000000X00000
00000000000000000000000X0000
0000000000000000000000000000
然后你计算每个条目及其相邻邻居的数量:
0000000000000000000000000000
0033000000000000000001000000
0030000000000000010000000000
0000000000000000000000000000
0000000000000000000000000000
0000001000001001000000000000
0000000000000000000000000000
0000000000001010000000200000
0000000000000000000000020000
0000000000000100000000000000
然后你可以增加你的方块的大小,比如两个,然后划分你的地图:
(地图不正确,只是想知道我在想什么)
09001001000000
00000000000000
00100001100000
00000110002000
00000002000000
00000100000000
然后你重新计算相邻的邻居等。
对我而言,根据您的“分辨率”,这将允许找到热点:您只需查找最大数字,这将是您的“热点”。
因为在这种情况下:
0000X00000
0000XX0000
0000000000
0000000000
0Y0Y000000
0000000000
0Y0Y000000
'X'可以是最热点(三个有趣的点彼此接近)或'Y'(四个点彼此接近,但它们不像'X'那样接近。)
因为你说你需要速度,我只是把它变成一个离散的问题并将我的图形表示为数组。然后,我允许变量“面积”大小。
看起来像是一个有趣的问题:)
答案 2 :(得分:1)
使用的算法类型取决于点的分布。你很可能遇到一个更难的问题,即将组划分为“区域”。由于您似乎需要一些东西来帮助您入门,因此我建议您阅读Convex Hulls和calculating the area of an abritray 2D polygon以及how to determine if a point is in a polygon。