Сейчас я ищу элегантный алгоритм для рекурсивного поиска соседей соседей с помощью алгоритма геохеширования (http://www.geohash.org).
В основном берем центральный геохеш, а затем получаем первое «кольцо» хэшей одинакового размера вокруг него (8 элементов), затем, на следующем шаге, получаем следующее кольцо вокруг первого и т. д. и т. д. Вы слышали об элегантном способе сделать это?
Грубая сила может заключаться в том, чтобы взять каждого соседа и заставить их соседей просто игнорировать массивное перекрытие. Соседи вокруг одного центрального геохэша решались много раз (здесь, например, в 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
(отрывок из библиотеки Юичиро МАСУИ)
Я говорю, что этот подход скоро станет уродливым, потому что направления становятся уродливыми, как только мы оказываемся на втором или третьем кольце. В идеале алгоритм должен просто принимать два параметра: центральная площадь и расстояние от 0 — это только центральный геохеш (["u0m"]
и 1 — первое кольцо, состоящее из 8 геохэшей одинакового размера вокруг него (=> [["u0t", "u0w"], ["u0q", "u0n"], ["u0j", "u0h"], ["u0k", "u0s"]])
. Два — второе кольцо с 16 областями. вокруг первого кольца и т. д.
Видите ли вы какой-нибудь способ элегантно вывести «кольца» из битов?