Data Science: Алгоритмы и Структуры данных
Открыть в Telegram
Мы не претендуем на оригинальность контента, мы лишь собираем материал из открытых источников. Ссылка: @Portal_v_IT Сотрудничество: @oleginc Канал на бирже: https://telega.in/c/structuredata
Больше7 575
Подписчики
-324 часа
-197 дней
-6630 дней
Архив постов
Interpolation Sort
Имея отсортированный массив нам надо написать функцию поиска элемента. Линейный поиск сделает это за время O(n) , Jump Search - O(√ n), а бинарный за O(log n).
Поиск с интерполяцией (Interpolation Sort) является улучшением по сравнением с бинарным поиском для экземпляров, где значения в отсортированном массиве равномерно распределены.
Двоичный поиск всегда переходит к центру. Interpolation Sort может идти в разные места в соответствии с значением ключа, по которому выполняется поиск. Например, если значение ближе к последнему элементу, поиск выгоднее начать с конца.
Сложность выйдет O(log(log n)). О том как выбрать значения ключа, поговорим в следующем посте.
📣 Распродажа IT-курсов в Академии ТОР!
✅ До конца недели скидка 50% на первые два месяца обучения на курсы
• Тестирование (QA)
• Графический дизайн
• Python-разработчик
• Java-разработчик
✅ До конца месяца 20% скидка на все обучение.
✅ До конца месяца 25% скидка на детское обучение.
🔥промокод TGSUPER
Связаться с менеджером
Когда стоит использовать Jump Search
Бинарный поиск - лучше, чем Jump Search. Для чего же тогда использовать Jump Search. У него есть одно преимущество перед бинарным поиском: мы возвращаемся назад только один раз. Для бинарного поиска может потребоваться до O(logN) переходов в ситуации, когда мы захотим найти элемент, который является наименьшим или даже меньше чем наименьший.
Занимаетесь кодингом, разрабатываете и оптимизируете проекты, интересуетесь грамотными подходами их проектирования? Тогда вам к нам!
На __Just code IT__ вы узнаете много крутого из мира программирования😏
— Обсуждения тонкостей языков, алгоритмов, ИБ, компиляторов;
— Посты про качество кода и системное программирование;
— Дайджесты в сфере прикладного IT и научно-популярные статьи.
Ловите несколько горячих постов про архитектуру и механизмы работы проектов:
● ОС для OISC-процессоров;
● Первое знакомство с языком ассемблера;
● Поддержка микроядер в железе;
● Хардкорные инструменты для WEB-разработки.
Переходите __по ссылке__, чтобы не пропустить ни одного полезного материала🔥
Оптимально выбрать блок для пропуска в Jump Search
В худшем случае мы должны делать n/m перехов. Где n - длина массива, а m - длина размера перехода. Если проверенное значение больше, чем искомый элемент, мы выполним m-1 сравнений больше, так как будем использовать линейный поиск.
Общее количество сравнений в наихудшем случае будет ((n / m) + m - 1). Значение функции ((n / m) + m - 1) будет минимальным, когда m = √n. Следовательно, лучший размер шага будет являться m = √n
Jump Search
Как и бинарный поиск, поиск с переходом(прыжком) выполним только для отсортированных массивов. Основная идея состоит в том, чтобы проверять меньшее количество элементов, перескакивая вперед на фиксированное количество шагов, пропуская их.
Рассмотрим массив - 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, длина - 16. Размер блока возьмем - 4. Jump Search найдет значение 55 с помощью следующих шагов:
1. Переход от индекса 0 к индексу 4
2. Переход с индекса 4 к индеку 8
3. Перейсти с индекса 8 к индексу 12
4. Поскольку элемент с индексом 12 больше 55, мы вернемся на шаг назад. Переходим на индекс 8
5. Выполняем линейный поиск с индекса 8, чтобы получить элемент 55
Операция поиска в Splay Tree
Операция поиска в Splay Tree выполняет стандартный поиск BST, помимо поиска, также происходит и перемещение узла в корень.
Если поиск успешный, то найденный узел перемещается и становится корневым. В противном случае последний узел, к которому было обращение (до достижения NULL) - перемещается в корень.
Доступ к узлу
1. Через корень
2. Узел является дочерним по отношению к корню, либо левым потомком (применим правое вращение), либо правм потомком
3. Другие 2, которые расмотрим в будущем
4PDA теперь в Telegram!
4PDA – крупнейший в рунете тематический ресурс, посвященный технологиям, приложениям и кодингу. Специально для программистов у них появился официальный канал в телеграм, где вы увидите сливы платных курсов, интересные статьи и много другого!
Подписывайтесь: @4pda_forum
Расширяющее (косое) дерево - Splay Tree
Основная идея Splay Tree состоит в том, чтобы перенести элемент, к которому недавно осуществлен поиск(или доступ) в корень дерева. Тем самым дать возможность достучаться к нему повторно за O(1).
Представьте себе ситуацию, когда у нас есть миллионы ключей, и лишь некоторые из них используются чаще других, что кстати говоря весьма вероятно во многих приложениях.
Все операции с Splay Tree выполняются в среднем за O(log N) времени, где N - количество записей в дереве.
В ближайшие дни рассмотрим основные операции над данным деревом.
Видеокурсы — лучший способ выучить язык программирования
Вот каналы, которые собирают лучшие видеокурсы:
Python Expert – 585 видео про Python с нуля, Backend, Flask, Django, Data Science, Разработка Telegram ботов, Machine Learning.
ITLES – 1764 видео по Frontend, Java, Git, C#, C++, PHP, SQL, Figma, CSS, Linux, Data Science, Верстка, GameDev.
Скачивать ничего не нужно — все выложили на YouTube с доступом по ссылке.
Курс по python-разработке для тех, кто хочет сменить профессию.
Неважно, сколько вам лет и есть ли у вас опыт в IT — за 9 месяцев учёбы освоить разработку сможет каждый. Это возможно, если правильно выстроить программу и усердно заниматься. Упорство зависит от вас, а о качестве материалов позаботилась команда Яндекс Практикума.
— Программа основана на реальных требованиях работодателей к младшим специалистам.
— Интерактивный тренажёр помогает освоить теорию и закрепить её в тестах.
— Практика идёт на учебных проектах для портфолио: от чат-бота и сайта-отзовика до соцсети и многофункционального сервиса.
А ещё на курсе много работы с опытными специалистами:
— наставники-разработчики разбирают сложные темы на живых вебинарах.
— код-ревьюеры проверяют проекты и подсказывают, как их улучшить.
— кураторы помогают с организацией и расписанием.
— карьерный центр учит работать с резюме, мотивационными письмами, портфолио и собеседованиями.
78% наших выпускников находят работу в новой сфере. Они берут проекты на фрилансе, устраиваются в стартапы и крупные компании — Яндекс, ВТБ, МТС, Перекрёсток, Playrix, Сбер и другие.
Посмотреть, как учит Практикум, можно в бесплатной вводной части курса →
Описание операции вставки в Trie
Каждый узел в Trie состоит из нескольких ветвей. Каждая ветвь представляет собой возможный символ-ключ. Интересно то, что последний узел каждого поддерева Trit - будет являться концом слова.
Простая структура Node выглядит примерно так:
1. Инициализация детей
2. флаг о конце слова
Вставка в Trie - одна из простых операций. Каждый символ вставляется как отдельный узел Trie. Важно, обратить внимание, что дочерние элементы - это массив указателей(ссылок) на узлы дерева следующего уровня. Ключевой символ действует как индекс в дочернем массиве. Если входной ключ новый или расширенный - нам нужно построить таким образом ключи и пометить конец слова флагом конца. Длина ключа - определляет нашу глубину Trie.
Студенты заставили своего угарного препода по программированию создать телеграм-канал.
Его обожают за умение просто и остроумно рассказывать про код, рекурсию и объяснять сложные алгоритмы так, что любой школьник сможет повторить.
В свободное время он выводит онлайн-курсы на чистую воду и рассказывает как запросто прокачаться до сениора за полгода.
Если ты работаешь или учишься в IT, подписка обязательна — https://t.me/+IRo8tmwSlh5lYzYy
Структура данных - Префиксное(нагруженное) дерево - Trie
Сегодня (и последующие несколько дней) разберем еще одну продвинутую структуру данных: Trie
Префиксное дерево (Trie) - эффективная структура данных для поиска информации. Используя Trie, сложность поиска у вас сведется к длине ключа, что является оптимальным пределом.
Используя Trie - вы можете икать и вставлять ключ за О(M): где M максимальная длина строки. Однако будет штраф за то как это хранится.
Еще плюсом Trie будет являеться то, что вы легко сможете вывести все слова в алфавитном порядке
А также поможет вам эффективно решать задачи по поиску префикса(суффикса). Задачу подобную я скоро опубликую: она как раз была недавно в leetcode challenge
Обход связного XOR списка
Продолжаем тему XOR Linked List и сегодня поговорим про обходы данного листа.
Перемещаться по списку XOR мы можем как в прямом, так и в обратном направлении. Просматривая список, нам нужно запоминать адреса узла, к которому ранее осуществлялся доступ, чтобы вычислить адрес следующего узла.
Например когда мы находимся в узле С, у нас должен быть адрес B. Из XOR мы выщемляем адрес для C, а при помощи C (и функции npx) мы можем узнать адрес следующей ноды.
Завтра посмотрим на SourceCode для полного понимания данного процесса.
Продолжение обсуждения про XOR Linked List
Итак, я предлагаю перед тем как продолжать более детально смотреть на определенные примеры и задачи по данной теме. Всё таки немного глубже посмотреть на данную структуру.
Я нашел идеальную статью по этой теме:
https://www.linuxjournal.com/article/6828?page=0,0
Не обращайте внимание на дату создания. Ибо этот топик актуален до сих пор. Ну и плюсом будет в принципе глянуть на Linux Journal: там публиковалось очень много интересных топиков в свое время.
XOR Linked List
Начнем рассматривать сложные структуры данных. Сегодня начнем одной из таких: XOR связный список.
Обычный двусвязный список требует места для двух адресных полей для хранения адресов предыдущего и следующего узлов. Версия двусвязного списка с XOR может быть создана с использованием только одного пространства для адресного поля с каждым узлом.
В связанном списке XOR вместо хранения фактических адресов памяти каждый узел хранит XOR адресов предыдущего и следующего узлов.
Очень простое объяснение сложности алгоритмов
Иногда я нахожу на просторах интернета очень неплохие статьи, которыми могу поделиться. Сегодня одна из таких, которая позволит вам на базовом уровне разобраться что же такое сложность алгоритмов:
https://thatcomputerscientist.com/big-o-notation-explained-as-easily-as-possible
Для более глубокого изучения данного вопроса я порекомендую курс Роберта Седжевика:
https://www.coursera.org/learn/analysis-of-algorithms
Он максимально позволит вам овладеть данной темой.
