Data Science: Алгоритмы и Структуры данных
7.69K subscribers
421 photos
42 videos
6 files
3.35K links
Мы не претендуем на оригинальность контента, мы лишь собираем материал из открытых источников.

Ссылка: @Portal_v_IT

Сотрудничество, авторские права: @oleginc, @tatiana_inc

Канал на бирже: https://telega.in/c/structuredata
Download Telegram
Приложения где используется алгоритм обхода BFS графа

1. Нахождения пути или кратчайшего пути. Ибо при использовании BFS мы всегда достигаем нужной вершины из заданного источника, используя минимальное количество ребер.

2. Поисковые роботы или сканеры. Исследуется страница источник и проходится все в ширину, для оценки самих страниц.

3. Социальные сети. По факту любая ваша соц. сеть - состоит сугубо из графа. И обходы графа тут используются как раз BFS в основном.

4. Системы GPS-навигации. Опять же для построения маршрута

5. Сборка мусора во многих языках программирования, написана как раз через обход графа в BFS стиле (.NET platform)

6. Для проверки двудольности графа

Data Science: Алгоритмы и Структуры данных
Представление графа через Set и hash суммы

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

Набор отличается от вектора 2мя вещами:

1. он хранит элементы в отсортированном порядке (так как мы используем Set)

2. дублирование элементов не допускается (так как по прежнему, это свойство самого Set)

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

Поскольку множества внутренне реализованы как деревья двоичного поиска (очень важный факт), ребро между двумя вершинами можно искать за время O (log V), где V - количество вершин в графе.

На картинке представлен пример того самого сета.

Завтра рассмотрим оптимизацию данного подхода

Data Science: Алгоритмы и Структуры данных
Оптимизация представления графов по средствам Set и hash-функций

Основа этой оптимизации будет заключаться в использовании - unordered set. Его реализацию вы можете встретить в c++, однако, может и реализовать ее сами.

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

Data Science: Алгоритмы и Структуры данных
Задача: найти материнскую вершину в графе

Итак нам дан граф, нам нужно найти материнскую вершину.

Материнской вершиной в графе G = (V, E) называется вершина v такая, что все остальные вершины в G могут быть достигнуты путем из v.

Есть несколько кейсов, которые позволяют это сделать.

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

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

3. Направленный связнфй граф - в этом случае мы должны найти вершину v в графе, что удостоена условию "маринский"

Data Science: Алгоритмы и Структуры данных
1
Можно ли собрать полезный рабочий инструмент с ИИ за один вечер?
Проверим на первой бесплатной лаборатории вайб-кодинга от Зерокодера

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

Но главное – формат самой лаборатории.

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

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

И это только первая задача. Каждую неделю – новый кейс и новый инструмент: приложения, дашборды, автоматизации и AI-помощники.

Забрать первое участие в лаборатории бесплатнопо ссылке
Простой алгоритм для задачи нахождения материнской вершины

Самым тривиальным способом решения данной задачи будет выполнение BFS/DFS для всех вершин и выяснить: сможем ли мы достичь всех вершин из этой вершины.

Данный подход неэффективен, если наши графы достаточно большие, ибо его время будет O(V(E + V)). Однако, это самый простой путь для решения подобных задач. К тому же, мы недавно рассмотрели BFS / DFS

Data Science: Алгоритмы и Структуры данных
10 рецептов машинного обучения от разработчиков Google

В десяти коротких видеоуроках курса машинного обучения от разработчиков Google рассмотрены приемы Machine Learning для начинающих аналитиков данных.

➡️Читать статью

Data Science: Алгоритмы и Структуры данных
Please open Telegram to view this post
VIEW IN TELEGRAM
Забрать подписки на сервисы можно на ggsel ⚾️

На сайте собраны подписки на YT Premium, Spotify, нейронки и другой софт ☕️

Иностранные карты для оплаты не потребуются — на ggsel все безопасно оплачивается с обычных карт российских банков 🫰
Please open Telegram to view this post
VIEW IN TELEGRAM
OpenAI Gym – это инструментарий для разработки и сравнения алгоритмов обучения с подкреплением. Это библиотека с открытым исходным кодом, которая дает доступ к стандартизованному набору сред.

➡️Ссылка на Github

Data Science: Алгоритмы и Структуры данных
Please open Telegram to view this post
VIEW IN TELEGRAM
Транспонирование графа

У многих графов есть еще одно условие, то что их можно транспонировать. Давайте сначала разберемся с тем, что же такое транспонирование.

Транспонированый ориентированный граф G - это другой ориентированный граф на том же множестве вершин со всеми ребрами, перевернутыми по сравнению с ориентацией соответствующих ребер в G. То есть, если G содержит ребро (u, v), то обратное (transpose / reverse) G содержит ребро (v, u) и наоборот.

Алгоритм транспонирования графа

Мы проходим по списку смежности, и когда мы находим вершину v в списке смежности вершины u, которая указывает на ребро от u до v в основном графе, мы просто добавляем ребро от v до u в транспонированный граф, т.е. добавляем u в смежность список вершины v нового графа. Таким образом, обходя списки всех вершин основного графа, мы можем получить транспонированный граф. Таким образом, общая временная сложность алгоритма составляет O (V + E), где V - количество вершин графа, а E - количество ребер графа.

Data Science: Алгоритмы и Структуры данных
21 урок из курса по глубокому машинному обучению от Andrew Ng

21 урок, который извлек ведущий аналитик Национального банка Канады из курса по глубокому машинному обучению, от Andrew Ng.

➡️Читать статью

Data Science: Алгоритмы и Структуры данных
Please open Telegram to view this post
VIEW IN TELEGRAM
Говорят и показывают сеньоры: обучение Junior Data Scientist

Как начать изучение Data Science? Что и где читать? Какие есть подводные камни, советы и уловки? Статья в помощь для Junior Data Scientist.

➡️Читать статью

Data Science: Алгоритмы и Структуры данных
Please open Telegram to view this post
VIEW IN TELEGRAM
Как определить зацикливание в ориентированном графе

Проблема: дан ориентированный граф. Необходимо проверить содержит ли граф цикл или нет

Алгоритм

1. Создайте граф, используя заданное количество ребер и вершин (условно, если граф еще не создан)

2. Создайте рекурсивную функцию, которая инициализирует текущий индекс или вершину, а также создает стек рекурсии

3. Отметьте текущий узел как посещенный, а также отметьте индекс в стеке рекурсии

4. Найдите все вершины, которые примыкают к данному узлу(но еще ни разу не посещались). Рекурсивно вызывайте данную функцию для этих вершин.

5. Если рекурсивный вызов вернет - true - значит это и есть истина и ваш финальный ответ. Кстати, если соседние вершины уже присутствуют в стеке рекурсии - вы можете сразу вернуть true

Data Science: Алгоритмы и Структуры данных
Топологическая сортировка

Топологическая сортировка для ориентированного ациклического графа (DAG) - это линейное упорядочение вершин таким образом, что для каждого направленного ребра u-v: вершина u идет перед v в порядке. Топологическая сортировка для графа невозможна, если граф не является DAG.

Завтра мы рассмотрим саму сортировку!

Data Science: Алгоритмы и Структуры данных
Топологическая сортировка

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

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

Самое важное, что вершина помещается только тогда, когда все ее смежные вершины находятся в стеке.

Data Science: Алгоритмы и Структуры данных
Структура данных - строки

Строки определяются как массив символов. Разница между символьным массивом и строкой заключается в том, что строка заканчивается специальным символом "\0"

Объвить строку так же просто как объявить одномерный массив. Обращаю особое ваше внимание, что каждый символ строки хранится отдельно в ячейке. И как одномерный массив - строки имеют всё те же свойства.

Data Science: Алгоритмы и Структуры данных
Разница между 2мя большими числами

Даны два числа в виде строк. Числа могут быть очень большими (не помещаться в long long int), задача - найти разницу этих двух чисел.

Data Science: Алгоритмы и Структуры данных
Разница между 2мя большими числами


1. Поверните обе строки (чтобы конец стал началом) - reverse string operation. Создайте пустую строку для результата

2. Продолжайте вычитать цифры одну за одной из 0го индекса(в повернутых строка) - до конца меньшей строки, добавьте разницу, если она положительна в конец результата. Если разница отрицательна, то прибавьте 10 и отслеживайте перенос как +1, если положительный, то перенос равен 0

3. Снова переверните результативную строку


Как видите: чтобы посчтитать разницу между 2мя строками - мы используем обычную математику(якобы в столбик)

Data Science: Алгоритмы и Структуры данных
Задача на бинарные строки

Давайте сначала разберемся что такое бинарные строки! На самом деле тут ничего сложного: это строки которые могут содержать только 2 различных символа. К примеру a и b: abbbbaaa

А теперь после теории, перейдем к задаче.

Преобразуйте данную строку в строку, в которой не будет содержаться значение подстроки "ab". Чтобы убрать "ab", мы можем пользоваться операциями, в которой мы заменим эту подстроку на "bba". Основная цель данной задачи, найти общее количество операций, которые необходимы для преобразование данной строки.

Input : s = 'abbaa'
Output : 2
Объяснение:
Тут, 'ab'baa заменяется на s = bbabaa
bb'ab'aa а тут на s = bbbbaaa
Нам потребовалось 2 операции на это.

Попробуйте решить данную задачу.

Data Science: Алгоритмы и Структуры данных
Z - алгоритм

Задача данного алгоритма найти все вхождения шаблона в текст за линейное время. Пусть для текста равна n, а длина шаблона - m, тогда общее затраченное время составит O(m+n) с линейной пространственной сложностью. Для этого мы строим специальный Z-массив.

Что такое Z массив?

Для строки str0..n-1 массив Z имеет ту же длину, что и строка. Элемент Zi массива Z хранит длину самой длинной подстроки, начиная с Zi, которая таке является префиксом str0..n-1

Пример:

str = "aaaaaa"
Z = {x, 5, 4, 3, 2, 1}

Data Science: Алгоритмы и Структуры данных
2