【问题标题】:Geocode lookup in CC中的地理编码查找
【发布时间】:2012-07-28 04:12:45
【问题描述】:

我想做一个超快速的地理编码查找,返回输入城镇、城市或国家的坐标。我的知识是基本的,但据我所知,用 C 编写它是一个好的开始。我认为有这样的树结构是有意义的:

  • 英格兰
    • 肯特
    • 奥尔平顿
    • 查塔姆
    • 罗切斯特
    • 多佛
    • 伊甸桥
  • 威尔特郡
    • 斯温顿
    • 马姆斯伯里

在我的文件/数据库中,我将拥有坐标和城镇/城市名称。如果给我的程序命名为“Kent”,我想要一个可以以最快的方式返回与“Kent”相关的坐标的程序

出于性能原因,我应该将数据存储在二进制文件还是 SQL 数据库中? 搜索这些数据的最佳方法是什么?也许二叉树搜索? 数据应该如何存储?也许?

【问题讨论】:

  • 地理编码和自动完成无关。
  • 为什么您认为 C++ 会有所帮助? C++ 代码可能会稍微快一点,但这将远远超过查询文件/数据库/其他内容所花费的时间,如果您没有经验,C++ 开发的复杂性将是一个很大的开销。
  • 地理编码必然是一个巨大的瓶颈。我认为你的代码有多快并不重要(与地理编码本身相比,它总是一个数量级太快
  • @JamesWillson:这很有意义。将其编辑到您的问题中。
  • 我建议使用数据库。让数据库担心数据结构和快速检索方法。这就是它们的设计目的。

标签: c# c++ c search geocode


【解决方案1】:

这里有一点建议,但仅此而已:

如果您想按名称或名称前缀查找地点(如您所愿),那么不建议您建立一个数据结构,将数据存储在国家、地区、城镇的层次结构中正如你所建议的那样。如果您有一个操作主导了您的数据结构的使用,那么您通常最好选择适合该操作的数据结构。

在这种情况下,按字母顺序排列的地点列表更适合您的查询。对于不在最顶层的每个地方,您都希望添加对其“父级”名称的某种引用。如果您有一个按字母顺序排列的地点列表,您可能还需要考虑一个索引,也许它直接指向列表中以字母表中的每个字母开头的第一个位置。

当您描述您的问题时,它似乎与在字典中存储单词有更多的共同点(我的意思是您在其中查找单词而不是任何特定编程语言中的任何特定集合数据类型)以相同的名称)而不是大多数以地理编码为幌子的东西。

我的猜测是,包含世界上所有人口超过 1000 的城镇、城市、地区和国家(及其坐标)的名称的地名词典可以存储在一个非常简单的数据结构中(基本上一个列表),带有一个或两个索引,用于快速定位第一个 A 地名、第一个 B 等等。只需稍加压缩,您就可以将其保存在大多数现代台式电脑的内存中。

【讨论】:

  • 您可以按您希望的任何顺序获取记录。您应该创建一个或多个 indices,它们是包含键(城镇名称)和值(指向其他信息的指针)的关联数组。通过这种方式,您可以快速访问数据,而无需担心记录的组织。另见数据库理论。
  • @ThomasMatthews:我认为您应该重新发布您的“评论”作为答案,因为它提供的建议与我自己的完全不同。
  • 是的,您愿意多解释一下吗?我现在正在阅读索引。
【解决方案2】:

我认为我能给出的最佳建议是使用任何你熟悉的语言来获得你想要的结果。一旦你的代码工作,就担心性能。然后,您可以考虑一次将非常具体的功能片段翻译成 C 或 C++,直到获得您想要的结果。

【讨论】:

    【解决方案3】:

    您不应该担心信息的存储方式,除非不要重复数据。

    您应该为数据创建一个或多个索引indicies 是关联数组/映射数据结构,其中包含一个键(您要搜索的项目)和一个值(例如与键关联的记录和其他信息)。这将使您能够快速查找,而无需更改每种搜索类型的数据。

    另一方面,您的案例非常适合数据库。我建议你让数据库管理员处理你的数据(比如高效查找)。毕竟,这就是他们生活的目的。

    另请参阅:At what point is it worth using a database?

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多