Data Science: Алгоритмы и Структуры данных
رفتن به کانال در Telegram
Мы не претендуем на оригинальность контента, мы лишь собираем материал из открытых источников. Ссылка: @Portal_v_IT Сотрудничество: @oleginc Канал на бирже: https://telega.in/c/structuredata
نمایش بیشتر7 575
مشترکین
-324 ساعت
-197 روز
-6630 روز
آرشیو پست ها
✔️ Шпаргалка по выбору алгоритма машинного обучения
#cheatsheet #datascience
📌 Шпаргалка по алгоритмам и структурам данных
Сохраняй себе и делись с другом!
#cheatsheet
Хочешь учить Python в кайф?
Салют! На связи Николай. Я senior-разработчик из Яндекс, со стажем 9 лет в программировании. У меня есть телеграм-каналы для эффективного и захватывающего изучения Python'a:
Практика – ключевой элемент в обучении, поэтому канал Python | Тесты для программистов – настоящая находка с увлекательными тестами и детальным объяснением к каждому ответу. Присутствует классификация по сложности и рангам, следовательно подойдет как для полных чайников, так и для твердых мидлов.
Разъяснивший Python - в нём вы узнаете как основы питона (функции, библиотеки), так и его глубинные тайны (почему 0.1 + 0.2 != 0.3). А ещё здесь целая куча гайдов, фич, шпаргалок, программ и всякой полезности.
Типы связных списков (LinkedList)
Продолжаем начатую вчера тему про LinkedList! Сегодня на посылке дня у нас типизация и основные операции над ними.
Типы:
1. Простой связный список - навигация данного списка только вперед. То есть добавляются новые элементы только в конец списка и никак по другому. Содержит только одну ссылку next
2. Двусвязный список. Эти списки, которые позволяют нам ходить по ним в обоих направлениях. Соответственно и добавлять также элементы, как в начало, так и в конец. А также стоит упомянуть, что кроме ссылки next у них есть ссылки prev.
3. Круговой связный список - последний элемент данного списка содердит ссылку на первый элемент данного списка. А первый элемент будет иметь ссылку на последний элемент. То есть, можно сказать что это тоже двусвязный список, но закольцованный.
Основные операции над связными списками
1. Вставка - добавит элемент в начало списка(конец списка в зависимости от реализации (к примеру если есть ссылки head и tail мы можем добавлять в обоих направлениях)
2. Удаление - удаляет элемент в начале списка (или его в конце, если ссылка tail, кроме head)
3. Дисплей - отображает полный список (реализован через цикл).
4. Поиск - поиск элемента по заданному списку (реализован через цикл)
5. Удаление по ключу - находит элемент по ключу, после удаляет его (также через цикл)
Математика для аналитика данных как телескоп «Джеймс Уэбб» для астрофизика — помогает видеть детали и делать правильные выводы.
Чтобы уверенно использовать математику в своей работе и повысить конкурентоспособность, пройдите курс от Яндекс Практикума. Он создан специально для начинающих аналитиков.
За 4 месяца обучения вы:
→ погрузитесь в линейную алгебру и математический анализ;
→ разберётесь в теории вероятности;
→ решите более тысячи задач в онлайн-тренажёре;
→ создадите 4 проекта для своего портфолио;
→ подготовитесь к собеседованиям с помощью симулятора.
Опытные аналитики разложат сложные темы по полочкам, а наставники подскажут, как вам ускорить прогресс. Вы сможете совмещать с работой или другой учёбой, а также попробовать обучение бесплатно. Переходите по ссылке и приступайте к занятиям!
Начать обучение →
Связный список (LinkedList)
Связанный список является второй наиболее используемой структурой данных после массива. Ниже приведены важные термины для понимания концепции связанного списка.
Node - элемент связного списка, этот элемент содержит в себе два значения, которые и являются основой LinkedList: ссылка на следующий элмент и значение
Next - ссылка на следующий элемент, то есть на следующую Node
Value - значение самой Node, который мы хотим хранить
Достоинства использования:
1. Эффективное (за константное время) добавление и удаление элементов
2. Размер ограничен только объёмом памяти компьютера и его разрядностью
3. Динамическое добавление и удаление элементов
Недостатки использования:
1. Сложность прямого доступа к элементу, а именно определения физического адреса по его
2. На указатели расходуется дополнительная память, так как их надо хранить
3. Некоторые операции медленее, так как нельзя получить по индексу элемент и надо проходиться по всему списку
4. Труднее использовать при параллельных вычислениях
5. Соседние элементы списка находятся не рядом, что может поспособствовать проблеме при их кэшировании
Алгоритм Жонглирования
Как и обещал вчера, есть другой способ решения для операции вращения массива. На самом деле это продолжение 2 метода решения, что мы рассмотрели вчера. Просто вместо перемещения по одному, массив делится на разные выборки(sets), где количество этих выборок равно НОД n и d. Соответственно перемещение элементов проиходит внутри этих выборок(sets)
Возьмем для примера следующие параметры: arr = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, n =12, d = 3. Высчитав НОД не составит труда и он будет равен 3 (НОД(12, 3))
Соответственно после первого прохода мы получим следующий массив:
4, 2, 3, 7, 5, 6, 10, 8, 9, 1, 11, 12
На последующем шаге:
4, 5, 3, 7, 8, 6, 10, 11, 9, 1, 2, 12
И на завершающем шаге:
4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3
Time complexity : O(n)
Auxiliary Space: O(1)
Выучить программирование - легко!
Для успешного обучения кодингу обязательно нужны шпаргалки и руководства. Но где их взять?
Тут, специально для вас, создали хранилище со всем самым необходимым – Code Guru, советуем подписаться ;)
Операция вращения массива
Задача: Написать функцию rotate, которая вращает массив размера n на d элементов
Способ решения 1: использование дополнительного массива
К примеру нам даны следующие параметры на входе: arr = 1, 2, 3, 4, 5, 6, 7, d = 2, n = 7
1. Первым делом мы предсохраним первые d элементов в temp массиве temp = 1, 2
2. Сделаем очищение этих элементов с начала нашего оригинального массива (к примеру при помощи shift(часто реализовано во многих языках, только называется по другому)). arr = 3, 4, 5, 6, 7, 6, 7
3. Приатачим к оригинальному массиву наш temp массив: arr = 3, 4, 5, 6, 7, 1, 2
Time Complexity: O(n)
Space Complexity: O(d)
Cпособ решения 2: вращать друг за другом
1. Сохраним arr0 во временной переменной temp
2. Переместите arr1 в arr0 с последующими поступить также и наконец добавьте в конец temp
То есть по тому же примеру у нас есть параметры: arr = 1, 2, 3, 4, 5, 6, 7, d = 2
Мы данный массив будем вращать 2 раза, первый раз получим следующий массив: 2, 3, 4, 5, 6, 7, 1
После второго же вращения получится: 3, 4, 5, 6, 7, 1, 2
Time Complexity: O(n * d)
Space Complexity: O(1)
Source Code вы можете увидеть на картинке ниже!
Но есть более интересный способ решения, который мы рассмотрим в следующий раз.
В сеть слили ссылки на 3 топовых канала! Успей, пока не сменили:
• Бесплатные авторские видеоуроки и курсы — IT-EX | Уроки программирования
• Крупнейший справочник для сисадминов — Кладовка Сисадмина
• Самая топовая IT-литература — Просто IT книги
Подпишись, и получай порцию годного контента каждый день!
🐍 Быстрая сортировка
QuickSort — это алгоритм «разделяй и властвуй». Он выбирает элемент в качестве опорного элемента и разбивает заданный массив вокруг выбранного опорного элемента.
Реализация на Python:
def quicksort(l, r, nums):
if len(nums) == 1:
return nums
if l < r:
pi = partition (l, r, nums)
quicksort(1, pi-1, nums)
quicksort (pi+1, r, nums)
return nums
Существует много разных версий quickSort, которые по-разному выбирают точку опоры.Разновидности массивов
Понятное дело, что есть и определенные разновидности массивов. В частности основными типами являются:
1. Одномерные
2. Многомерные
Тут все просто, одномерные массивы - это те что представлены выше на картинке.
Многомерные же, массивы в которых вложены другие массивы.
Но есть и другая типизация:
1. Статические массивы
2. Динамические массивы
Тут тоже никаких сложностей.
Статический массив - массив у которого заранее предопределен его размер. Основные сложности в использовании, тесно связаны с этим ограничением. Так как если вы захотите добавить что-то сверх, вам придется создавать новый массив и перекладывать из старого все значения.
Динамический массив - массив у которого динамический размер. Тут проще с использованием, однако есть и свои особенности. В частности как выделять память для такого массива. Не всегда же увеличивать ее в 2 раза, было бы очень глупой потерей памяти.
Хранение динамического массива в памяти
Под массив всегда выделяется фрагмент в памяти RAM, размер этой памяти всегда больше требуемого. Дается такому выделению имя - емкость массива. Текущая длина хранится в отдельном счетчике. Она естественным образом нужна для того чтобы определить размер, но также и для того чтобы следить за границей массива.
Команда увеличения размера массива - если емкость не превышена, просто измнит счетчик длины массива до нужного размера.
Команда увеличения размера сделает следующее:
1. Выделит новый фрагмент в RAM, размер которого превышает размер массива
2. содержимое массива скопирует в эту выделенную память
3. Размер и емкость массива обнулит
4. В служебной стрктуре, где хранятся указатели - изменит их
5. Запустит высвобождение памяти, которая ранее использовалась для массива
Структура данных: массивы
Массив (список) - набор элементов, которые хранятся непрерывно в памяти. Что означает непрерывно? Это означает, что в памяти данная структура хранится ячейка за ячейкой.
Основная идея массивов состоит в том, чтобы хранить несколько различных элементов в одном месте.
Основным плюсом будет то, что очень просто вычислить положение каждого элемента. Потому что каждый последующий добавленный элемент будет добавлять смещение к базовому элементу. Если быть более точным, то смещение будет в памяти.
Изображение показывает, что каждый элемент можно однозначно идентифицировать по их индексу в массиве (аналогично тому, как вы можете идентифицировать список ваших любимых вещей в порядке важности).
Почему ИИ так актуален в банковской сфере?
Узнай на лекции от Газпромбанка уже 25 августа
Подробнее о лекции:
Где: в Zoom
Во сколько: в 18:00 (по МСК)
Спикер: Адель Валиуллин, начальник отдела искусственного интеллекта Газпромбанка
Что узнаем: почему искусственный интеллект (AI) сегодня так актуален, в каких сферах применяется, какие задачи решаются в банке на основе AI и, конечно, что нужно знать для построения карьеры в data science и AI
Встречаемся 25 августа, регистрируйся по ссылке - https://vk.cc/cfSGEf
Структуры данных в JavaScript.
В видео автор расскажет про то, какие структуры данных встроены в JavaScript и покажет как создать собственную структуру данных ArrayList
https://youtu.be/dFwNSyVC_5Y
Найти работу в айти можно 2 методами:
Первый. Бесконечно скроллить HeadHunter и пытаться что-то выклевать на LinkedIN. Офигеть от условий и закрыть.
Второй. Подписаться на JavaJob. Это база адекватных предложений, где даже для новичков много мест с хорошей з/п.
Тут найдете работу как в Яндексе (именно сюда крупняки присылают вакансии напрямую), так и в молодых стартапах!
В общем, не теряйте времени и находите работу в 2 клика: @Job_javadevs
В сеть слили ссылки на 3 топовых канала! Успей, пока не сменили:
• Бесплатные авторские видеоуроки и курсы — IT-EX | Уроки программирования
• Крупнейший справочник для сисадминов — Кладовка Сисадмина
• Самая топовая IT-литература — Просто IT книги
Подпишись, и получай порцию годного контента каждый день!
💻 Основные структуры данных
Из видео вы узнаете про самые используемые структуры данных: статический, динамический и ассоциативный (HashTable) массив.
Видео довольно трудное для новичков, поэтому переходите к просмотру только в том случае, если вы знаете про hash-функции и сложность алгоритмов. А ещё автор говорит очень быстро, поэтому советуем немного размять мозги, чтобы всё освоить
https://www.youtube.com/watch?v=K4sYJHuNgmE
