Ла Рокка М.Продвинутые алгоритмы и структуры данных
Познакомьтесь с самыми необходимыми алгоритмами решения сложных задач программирования в области анализа данных, машинного обучения и графов.
Вы постоянно сталкиваетесь с бесчисленными проблемами программирования, которые поначалу кажутся запутанными, трудными или нерешаемыми. Не отчаивайтесь! Многие из «новых» проблем уже имеют проверенные временем решения. Эффективные подходы к решению широкого спектра сложных задач кодирования легко адаптировать и применять в собственных приложениях, а при необходимости создавать собственные структуры данных под конкретную задачу. Сбалансированное сочетание классических, продвинутых и новых алгоритмов обновит ваш инструментарий программирования, добавив в него новые перспективы и практические методы.
Структура данных — это специальное решение для организации данных, которое предоставляет место для размещения элементов и возможность для их сохранения и извлечения
В листинге 14.2 показан псевдокод, реализующий алгоритм поиска в ширину (Breadth First Search, BFS), целью которого, как следует из названия, является максимально возможное расширение поиска, сохранение периметра уже посещенных вершин и расширение этого периметра до соседних вершин.
Это свойство позволяет использовать простую очередь вместо очереди с приоритетами. Неплохо, учитывая, что время добавления и удаления элемента для первой в худшем случае равно O(1) (тогда как для куч, например, эти операции выполняются за O(log(n))), что обеспечивает линейное время работы BFS. В худшем случае оно будет линейно зависеть от наибольшего числа вершин и ребер, то есть O(|V| + |E|). Для связных графов эту оценку можно упростить до O(|E|).