О расчете разницы температур между почтовыми индексами - PullRequest
1 голос
/ 24 августа 2011

Опора А. Я написал почтовый сервер, который дает мне 32 000 почтовых индексов США.У каждого почтового индекса есть связанный lat-long.Имея 2 почтовых индекса, я могу найти расстояние между ними по их широте.

Опора B. Я также написал метеорологический сервер, на котором можно ввести не более 200 почтовых индексов, и он выплевывает температуру в каждом из этих почтовых индексов..

Человек говорит, что его почтовый индекс - Z, температура - T. Он спрашивает меня, какое самое близкое место от Z, где его температура как минимум на 10 градусов ниже?

Итак, я получаю список из 200 почтовых индексов.от Z, отсортированный по расстоянию (используя опору A).Я кормлю это B и получаю 200 температур.Если ни один из них не на 10 градусов круче, я получаю следующие 200 почтовых индексов и повторяю их до тех пор, пока это не будет сделано.

Проблема: это выглядит довольно неэффективно и грубо.Я чувствую, что мне не хватает некоторого понимания физики.Не всегда верно, что если вы идете на север, температура понижается и на юг нагревается.Так что направление не помогает.Высота, вероятно, есть (горы круче, чем долины), но данные почтовых индексов, привязанные к высоте, найти сложно.

Можете ли вы, ребята, придумать какой-нибудь более разумный способ сделать это?Любые предложения приветствуются.Примечание: данные о погоде дорогие.Вы можете подключиться к серверу погоды только несколько раз, и каждый раз вы можете получить только 200 температур.(otoh, расстояния между любыми двумя почтовыми индексами являются предварительно вычисленными константами, и получить это бесплатно).

Ответы [ 3 ]

0 голосов
/ 25 августа 2011

Я согласен с комментарием на физическом форуме, что это не проблема физики, но некоторые выводы из физики (или, по крайней мере, математики) действительно могут быть в порядке.Если вам удастся дешево получить данные о погоде, вы сможете настроить набор данных и выполнить анализ один раз для направления поиска.

В частности, одновременно регистрируйте температуру для каждого местоположения.Затем для каждого местоположения рассчитайте изменение температуры для каждого смежного почтового индекса и свяжите это с относительной координатой (то есть направлением на соседний почтовый индекс) и сохраните этот список, упорядоченный по температуре.Когда кто-то вводит почтовый индекс запроса, ваш алгоритм будет начинаться с почтового индекса в верхней части списка и будет работать вниз.Каждый неудовлетворительный ответ добавляется в стек.Если ни один из соседних почтовых индексов не соответствует критериям (в данном случае на 10 градусов круче), алгоритм начнет работать через новый стек, повторяя алгоритм.

Я не замечательный программист, поэтому я не буду давать никакихкод, но мне кажется, что это будет "следовать" естественным контурам температурной карты лучше, чем поиск грубой силы и сохранит преимущество в близости результата.Если вы установили свой начальный набор данных с несколькими одновременными измерениями температуры, вы могли бы усреднить их по времени для лучшей производительности.

0 голосов
/ 25 августа 2011

Лучше всего для стекопотока.

Объединение баз данных.

Напишите запрос abs (lat-lat_o) + abs (long-long_0) <2.00 AND temp <temp_0 - 10. В этом запросе будет использована индексация на вашем сервере. </p>

Если результатов нет, увеличьте 2,00 кратно и повторите.

Если результаты, найдите ближайший. Если ближайший находится дальше, чем ближайший край вашей ограничительной рамки, сохраните эту запись и увеличьте 2.000 до этого расстояния и посмотрите, не ближе ли один из них.

Весы, эффективно использует базу данных.

0 голосов
/ 25 августа 2011

Вы могли бы сделать это путем двоичной сортировки всех почтовых индексов и получения всех их ниже почтового индекса пользователя в отсортированном списке, а затем сделать то же самое для этого подмножества для расстояния. Это должно быть достаточно быстро - двоичная сортировка - это log (n), поэтому вы не будете убивать себя при сортировке.

...