Я теперь ищу изящный алгоритм для рекурсивного нахождения соседей соседей с геоалгоритмом хеширования (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
(извлечение из lib MASUI Yuichiro)
Я говорю, что этот подход станет ужасным скоро, потому что направления становятся ужасными, после того как мы находимся в кольце два или три. Алгоритм идеально просто взял бы два параметра, центральную область и расстояние от 0 являющийся центральным геохешем только (["u0m"]
и 1 являющийся первым кольцом сделан из 8 геохешей того же размера вокруг этого (=> [["u0t", "u0w"], ["u0q", "u0n"], ["u0j", "u0h"], ["u0k", "u0s"]])
. два являющийся вторым кольцом с 16 областями вокруг первого кольца и т.д.
Вы видите какой-либо способ вывести 'кольца' из битов изящным способом?