我现在正在寻找一种优雅的算法来递归地使用 geohashing 算法(http://www.geohash.org)找到邻居的邻居。
基本上取一个中央geohash,然后在它周围获得第一个相同大小的散列“环”(8个元素),然后,在下一步中,在第一个周围获得下一个环等等。你听说过一个优雅的怎么做?
蛮力可能是带走每个邻居并让他们的邻居忽略大量重叠。一个中央 geohash 周围的邻居已经解决了很多次(例如在 Ruby 中:http: //github.com/masuidrive/pr_geohash/blob/master/lib/pr_geohash.rb)
编辑澄清: 当前的解决方案,通过一个中心键和一个方向,像这样(与相应的查找表):
def adjacent(geohash, dir)
base, lastChr = geohash[0..-2], geohash[-1,1]
type = (geohash.length % 2)==1 ? :odd : :even
if BORDERS[dir][type].include?(lastChr)
base = adjacent(base, dir)
end
base + BASE32[NEIGHBORS[dir][type].index(lastChr),1]
end
(摘自 Yuichiro MASUI 的库)
我说这种方法很快就会变得丑陋,因为一旦我们进入第二或第三圈,方向就会变得丑陋。理想情况下,该算法将简单地采用两个参数,中心区域和距 0 的距离仅是中心 geohash(["u0m"]
并且 1 是由 8 个相同大小的 geohash 组成的第一个环(=> [["u0t", "u0w"], ["u0q", "u0n"], ["u0j", "u0h"], ["u0k", "u0s"]])
。两个是第二个环,周围有 16 个区域第一环等
你有什么方法可以优雅地从比特中推断出“戒指”吗?