Поиск геокода в C

Я хочу выполнить сверхбыстрый поиск геокода, возвращающий координаты для ввода города, города или страны. Мои знания базовые, но из того, что я понимаю, написание их на C - хорошее начало. Я думал, что имеет смысл иметь такую ​​древовидную структуру:

  • England
    • Kent
    • Орпингтон
    • Чатам
    • Рочестер
    • Дувр
    • Edenbridge
  • Wiltshire
    • Swindon
    • Мальмсбери

В моем файле / базе данных у меня будут координаты и название города. Если дать моей программе имя «Кент», мне нужна программа, которая сможет вернуть мне координаты, связанные с «Кент», самым быстрым из возможных способов.

Должен ли я хранить данные в двоичном файле или базе данных SQL по соображениям производительности? Как лучше всего искать эти данные? Возможно, поиск по бинарному дереву? Как следует хранить данные? возможно?


person J.Zil    schedule 30.07.2012    source источник
comment
Геокодирование и автозаполнение не имеют ничего общего друг с другом.   -  person SLaks    schedule 30.07.2012
comment
Как вы думаете, почему C ++ поможет? Код C ++ может быть быстрее на ничтожно малую величину, но это будет намного перевешено временем, затрачиваемым на запросы к вашему файлу / базе данных / чему угодно, а сложность разработки на C ++ будет огромными накладными расходами, если у вас нет опыта.   -  person Dan Puzey    schedule 30.07.2012
comment
Я чувствую себя здесь как в логове со львами. Я отредактировал исходный пост, чтобы отразить, что меня интересует возвращение координат мест, которые он находит. Я добавил c, c # и c ++, потому что, когда я сказал, что хочу, чтобы он был написан на C, я имел в виду охватить все это. У меня нет опыта кодирования на C, C # и C ++, поэтому, возможно, один из них лучше подходит для этого.   -  person J.Zil    schedule 30.07.2012
comment
Геокодирование неизбежно станет огромным узким местом. Я не думаю, что имеет большое значение, насколько быстр ваш код (он всегда будет на порядок слишком быстрым по сравнению с самим геокодированием)   -  person Alex    schedule 30.07.2012
comment
Язык программирования здесь не главное. Вам нужно сначала выяснить, что именно вы пытаетесь сделать и как собираетесь это делать. Когда у вас будет четкий план, какие данные вы хотите хранить, как и как вы собираетесь искать в них и т. Д., Тогда вы можете подумать о том, какой язык вы будете использовать для его реализации. Лучшим выбором будет язык, с которым вы знакомы.   -  person sth    schedule 30.07.2012
comment
Хорошо, спасибо за вклад. Я не слишком ясно дал понять свой вопрос. В моем файле / базе данных у меня будут координаты и название города. Если дать моей программе имя Кент, мне нужна программа, которая сможет вернуть мне координаты, связанные с Кентом, как можно быстрее.   -  person J.Zil    schedule 30.07.2012
comment
@JamesWillson: Это имело смысл. Отредактируйте это в своем вопросе.   -  person Linuxios    schedule 30.07.2012
comment
Предлагаю использовать базу данных. Пусть база данных позаботится о структурах данных и методах быстрого поиска. Вот для чего они созданы.   -  person Thomas Matthews    schedule 30.07.2012
comment
Вы рекомендуете базу данных, такую ​​как SQLite, или нереляционную, например Mongo? Кроме того, не будет ли хуже по скорости?   -  person J.Zil    schedule 30.07.2012
comment
Не знаю, зависит от вашей ситуации. В магазине GPS, в котором я работал, они использовали пространственную базу данных. Вы можете исследовать это.   -  person Thomas Matthews    schedule 31.07.2012


Ответы (3)


Вот небольшой совет, но не более того:

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

В этом случае алфавитный список мест больше подходит для ваших запросов. К каждому месту, не находящемуся на самом верхнем уровне, вы захотите добавить какую-то ссылку на имя его «родителя». Если у вас есть алфавитный список мест, вы также можете рассмотреть вопрос об указателе, возможно, таком, который указывает непосредственно на первое место в списке, которое начинается с каждой буквы алфавита.

По мере того, как вы описываете свою проблему, кажется, что у нее гораздо больше общего с хранением слов в словаре (я имею в виду такие вещи, в которых вы ищите слова, а не какой-либо конкретный тип данных коллекции на любом конкретном языке программирования, который относится к одному и тому же name), чем с большей частью того, что идет под видом геокодирования.

Я предполагаю, что географический справочник, включающий названия всех городов мира, регионов и стран (и их координаты) с населением, скажем, более 1000 человек, может быть сохранен в очень простой структуре данных (в основном в виде списка) с индексом или двумя для быстрого определения местоположения первого названия места A, первого названия B и так далее. С небольшим сжатием вы, вероятно, сможете сохранить это в памяти большинства современных настольных ПК.

person High Performance Mark    schedule 30.07.2012
comment
Вы можете располагать записи в любом порядке. Вы должны создать один или несколько индексов, которые представляют собой ассоциативные массивы, содержащие ключ (название города) и значение (указатели на другую информацию). Таким образом, вы можете быстро получить доступ к данным, не беспокоясь об организации записей. См. Также теорию баз данных. - person Thomas Matthews; 30.07.2012
comment
@ThomasMatthews: Я думаю, вам следует перепостить свой «комментарий» в качестве ответа, поскольку он предлагает советы, совершенно отличные от моих собственных. - person High Performance Mark; 30.07.2012
comment
Да, не могли бы вы объяснить это еще немного, пожалуйста? Я сейчас читаю об индексах. - person J.Zil; 30.07.2012

Я думаю, что лучший совет, который я могу дать, - использовать любой язык, с которым вы знакомы, для получения желаемых результатов. Беспокойтесь о производительности, когда ваш код заработает. Затем вы можете по очереди переводить очень конкретные элементы функциональности на C или C ++, пока не получите желаемый результат.

person Robert H    schedule 30.07.2012

Не стоит беспокоиться о том, как хранится информация, кроме случаев дублирования данных.

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

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

См. Также: В какой момент стоит использовать база данных?

person Thomas Matthews    schedule 30.07.2012