Джун Джуно к вашим услугам! Путь в разработку игр | Движуха Сакутина
رفتن به کانال در Telegram
354
مشترکین
-124 ساعت
-17 روز
-530 روز
آرشیو پست ها
🔥 Git: Эффективное сотрудничество и управление проектами в одной системе 🔥
🙂 Всем привет! Все слыхали о Git — технологии, которая ну уж очень востребована в GameDev. Действительно, огромное количество работодателей требуют знать, что скрывается под этими тремя страшными буквами. Поэтому сегодня об очень важном инструменте для эффективной работы
⁉️ Что же такое Git?!
🗣️ Git - мощная система контроля версий, используемая разработчиками для управления изменениями в коде 🗣️
📌 Она позволяет отслеживать изменения в проекте, координировать работу нескольких разработчиков и откатываться к более ранним версиям
❓ А система контроля версий, что такое?
📌 Системы контроля версий (СКВ) отслеживают изменения в файлах и управляют версиями документов. Git — распределенная СКВ, что означает, что каждый разработчик имеет полную копию репозитория с историей изменений
📊 Основные концепции Git:
➕ Репозиторий: Основной элемент Git, который хранит версии проекта и историю изменений, доступный локально или удаленно (например, на GitHub).
➕ Коммит: Фиксированное состояние репозитория в определенный момент времени, которое содержит изменения, описание и метаданные (автор и дата)
➕ Ветки: Позволяют вести параллельную разработку. Главная ветка обычно называется main или master, а новые ветки создаются для работы над функциями или исправлениями
➕ Слияние (Merge): Процесс объединения изменений с главной веткой с использованием команды git merge, что иногда требует ручного разрешения конфликтов
➕ Удалённый репозиторий: Версия репозитория, хранящаяся на сервере, доступная для всех разработчиков для загрузки изменений и обновления локальных копий
📈 Преимущества использования Git:
✔️ Скорость: Git выполняет многие операции локально, что обеспечивает высокую скорость
✔️ Гибкость: Возможность создания и слияния веток подходит для различных рабочих процессов
✔️ История изменений: Git сохраняет детальную историю изменений, что облегчает отслеживание развития проекта
✔️ Поддержка команды: Git обеспечивает эффективное взаимодействие между разработчиками
💥 Заключение:
Git — это не просто инструмент, это экосистема, упрощающая процесс разработки. Ближайшие дни будут посты на эти темы. Поставьте 🔥 если ждете. Обязательно напишите обратную связь в комментариях, мне будет очень приятно!
👀 Всех люблю и обнимаю! Ну а если вам нужны интересные посты с классным дизайном - Джун Джуно к вашим услугам!
+2
🔥 КАК ПРИМЕНИТЬ ПАТТЕРН FACADE НА ПРАКТИКЕ? 🔥
🙂 Всем привет! Сегодня поговорим о паттерне Facade. Именно он позволяет создать упрощённый интерфейс для работы с комплексной системой. Давайте рассмотрим, как это можно реализовать на языке C# в контексте системы управления домашним кинотеатром
📊 Пошаговая инструкция:
1️⃣ Определяем компоненты. Сначала определим классы, которые будут представлять различные компоненты домашнего кинотеатра
2️⃣ Создаем класс Facade. Теперь создадим класс HomeTheaterFacade, который будет упрощать взаимодействие с вышеописанными компонентами
3️⃣ Используем класс Facade. Теперь мы можем использовать класс HomeTheaterFacade в нашем основном коде
💥 Заключение:
📈 Паттерн Facade в C# позволяет создать удобный интерфейс для сложной системы. В нашем примере с домашним кинотеатром мы изолировали пользователя от необходимости взаимодействовать со всеми отдельными компонентами, упростив процесс просмотра фильма. Это делает код более чистым и управляемым. Ну а вы не бойтесь разработки игр, ведь Джун Джуно к вашим услугам!
🔥 Создание устойчивых кнопок в изменяющемся интерфейсе 🔥
🙂 Всем привет! Сегодня я расскажу про ещё одну интересную фишку с UI в Unity: изменение размера кнопок для вашего интерфейса, чтобы они корректно отображались и не сдвигались в случае возникновения нового соотношения сторон или разрешения. Этот метод особенно актуален для разработчиков в сфере Web-разработки
‼️ Пошаговая инструкция:
1️⃣ Создание пустого объекта. Создайте пустой объект на сцене, который станет контейнером для кнопок и элементов интерфейса. Установите якоря по углам экрана, чтобы избежать проблем с позиционированием при изменении размеров
2️⃣ Добавление Vertical Layout Group. Добавьте пустому объекту компонент Vertical Layout Group, который управляет размещением дочерних элементов по вертикали и обеспечивает равномерное расстояние между ними, создавая аккуратный вид
3️⃣ Настройка параметров выравнивания. Настройте параметры Vertical Layout Group, установив Child Alignment на Middle Center для центрирования дочерних объектов
Небольшой интерактив, как обычно, для моих любимых подписчиков. Ставьте "🔥" если хотите больше контента по Unity, а "👍" - по C#. Ну а для тех, кто хочет изучить разработку игр - Джун Джуно к вашим услугам!
🔥 Превращаем мечты в адаптивный UI: секреты использования якорей в Unity 🔥
🙂 Всем привет! Вы проявили невероятную активность под предыдущим постом, поэтому как и обещал - пост про адаптивный интерфейс!
🗣️ Якоря UI в Unity - это важный инструмент, который позволяет управлять расположением и размерами элементов пользовательского интерфейса 🗣️
‼️ Они позволяют закрепить элементы интерфейса относительно разных сторон и центра Canvas, что облегчает создание адаптивных и масштабируемых UI для различных разрешений экрана
✔️ Использование якорей в UI Canvas позволяет создавать динамические интерфейсы, которые автоматически подстраиваются под разные разрешения экрана. Например, мы хотим чтобы задний фон тянулся по высоте. Мы ставим якоря от центрального верха до центрального низа. При изменении разрешения фон будет просто обрезаться по краям
✔️ Но также якоря позволяют управлять масштабированием элементов UI. Например, можно закрепить элемент так, чтобы он всегда занимал определенную часть экрана, независимо от его размера. Это особенно полезно при создании адаптивных интерфейсов для телефонов или планшетов
✔️ Для быстрой настройке можете использовать горячие клавиши
📌 Alt + клик мыши по шаблону якоря - объект сам подстроится под шаблон
📌 Shift + клик по шаблону якоря - расставляет якоря и pivot по выбранному шаблону
‼️ Создание и настройка якорей UI в Unity довольно просты. Для этого нужно:
1️⃣ Выбрать элемент интерфейса в Canvas
2️⃣ В его настройках выбрать необходимый якорь (угол, сторону или центр) и задать отступы
3️⃣ После этого элемент будет закреплен в соответствующем месте и будет автоматически масштабироваться при изменении размеров экрана
📈 Теперь для нас не является преградой различные разрешения телефонов. А если хотите узнать больше про грамотное использование UI в своем проекте - Джун Джуно к вашим услугам!
🔥 Как сделать адаптивный интерфейс на Unity? 🔥
🙂 Всем привет! Вы показали, что посты с видео вам заходят. Чему я очень рад! Поэтому сегодня мы обсудим адаптивность интерфейса
👀 С постоянным расширением рынка игровых платформ и устройств, на которых пользователи могут запускать ваши игры, очень важно обеспечить оптимальное отображение игрового контента на всех устройствах
‼️ Разработчики Unity давно применяют различные техники адаптивного дизайна. Одной из них является использование якорей и различных раскладок экрана, позволяющих элементам интерфейса гибко реагировать на изменения разрешения экрана
➕ Кроме того, важной частью процесса разработки является тестирование адаптивного интерфейса на различных устройствах и разрешениях экранов
📈 Это поможет выявить потенциальные проблемы, благодаря чему в нашей игре мы сможем уже сделать корректировки для обеспечения оптимального отображения интерфейса на всех устройствах
Ставьте 🔥 и я запишу несколько подробных постов по каждому аспекту, чтобы добиться такого же эффекта, как на видео. Пишите в комментариях как вам мой монтаж. А если хотите больше узнать больше про разработку игр - Джун Джуно к вашим услугам!
🔥 Осторожно: собеседование - первая проверка сил! 🔥
🙂 Всем привет! Больше двух месяцев мы с вами изучаем программирование. Прошли основы ООП, паттерны, алгоритмы, SOLID
⛔️ Но, к сожалению, даже если ты мастер своего дела с отличными техническими навыками, это не гарантирует, что рекрутер одобрит твою кандидатуру
❌ Не умеешь работать в команде?
❌ Не выполняешь задачи в срок?
❌ Не проявляешь должной ответственности или не готов работать сверхурочно?
‼️ При этом, часто вижу такую историю: если тебе и удается пройти собеседование (что маловероятно), надолго в студии ты не остаешься
⁉️ Но почему такое происходит?
📉 Я понял это не сразу: пришлось набить много шишек, прежде чем узнать этот секрет. Поэтому очень хочу поделиться этим с вами!
💥 Три ключевых софт скилла, на которые обращают внимание при отборе:
➕ Умение работать в команде
➕ Ответственность
➕ Адаптивность
☄️ Эти навыки проверяются на первом этапе собеседования
📈 Тематика новая, очень хочу узнать насколько она интересна вам. Ставьте 🔥 если жаждите больше постов про софт скиллы. А если хотите узнать тонкости работы в команде - Джун Джуно к вашим услугам!
+1
🔥 Паттерн Command: управление запросами и операциями в ООП🔥
🙂 Всем привет! Закончить вечер хочу постом про паттерн Command. Он является одним из наиболее распространенных поведенческих паттернов проектирования в объектно-ориентированном программировании
‼️ Благодаря нему, у нас появляется возможность инкапсулировать запрос как объект, что позволяет параметризовать клиентов с различными запросами, организовывать очередь или регистрировать запросы, а также поддерживать отмену операций
💥 Классический пример:
📌 У нас есть кнопка и объект, на котором находится некий интерфейс ICommand с методом Execute(), который будет вызываться при нажатии на кнопку
📌 У разных объектов могут быть разные реализации метода Execute(), что позволяет легко добавлять новые объекты без изменения самой кнопки
⭐️ Существенная польза паттерна:
➕ Он обеспечивает более гибкую архитектуру игры, позволяя легко добавлять новые функции, управлять последовательностью и отменой операций.
✔️ Его применяют в различных областях, включая построение пользовательских интерфейсов, реализацию транзакций, управление очередями задач и многие другие сценарии
📈 Темы, формат, дизайн постов - всё постоянно меняется. Но одно лишь остаётся вечным - Джун Джуно к вашим услугам!
+1
🔥 Интерактивное руководство: использование Remap для плавного перехода между значениями 🔥
🙂 Всем привет! Сегодня мы узнаем, как делается линейная интерполяция – плавный переход от одного значения к другому для создания более реалистичного и плавного движения в игре
📊 А чтобы узнать всё и не запутаться нужна... Пошаговая инструкция
1️⃣ Делаем статический класс Remap. Если интересно, то формулы Lerp и InvLerp взяты из Википедии. И сама магия происходит в публичном методе Remap
2️⃣ Создаём класс RemapExample, заполняем объект target и door
3️⃣ Сейчас очень важно понять - мы связываем два разных диапазона: расстояние и угол
📌 В классе ExampleRemap хэшируем данные в Awake и в Update, пишем метод Remap с аргументами
✔️ _firstMin - минимальное расстояние от игрока до двери. В нашем случае это изначальная дистанция от игрока до двери
✔️ _firstMax - максимальное расстояние от игрока к двери. Мы сделали один, чтобы дверь не начала закрываться как только мы зашли в нее
✔️ _secondMin - угол поворота при минимальном значении
✔️ _firstMin - угол поворота если игрок максимально далеко
✔️_secondMax - угол поворота при максимальном значении
✔️_firstMax - угол поворота, если игрок максимально близко
✔️ currentValue - текущее значение расстояния
4️⃣ Смотрим на результат. Бедолагу немного прижало дверью, но это нормально. В боевых проектах, это можно делать уже не в Update, а при определенных условиях и событиях
📈 Вот таким способом, можно связать два любых диапазона и плавно менять значение в зависимости от условий
ℹ️ Не стесняйтесь писать в комментариях волнующие вас вопросы! Ну и ставьте 👍, если вам нравятся больше посты с картинками, а если больше нравятся с видеорядом от Джуна Джуно, то 🔥 к вашим услугам!
🔥 ЛИНЕЙНАЯ СВЯЗКА ДВУХ ЗНАЧЕНИЙ 🔥
🙂 Всем привет! Было ли у вас такое, что хочется, чтобы одно значение зависело от другого? Например дверь, которая плавно открывается и закрывается, в зависимости от того насколько близко игрок
⁉️ Как этого добиться без использования костылей и кучи блоков if?
✔️ Правильный ответ: линейная интерполяция!
⭐️ Функция Remap (линейная интерполяция) позволяет менять характеристики игры в зависимости от выбранных настроек или условий игровой ситуации
📌 Remap может использоваться для изменения уровня сложности, масштаба, силы, скорости и других параметров игры
❗️ Примеры применения:
1️⃣ Спавнер врагов, который увеличивает их количество и скорость с течением времени
2️⃣ Допустим есть пистолет. Чем больше вы тянете затвор, тем сильнее опускается боек
3️⃣ Дверь которая открывается настолько сильно, на сколько близко игрок
💥 Линейная интерполяция - очень мощная штука. Завтра выложу практическую часть. Ставьте 🔥если вам интересно как это работает. Ну а если хотите больше классного монтажа - Джун Джуно к вашим услугам!
+2
🔥 ПАТТЕРН КОНЕЧНЫЙ АВТОМАТ 🔥
🙂 Всем привет! Скучали по IT-постам? Сегодня мы разберем паттерн, помогающий решать проблему перехода системы из одного состояния в другое, где количество состояний ограничено
‼️ Рассмотрим пример со светофором. Если бы мы пользовались Enum'ом - нам бы пришлось делать большие блоки if, что является большой ошибкой
⁉️ Как это выглядит в паттерне:
📌Класс TrafficLight (Светофор) выступает в роле менеджера состояний. В листе он хранит все состояния под абстрактным классом Light. Три цвета наследуются от этого класса. У светофора есть метод ChangeState который выключает предыдущий state и включает следующий
➕ Плюсы данного подхода:
1️⃣ Мы изолируем логику каждого отдельного состояния, все классы по отдельности становится меньше
2️⃣ Легкий контроль переключения состояний, есть конкретный вход и выход
3️⃣ Код становится читабельнее, за счет типизации
4️⃣ Очень легко добавлять новые состояния
❌ Минусы этого подхода:
⛔️ Приходится писать очень много кода, даже при минимальной логике
📈 Как итог, можно сказать, что конечный автомат полезен, когда у нас есть очень много вложенной логики, которая часто меняет друг друга. А если хотите больше нестандартных решений, которые улучшат ваш код - Джун Джуно к вашим услугам!
🔥ЛЕГЕНДАРНАЯ ВСТРЕЧА С...🔥
🙂 Всем привет! Многие из моих подписчиков создавали свои телеграмм каналы в рамках Мастерской Романа Сакутина
ℹ️ Много ребят именно в начале мая впервые заявили о себе в публичной сфере, торжественно вышли на сцену. Но, к сожалению, не все из них подают признаки жизни сейчас. Кто - то забросил всё в первую неделю, кто - то потерял силы спустя месяц
❌ Но это всё не про участника этой движухи, а теперь и моего друга - Алексея Пивоварова
👀 Его подписчикам известно, что сейчас он в нашей столице. Это был отличный повод познакомиться с ним и провести замечательно время! Леша классный парень, советую петербуржским программистам найти в своём графике свободный вечерок для него)
‼️ Я хочу пожелать всем сил для ведения телеграмм каналов. Друзья, среди вас огромное количество талантливых людей! Сейчас всем нам нужно поддерживать друг друга, не останавливаться на достигнутом! Мы все лишь в начале пути, пути непростом, местами тяжелом, но очень интересном! Вместе мы сила! У вас всё получится! Ну а я, Джун Джуно, к вашим услугам!)
+3
🔥 ДЕКОРАТОР 🔥
🙂 Всем привет! Сегодня мы поговорим о паттерне, который живет по соседству со стратегией. Смысл данного подхода в развязанной и динамической связи между объектами
‼️ Рассмотрим пример:
📌 У нас есть класс Effector - он накладывает эффекты, которые влияют на здоровье. У класса Health есть метод AddEffect принимающий в аргумент новый эффект. Суть заключается в том, что новый эффект будет ссылаться на предыдущий. Таким образом они по цепочки будут вызывать друг друга через метод Tick
📊 Рассмотрим порядок работы кода:
1️⃣ При создании класса здоровья - мы сразу создаем пустой эффект (NothingEffect)
2️⃣ Когда мы добавляем эффект кровотечения(BleedingEffect) - Health начинает ссылаться на кровотечение, а кровотечение ссылается на пустой эффект
3️⃣ Когда мы добавляем эффект восстановления(RegenEffect) - Health ссылается на восстановления, а восстановления на кровотечение
💥 Таким образом новые эффекты накладываются на предыдущие. Health ссылается только на последний пришедший эффект. Вся эта система работает потому что все эффекты спрятаны под одним интерфейсом
📈 Плюсы подхода:
➕ Эффекты становятся достаточно чистыми и не зависят не от чего кроме интерфейса
➕ Можно динамически накладывать эффекты в любое время и в любом порядке
📉 Минусы подхода:
❌ За счет сильной развязности - код становится сложнее для чтения
❌ Невозможно контролировать порядок вложенности эффектов
👀 Мы рассмотрели очень полезный на практике паттерн. Хотите больше контента по хорошему коду? - Джун Джуно к вашим услугам!
+1
🔥 МОДИФИКАЦИЯ ВИЗИТЁРА 🔥
🙂 Всем привет! Помните мы с вами разбирали паттерн визитёр. У него был существенный недостаток - приходилось делать дубляж кода в наследниках. Сегодня мы разберем Visitor через dynamic
‼️ Для начала стоит знать, что это работает только после C# 4.0. Чтобы включить это в Unity - нужно нажать Edit, потом Project Setting. Выбираем вкладку Player и там ищем Configuration. В поле Api Compatibility Level меняем .Net Standard 2.1 на .Net Framework
📊 Как изменится наш код:
📌 Мы убираем абстрактный метод Accept из класса Potion. Соответственно из всех наследников мы убираем методы Accept
📌 Теперь в класс PotionUser добавляем метод Visit(Potion potion). Он динамически вызывает нужный метод, в зависимости от того какой эликсир пришел. Выглядит это так: Visit((dynamic)potion).
📈 Плюсы данного подхода:
➕ Мы избавляемся от дубляжа кода
➕ Классы Potion и его наследнике становятся чище, так как не знают о существовании визитёра
📉 Минусы данного подхода
❌ Нет четкого контракта связанного с новым дочерним объектом
❌ Если при вызови dynamic не будет нужного метода Visit, вылетит ошибка StackOverflow
❌ Чтобы этого избежать, нужно при создании новых дочерних объектов дописывать новый метод Visit в интерфейс. Он в свою очередь покажет где эти методы нужно дописать
👀 Не ожидали такого варианта использования визитёра? Пишите в комментариях. А если хотите ещё больше неочевидных паттернов в C#? Джун Джуно к вашим услугам!
+1
🔥БЫСТРАЯ СОРТИРОВКА🔥
🙂 Всем доброй - доброй ночи! В прошлый раз мы разобрали быстрый способ сортировки. У него есть один минус - он тратит много памяти, за счет того, что приходится создавать временный массив. Сегодня мы разберем алгоритм, но уже без этого недостатка
💥 В данном алгоритме тоже действует принцип разделяй и властвуй. Разделение здесь такое же, как и в предыдущем алгоритме. Рассмотрим подробнее способ властвования:
✔️ Для начало выбираем опорный элемент, он может находится в любом месте, мы возьмем элемент с конца. В коде он будет называться Pivot. У нас есть указатель, назовем его StoreIndex, которым мы бежим от начала подмассива до элемента, который находится перед опорным. Также у нас есть цикл for, который просто бежит со стартового элемента и до элемента перед опорным элементом . Данный элемент мы назовем бегунок
✔️ Если элемент по значению находящийся на бегунке меньше чем опорное значение - мы меняем значение на указателе со значением на бегунке и передвигаем индекс указателя на одно значение в право. После окончания цикла мы меняем местами значения на указателе и опорном элементе
✔️ После чего, мы рекурсивно вызываем этот метод, чтобы отсортировать половинки основного массива
✔️ У этого алгоритма очень хитрая сложность. Мы привыкли оценивать сложность алгоритма в худшем случае. Тогда она будет O(n2).
‼️ НО!
💥 В среднем этот алгоритм оценивается O(nLog(n)). Худший случай для данного алгоритма на практике встречается крайне редко. Он может случится, когда все элементы меньше опорного и он всегда будет вставать оставаться с краю. Поэтому принято считать данный алгоритм достаточно быстрым, в добавок он занимает существенно меньше места в памяти
📈 Вот мы с вами и покорили ещё одну ступень программирования. А если хотите легко и дальше изучать алгоритмы различной сложности -Джун Джуно к вашим услугам!
+1
🔥 СОРТИРОВКА СЛИЯНИЕМ 🔥
🙂 Всем привет! Сегодня мы поговорим о сортировке на основе рекурсии. Рекурсия в данном алгоритме еще сложнее, чем рекурсия из прошлого поста
📈 Данный алгоритм работает по принципу разделяй и властвуй
✔️ Разделение метода MergeSort. Он принимает в качестве аргумента список, начальную границу сортировки и конечную. Сначала мы делим список пополам, потом каждую половину еще пополам и так далее, пока не останется два элемента в конце. Теперь мы вызываем метод Merge сначала для более мелких половинок, а потом для все более и более больших
✔️ Теперь самое сложное - разделение метода Merge. Чтобы в памяти не выделять много места под дополнительные списки - мы создаем условные границы в виде индексов, их мы и передаем в аргументы метода. За счет рекурсии эти аргументы меняются в зависимости от текущей половинки сортировки. В процессе метода мы меняем временный список, а в конце метода заполняем основной список из временного
💥 Итого. Мы разбиваем список на маленькие половинки, а когда доходим до подсписка из двух элементов, мы начинаем сортировку. Таким образом, сложность данного алгоритма равна О(N*Log(N))
⚠️ Хотите больше постов из мира IT? - Джун Джуно к вашим услугам!
🔥 РЕКУРСИЯ 🔥
🙂 Сегодня мы поговорим об очень сложной теме для понимания. Это будет непросто объяснить текстом, но я постараюсь)
🗣️ Рекурсия — это поведение метода, при котором он вызывает сама себя 🗣️
📊 Такие функции называются рекурсивными. В отличие от цикла, они не просто повторяются несколько раз, а работают «внутри» друг друга
❗️ Сама сложность заключается в том, что некий алгоритм работает друг в друге. Попробую объяснить это в виде перемещения в пространстве и времени
ℹ️ Представим, у нас мир, где можно двигаться только по оси X. Так же есть Vector2 - где X это позиция в мире, а Y это порядковый номер перемещения в пространстве, мы хотим за три шага из точки 3 дойти в точку 0
(2:1) (1:5) (0:7)
(1:2) (0:4) (0:6)
(0:3)
‼️ Объяснение
1️⃣ Мы первым шагом достигаем точку 2
2️⃣ Потом вторым шагом - 1, а после 0
3️⃣ На третьем шагу мы оказались в точке 0
4️⃣ Теперь мы как бы возвращаемся назад во времени в глобальном плане, но в локальном это для нас уже четвертый шаг. Мы четвертым шагом идем из точки 1 достигаем точку 0
5️⃣ Раз мы дошли до конца, мы еще раз глобально прыгаем во времени к точке 2. Пятым шагом достигаем точку 1
➕ Далее схема такая же как от локального шага два к шагу четыре. Когда нам уже некуда перемещаться в прошлое мы выходим из рекурсии
⁉️ Главный вопрос - зачем нам это надо, если при перемещении в прошлое ничего не меняется?
💥 Но мы ведь можем брать и перенести какой-то результат в прошлое. Тогда результат изменится в новых временных отрезков
📈 В будущих постах, мы рассмотрим алгоритм сортировки на основе рекурсии. Ставьте палец вверх, если ждете пост про сортировку или палец вниз, если не поняли рекурсию
👀 Обратная связь очень важна для Джуна Джуно
🔥 ЛУЧШЕ УТИНОГО ГАЛСТУКА МОЖЕТ БЫТЬ ТОЛЬКО.. ДРУГОЙ УТИНОЙ ГАЛСТУК?!🔥
🙂 Всем привет! Я хочу, чтобы вы чуть-чуть отдохнули от всех этих постов про программирование. Поэтому сегодня пост на несерьёзную тему
‼️ Ваш Джун Джуно проходил с тем галстуком год, но к сожалению, вещи пачкаются и изнашиваются, поэтому приобрел новый
👀 Интересно узнать: Хотели бы себе такой?
🔥 СОРТИРОВКА ПУЗЫРЬКОМ 🔥
🙂 Всем привет! Мы уже разобрали способ быстрого поиска. Но вся проблема в том, что он работает только в отсортированном списке. Сегодня мы поговорим о сам простом алгоритме, который поможет решить данную задачу
‼️ Принцип работы:
✔️ Мы используем два цикла for. Берём самый первый элемент массива и сравниваем его со вторым. Если первый больше второго — меняем их местами с первым. Если нет — ничего не делаем
✔️ Затем берём второй элемент массива и сравниваем его со следующим — третьим. Если второй больше третьего — меняем их местами. Если нет — ничего не делаем
🚫 Минус данной сортировки:
❌ Это один из самых медленных алгоритмов. Его скорость равняется O(n^2) (количество элементов во второй степени)
📈 В дальнейшем мы рассмотрим более быстрые алгоритмы. Хотите узнать как сортировать массив деревом - Джун Джуно к вашим услугам!
🔥 O-Большое 🔥
🙂 Всем привет, сегодня мы поговорим о вычислении скорость работы алгоритма
⁉️ Зачем вам это нужно?
🔼 Когда придется работать с чужим кодом, стоит понимать насколько быстро или медленно он работает
📉 Скорость выполнения считается в количестве операций при наихудшем сценарии
ℹ️ Рассмотрим на примере:
➕ Допустим, у нас есть алгоритм для поиска наикратчайшего расстояния до точки из списка от текущей точки. Для упрощения возьмем список из ста позиций
❌ Если использовать линейный поиск, то есть с нулевого элемента до последнего. То в худшем случае нам понадобится сто операций
✔️ Если использовать бинарный поиск, то в худшем случае нам понадобится семь операций
‼️ Напрашивается такой вывод:
📌 Линейный поиск по скорости равняется O(n) - где n это количество элементов в списке
📌 Бинарный поиск равняется О(log(n))
👀 В следующих постах мы продолжим обсуждать эту непростую, но интересную тему. Хотите узнать больше информации про алгоритмы - Джун Джуно к вашим услугам!
🔥 БИНАРНЫЙ ПОИСК 🔥
🙂 Всем привет! Сегодня мы разбираем алгоритм, сокращающий количество операций с 4 миллиардов до 32
‼️ Рассмотрим ситуацию:
📌 У нас есть List, состоящий из 240.000 идущих по порядку чисел. Нам нужно обнаружить под каким индексом находится введённое пользователем число
❓ Сколько будет произведено операций в худшем случае, если идти по порядку с самого начала?
❌ 240 000!
⁉️ А если использовать бинарный поиск?
✔️ 18!
🗣️ Бинарный поиск - способ поиска, при котором на каждом последующем шагу мы отбрасываем половину вариантов 🗣️
💥 Как это работает на практике:
➕ Допустим, у нас есть сто чисел, с цифрой 1 в нулевом индексе и числом 100 в девяносто девятом индексе. Нам нужно найти индекс числа 66
➕ Нам нужно две переменные границ поиска: начиная с 0 индексом в левой границе и 99 индексом в правой границей. Далее мы сравниваем искомое число с тем, которое посередине
➕ Если искомое больше, то сдвигаем левую границу на сорок девятый индекс, если меньше - сдвигаем правую границу туда же
➕ Дальше по той же схеме, пока не найдем нужно число. На поиск числа 66 у нас уйдет семь операций
🚫 У бинарного поиск есть один недостаток - он работает только в отсортированном списке
📈 Если вам понравилась тема с алгоритмами - ставьте лайк. Напишите в комментариях как вам новый дизайн, хотели бы побольше экспериментов с визуалом? Мне будет очень интересно! Хотите увидеть больше красочных постов про программирование - Джун Джуно к вашим услугам!
