我的应用程序(基于Qt的移动应用程序)以下列格式从服务器获取数据:纬度,经度,描述。
我需要将这些数据存储在数据结构中,以便以后快速检索。现在我有一张地图,当用户点击地图中的一个点时,我得到该点的纬度,经度。使用这两个值我需要快速扫描我的数据结构并检索相关的描述。我的问题是......我在地图上点击的纬度和经度是一个近似值(它是一个触摸设备所以我永远不会得到精确的纬度+长),所以如果我对数据结构进行线性搜索我永远不会找到这些价值观。此外,如果数据太多,线性搜索将会非常慢。
我应该使用什么数据结构存储lat + long + description(哈希出现在我的脑海中......但我不知道如何将long + lat组合成一个键)
如何对数据结构进行近似搜索?
谢谢!
答案 0 :(得分:1)
您要查找的数据结构是kd-tree。如果你真的想要散列,并且可以接受一些小错误,你可以查看this paper(pdf),它描述了基于距离散列的方法。
你必须尝试哪一种更适合你。我在那篇论文中实现了算法,并且它对我的问题不起作用(可能是因为我的数据点分布不均匀)。在您的情况下,这可能会有所不同,因此您必须尝试。
答案 1 :(得分:1)
由于您的问题只包含2个维度,因此我们可以使用二叉树。每片叶子最多可以有“N”个点(以纬度,经度为点)。只有叶子节点才有点。
点的数据类型
class Point
{
float Latitude;
float Longitude;
string Description;
}
内部节点的数据类型(NonLeaf节点)
class Node
{
Float MaxLatitude;
Float MinLatitude;
Float MaxLongitude;
Float MinLongitude;
}
leafnode的数据类型
class LeafNode
{
Point points[K]; // Array of points
}
动态生成二叉树,并在插入更多点时划分节点。如果节点的高度为均匀,则根据纬度除以基于经度的除法。
搜索输入点时,找到相关的叶节点,该叶节点中的所有点都将是与输入点最近的点。
这是一个受欢迎的问题 - http://en.wikipedia.org/wiki/Nearest_neighbor_search#Approximate_nearest_neighbor