Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
40_алгоритмов_Python.pdf
Скачиваний:
9
Добавлен:
07.04.2024
Размер:
13.02 Mб
Скачать

90

Глава 3. Алгоритмы сортировки и поиска

Обратите внимание, что перед использованием IntPolsearch массив необходи­ мо упорядочить с помощью алгоритма сортировки.

Производительность интерполяционного поиска

Если данные распределены неравномерно, производительность алгоритма ин­ терполяционного поиска будет низкой. Наихудшая производительность этого алгоритма — O(N), наилучшая — O (log(log N)), если данные достаточно одно­ родны.

ПРАКТИЧЕСКОЕ ПРИМЕНЕНИЕ

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

Используем изученные алгоритмы для решения следующей задачи: сопостав­ ление обращения в иммиграционный департамент некой страны с архивными записями. Когда кто-то подает заявление на визу для въезда в страну, система пытается сопоставить его с уже имеющейся информацией. Если найдено хотя бы одно совпадение, то система вычисляет, сколько раз в прошлом этот человек получал одобрение или отказ на въезд. Если же совпадение не найдено, система классифицирует заявителя как нового и выдает ему новый идентификатор. Система должна осуществить поиск в архиве, обнаружить и идентифицировать кандидата. Эта информация крайне важна, потому что если человек ранее по­ давал заявку и она была отклонена, это может негативно повлиять на решение по новому обращению. Аналогично, если заявка была одобрена в прошлом, это увеличивает шансы на получение визы. Как правило, в архивной базе данных миллионы строк, и нам потребуется хорошо продуманное решение для дости­ жения нужного результата.

Предположим, что архивная таблица в базе данных выглядит следующим об­ разом (табл. 3.1).

В данной таблице первый столбец — Персональный идентификатор. Он присва­ ивается каждому заявителю в архивной базе данных. Если в ней содержится 30 миллионов уникальных заявителей, то мы получим 30 миллионов индиви­ дуальных персональных идентификаторов.

Практическое применение

 

 

 

91

Таблица 3.1

 

 

 

 

 

 

 

 

 

 

 

 

 

Персо-

 

Иденти-

 

 

 

 

Дата

нальный

 

фикатор

 

 

Дата

 

 

Имя

Фамилия

Решение

принятия

иденти-

 

заявле-

рождения

фикатор

 

ния

 

 

 

 

решения

 

 

 

 

 

 

 

 

 

 

 

 

 

 

45583

 

677862

Джон

Доу

2000-09-19

Одобре­

2018-08-07

 

 

 

 

 

 

но

 

 

 

 

 

 

 

 

 

54543

 

877653

Иксмен

Икс

1970-03-10

Отказа­

2018-06-07

 

 

 

 

 

 

но

 

 

 

 

 

 

 

 

 

34332

 

344565

Агро

Вака

1973-02-15

Отказа­

2018-05-05

 

 

 

 

 

 

но

 

 

 

 

 

 

 

 

 

45583

 

677864

Джон

Доу

2000-09-19

Одобре­

2018-03-02

 

 

 

 

 

 

но

 

 

 

 

 

 

 

 

 

22331

 

344553

Кэл

Сортс

1975-01-02

Одобре­

2018-04-15

 

 

 

 

 

 

но

 

 

 

 

 

 

 

 

 

Второй столбец — это Идентификатор заявления. Каждый такой идентификатор связан с уникальным заявлением в системе. В прошлом человек мог подавать заявки несколько раз. Это означает, что в базе данных у нас будет больше уни­ кальных идентификаторов заявлений, чем персональных идентификаторов. Например, как видно из табл. 3.1, у Джона Доу только один персональный идентификатор, но два идентификатора заявлений.

В таблице представлен лишь образец архивного набора данных. Предположим, что наша структура данных содержит около одного миллиона строк с записями о заявителях за последние 10 лет. Новые кандидаты непрерывно добавляются со средней скоростью около двух претендентов в минуту. Для каждого канди­ дата нам необходимо выполнить следующие действия:

zz Выдать заявителю новый идентификатор заявления.

zz Проверить архивную базу данных на наличие совпадений.

zz Если совпадение найдено, использовать уже имеющийся личный идентифи­ катор заявителя. Нам также необходимо определить, сколько раз заявка была одобрена или отклонена.

zzЕсли совпадений не найдено, мы выдаем этому человеку новый личный идентификатор.

92

Глава 3. Алгоритмы сортировки и поиска

Предположим, что к нам пришел новый заявитель со следующими учетными данными:

zz Имя: Джон zz Фамилия: Доу

zzДата рождения: 2000-09-19

Как же нам разработать приложение, способное выполнять эффективный и эко­ номичный поиск?

Одна из стратегий поиска нового заявления в базе данных выглядит следующим образом:

zz Отсортировать базу данных по Дате рождения.

zz Каждый раз, когда прибывает кандидат, присваивать ему новый Идентифи-

катор заявления.

zz Отобрать все записи, соответствующие данной Датерождения. Это первичный поиск.

zz В найденных записях выполнить вторичный поиск, используя Имя и Фамилию.

zz Если совпадение найдено, использовать Персональный идентификатор в каче­ стве ссылки на заявителя. Подсчитать количество одобрений и отказов.

zzЕсли совпадений не найдено, выдать заявителю новый Персональный иден-

тификатор.

Давайте попробуем подобрать правильный алгоритм сортировки архивной базы данных. Мы можем смело исключить сортировку пузырьком, так как объем данных огромен. Сортировка методом Шелла будет работать лучше, но только в том случае, если наши списки частично упорядочены. Лучше всего для этой задачи подходит сортировка слиянием.

Когда прибывает новый человек, нам необходимо отыскать его в базе данных. Поскольку данные уже отсортированы, можно использовать либо интерполя­ ционный, либо бинарный поиск. Скорее всего, записи о кандидатах будут упо­ рядочены согласно Дате рождения, поэтому мы можем без опаски использовать бинарный поиск.

Сначала мы осуществим поиск на основе Даты рождения, что даст нам соответ­ ствующий набор заявителей. Далее нам потребуется найти нужного человека в небольшой группе людей, у которых одна и та же дата рождения. Поскольку мы успешно сократили данные до небольшого подмножества, мы можем ис­

Резюме

93

пользовать любой алгоритм поиска, включая сортировку пузырьком. Обратите внимание, что в данном случае мы немного упростили проблему вторичного поиска. Затем нам нужно подсчитать общее количество одобрений и отказов путем агрегирования результатов поиска, если найдено более одного совпадения.

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

РЕЗЮМЕ

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

Вследующей главе мы изучим динамические алгоритмы и разберем практиче­ ский пример разработки алгоритма. Также мы подробно рассмотрим алгоритм ссылочного ранжирования PageRank и алгоритм линейного программирования.