Задать вопрос

Самый быстрый алгоритм определения страны по номеру телефона

Добрый день. Стоит задача определить страну, зная номер мобильного телефона. Алгоритм должен быть как можно более оптимальным в плане скорости, т.к. номеров очень много и всё должно работать быстро.
Пожалуйста, подскажите алгоритм, либо какие-то готовые решения или библиотеки (ЯП не имеет значения). Заранее спасибо
  • Вопрос задан
  • 8860 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
jetman
@jetman
Что может быть быстрее функции, вычленяющей код страны из номер телефона, и поиска страны по хеш-таблице «код» -> «страна»? Хеш-таблицы в большинстве языков реализованы адекватно, скорость выборки будет очень высокой.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
@MikhailEdoshin
У Google есть libphonenumber, не подойдет?
Ответ написан
@egorinsk
> Алгоритм должен быть как можно более оптимальным в плане скорости, т.к. номеров очень много и всё должно работать быстро.

Используйте Си/Java/.NET или откажитесь от слова «быстро», ни Питон, ни PHP так же быстро это не сделают. Сколько миллионов номеров надо обрабатывать в секунду? Откуда они приходят?
Ответ написан
Комментировать
@kmike
Вариант со словарем — хороший. Можно попробовать выжать еще крохи: не делать несколько запросов в хэш-таблицу (причем, скорее всего, в цикле на питоне) для определения кодов стран, а вместо этого мэппинг «код страны» -> «страна» хранить в Trie (или DAWG).

В github.com/kmike/datrie есть метод longest_prefix_item, которым можно получить самый длинный префикс данного номера и соответствующий ему объект. Записываем в datrie.Trie мэппинг «префикс-страна», вызываем longest_prefix_item и готово.

Вполне может оказаться быстрее (главным образом за счет того, что итерация будет вынесена в C-расширение и не нужно будет создавать копии строк длины 1, 2, 3 и тд). Гарантировать, что будет быстрее, не могу, но, в любом случае, с Trie из питона должно как минимум 1млн номеров/сек получаться.
Ответ написан
Комментировать
numitus
@numitus
Можно создать дерево номеров. На с++ можно будет спокойно обработать 10 млн номеров в секунду.
Ответ написан
Комментировать
barker
@barker
Очевидно, только по таблице префиксов. БД с кодами стран в инете куча.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы