读书人

算法求解。海量数据查找指定数据点。该

发布时间: 2012-03-24 14:00:47 作者: rapoo

算法求解。海量数据查找指定数据点。
输入:
海量数据点。每个点的存储格式如下:
struct stPoint
{
DOUBLE dLon, // 纬度,如50.2568
DOUBLE dLat, // 经度,如120.2565
wstring wsType,// 点属性,如公交车站,家乐福等等
}

假设有100万个这样的点结构存储在数据库中。(或者用户自己定义存储结构)。

要求:
给出一个算法,
该算法能够实时响应用户操作,
用户输入点属性和距离范围,以及当前用户所在的位置经纬度,
算法能够根据用户的输入来输出符合用户查询条件的点。

如,用用户输入:
目标点属性:肯德基。
当前位置经纬度:(10.2859, 125.2544),
距离范围:1000米。
算法输出距离用户1000米以内的所有是肯德基的点。

同时该算法要求在时间复杂度上尽可能低。

时间复杂度的优先级>空间复杂度的优先级


不要给出遍历所有点的算法查找目标点的算法。

提示:
可以为点建立索引。


我做了这道题目之后,没有能给出一个满意的答案。
期望能集网友智慧,给出一个高效的算法。

算法只需描述思路即可!


[解决办法]
在点属性上建索引吧,这个可以淘汰大量的点。然后按经纬度排序,取经纬度与当前经纬度差的绝对值在1000的(直线距离1000)的点里边逐个需要比较距离小于1000的就可以了。

[解决办法]
既然是放在数据库里面的点,那么用SQL语句直接查询就好了呀
比如先把距离范围(比如1000)换算成latitude和longitude的范围,然后用SQL查询出lat/long都满足范围的点,然后再求所有满足范围的点到查询点的距离,取小于原距离范围的点即可。也就是说,SQL查询先把选择的范围缩小,然后再用距离来筛选。

用自己定义存储结构做的话,也可以用同样的思路。可以在二维平面上建k-d树,然后每次找出[lat-d1,lat+d1]×[long-d2,long+d2]里面所有的点。最后再用距离来筛选。
[解决办法]
硬盘够的话三个属性都建索引吧

并且考虑以经纬度分表(用oracle的话就用分区)
[解决办法]
http://blog.csdn.net/dch4890164/archive/2009/09/22/4581177.aspx
早就有人研究过类似的问题,你这个和上面的回答类似,上面是我blog论述这类问题的地址
[解决办法]
3楼说的kd树不错。

读书人网 >C++

热点推荐