Всё про Алгоритмы и Структуры данных
前往频道在 Telegram
Мы не претендуем на оригинальность контента, мы лишь собираем материал из открытых источников. Ссылка: @Portal_v_IT Сотрудничество, авторские права: @oleginc, @tatiana_inc Канал на бирже: https://telega.in/c/structuredata
显示更多7 756
订阅者
-124 小时
-37 天
-2530 天
帖子存档
Топологическая сортировка
Самый простой вариант данной сортировки - это изменение DFS обхода. В DFS мы начинаем с вершины, сначала выводим ее на печать, а зачем рекурсивно вызываем DFS для смежных вершин. В топологической сортировке - мы будем использовать стек!
Мы не будем печатать сразу наши вершины, мы будем сначала вызывать рекурсивно топологическую сортировку для всех вершин, а после их записывать в стек. В результате мы распечатаем содержимое стека.
Самое важное, что вершина помещается только тогда, когда все ее смежные вершины находятся в стеке.
Senior Pack — это книги, юмор и новости. Собрали для вас все самое основное:
Сливы платных книг для программирования:
📚 Полка Разработчика
📖 Кладовая Книг
🗄 Архив Разработчика
🚽 IT Memes — свежий IT юмор, отобранный нейросетью;
🗞 3D News — актуальные новости из IT-индустрии.
Топологическая сортировка
Топологическая сортировка для ориентированного ациклического графа (DAG) - это линейное упорядочение вершин таким образом, что для каждого направленного ребра u-v: вершина u идет перед v в порядке. Топологическая сортировка для графа невозможна, если граф не является DAG.
Завтра мы рассмотрим саму сортировку!
Как определить зацикливание в ориентированном графе
Проблема: дан ориентированный граф. Необходимо проверить содержит ли граф цикл или нет
Алгоритм
1. Создайте граф, используя заданное количество ребер и вершин (условно, если граф еще не создан)
2. Создайте рекурсивную функцию, которая инициализирует текущий индекс или вершину, а также создает стек рекурсии
3. Отметьте текущий узел как посещенный, а также отметьте индекс в стеке рекурсии
4. Найдите все вершины, которые примыкают к данному узлу(но еще ни разу не посещались). Рекурсивно вызывайте данную функцию для этих вершин.
5. Если рекурсивный вызов вернет - true - значит это и есть истина и ваш финальный ответ. Кстати, если соседние вершины уже присутствуют в стеке рекурсии - вы можете сразу вернуть true
Алгоритм транспонирования графа
Мы проходим по списку смежности, и когда мы находим вершину v в списке смежности вершины u, которая указывает на ребро от u до v в основном графе, мы просто добавляем ребро от v до u в транспонированный граф, т.е. добавляем u в смежность список вершины v нового графа. Таким образом, обходя списки всех вершин основного графа, мы можем получить транспонированный граф. Таким образом, общая временная сложность алгоритма составляет O (V + E), где V - количество вершин графа, а E - количество ребер графа.
Найти работу в сфере айти можно 2 методами:
Первый. Бесконечно скроллить HeadHunter и пытаться что-то выклевать на LinkedIn. Офигеть от условий и закрыть.
Второй. Подписаться на IT Jobs. Это база адекватных предложений, где даже для новичков много мест с хорошей з/п.
Тут найдете работу как в Яндексе (именно сюда крупняки присылают вакансии напрямую), так и в молодых стартапах!
В общем, не теряйте времени и находите работу в 2 клика: @devs_it
Транспонирование графа
У многих графов есть еще одно условие, то что их можно транспонировать. Давайте сначала разберемся с тем, что же такое транспонирование.
Транспонированый ориентированный граф G - это другой ориентированный граф на том же множестве вершин со всеми ребрами, перевернутыми по сравнению с ориентацией соответствующих ребер в G. То есть, если G содержит ребро (u, v), то обратное (transpose / reverse) G содержит ребро (v, u) и наоборот.
Простой алгоритм для задачи нахождения материнской вершины
Самым тривиальным способом решения данной задачи будет выполнение BFS/DFS для всех вершин и выяснить: сможем ли мы достичь всех вершин из этой вершины.
Данный подход неэффективен, если наши графы достаточно большие, ибо его время будет O(V(E + V)). Однако, это самый простой путь для решения подобных задач. К тому же, мы недавно рассмотрели BFS / DFS
Задача: найти материнскую вершину в графе
Итак нам дан граф, нам нужно найти материнскую вершину.
Материнской вершиной в графе G = (V, E) называется вершина v такая, что все остальные вершины в G могут быть достигнуты путем из v.
Есть несколько кейсов, которые позволяют это сделать.
1. Ненаправленный связанный граф - в этом случае все вершины являются материнскими вершинами, поскольку мы можем достичь все другие узлы в графе из выбранного
2. Ненаправленный/Направленный исключенный граф - в этом случае нет материнских вершин, поскольку мы не можем достичь всех узлов из выбранного
3. Направленный связнфй граф - в этом случае мы должны найти вершину v в графе, что удостоена условию "маринский"
Девушка попросила помочь ей с гаджетом, а ты даже драйвера без помощи гугла обновить не можешь?
В канале НеЛамер ежедневно публикуются разные фишки, лайфхаки и многое другое, что поможет тебе обращаться с техникой на Ты и быть в силах помочь любой девочке с её гаджетом.
Подписывайся, изучай полезную информацию и не будь ламером: @Ne_Lamer
Оптимизация представления графов по средствам Set и hash-функций
Основа этой оптимизации будет заключаться в использовании - unordered set. Его реализацию вы можете встретить в c++, однако, может и реализовать ее сами.
Unordered_set может содержать ключ любого типа - предопределенную или определяемую пользователем структуру данных, но когда мы определяем ключ типа, определяемого пользователем, нам нужно указать нашу функцию сравнения, в соответствии с которой будут сравниваться ключи. По факту это единственная сложность в реализации данной структуры данных. Завтра обсудим, как же ее реализовать всё таки!
Представление графа через Set и hash суммы
По факту данное представление очень сильно схоже с списком смежности, однако, есть некоторые особенности! Давайте их и разберем сегодня.
Набор отличается от вектора 2мя вещами:
1. он хранит элементы в отсортированном порядке (так как мы используем Set)
2. дублирование элементов не допускается (так как по прежнему, это свойство самого Set)
Соответственно данный подход не получится применить для графов, у которых есть параллельные ребра.
Поскольку множества внутренне реализованы как деревья двоичного поиска (очень важный факт), ребро между двумя вершинами можно искать за время O (log V), где V - количество вершин в графе.
На картинке представлен пример того самого сета.
Завтра рассмотрим оптимизацию данного подхода
Приложения где используется алгоритм обхода BFS графа
1. Нахождения пути или кратчайшего пути. Ибо при использовании BFS мы всегда достигаем нужной вершины из заданного источника, используя минимальное количество ребер.
2. Поисковые роботы или сканеры. Исследуется страница источник и проходится все в ширину, для оценки самих страниц.
3. Социальные сети. По факту любая ваша соц. сеть - состоит сугубо из графа. И обходы графа тут используются как раз BFS в основном.
4. Системы GPS-навигации. Опять же для построения маршрута
5. Сборка мусора во многих языках программирования, написана как раз через обход графа в BFS стиле (.NET platform)
6. Для проверки двудольности графа
Изучить основы Python за 14 дней? За 990 рублей? Это реально!
Подключайтесь к нашему подготовительному курсу по Python-разработке!
Не важно, сколько вам лет, какое у вас образование и кем вы работаете сейчас. Для начала обучения не нужен опыт в разработке!
Даём только мясную и прикладную информацию. Никакой воды и траты вашего времени.
Всего за 2 недели вы изучите основы языка под руководством опытного наставника, пройдете 69 урока с практикой в браузере и напишите свою первую программу.
Торопитесь. Стартуем 12 октября!🤘
Применение DFS графа
Итак, многие задаются, зачем мне графы и зачем эти обходы и их понимание? А я отвечу: эти алгоритмы достаточно много где применимы. Давайте рассмотрим несколько примеров:
1. Обнаружить цикл (зацикливание) на графике
2. Поиск кратчайшего пути, также возможен при помощи DFS обхода графа. Обход DFS даст нам дерево кратчайших путей
3. Решать определенные пазлы (логические)
4. Топологическая сортировка, которую мы с вами тоже скоро разберем
Обход в глубину DFS графа
Обход в глубину (поиск в глубину) для графа аналогичен обходу в глубину дерева. Но и тут есть отличия (как и было с BFS): узел можно посетить циклично. Чтобы это избежать снова используйте логический массив посещений.
Кстати на гифке показан сам обход и сделано это максимально наглядно, советую внимательно изучить.
Обход в ширину (поиск в ширину) BFS графа
Обход BFS графа почти похож на обход дерева по ширине (который мы недавно разбирали). Единственное исключение заключается в том, что, в отличии от деревьев, графы могут содержать циклы, поэтому мы можем (случайно) прийти к одному и тому же узлу.
Чтобы избежать обработки узла более одного раза, мы используем логический массив посещений. Для простоты говорится, что все вершины достижимы из начальной вершины.
Представление графов при помощи списка смежности
По факту используется массив списков. Размер массива равен количеству вершин. Пусть массив будет array. Входной массив i представляет собой список вершин, смежных с i-ой вершиной. Это представление также можно использовать для представления взвешенного графа. Веса ребер можно представить в виде списков пар.
На картинке показан - самый простой способ использования и построение по нему графа
Представление графа через матрицу смежности
Матрица смежности - двумерный массив размером V x V, где V - количество вершин в графе. Пусть 2D-массив имеет значение со слотом adjij = 1, который укажет нам, что есть ребро от вершины i к вершине j.
Матрица смежности для неориентированного графа всегда симметрична. Матрица смежности также используетс для представления взвешенных графов. Если adjij = w, то из вершины i в вершину j существует ребро с весом w.
Представление графов
Тут тоже не всё так просто! Граф можно представить 2мя часто используемыми способами:
1. Матрица смежности
2. Список смежности
На самом-то деле есть и другие способы представления: Incidence List or Matrix.
Выбор того или иного представления сильно зависит от ситуации. По факту вам должно быть достаточно просто использовать нужные вам операции с графом. Чем проще - тем лучше
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
