Серия «Алгоритмы и структуры golang»

Бинарные деревья Golang pt3

Бинарные деревья Golang pt3 IT, Программирование, Обучение, Golang, Длиннопост

Hello my Dudes

Бинарное дерево - это структура данных, которая представляет собой иерархическую коллекцию элементов, называемых узлами (nodes). Каждый узел имеет значение и может иметь до двух дочерних узлов, называемых левым и правым потомками (left and right children). Узел, который не имеет родителя, называется корнем (root) дерева. Узел, который не имеет потомков, называется листом (leaf) дерева.

Бинарные деревья Golang pt3 IT, Программирование, Обучение, Golang, Длиннопост

Бинарные деревья могут быть использованы для решения различных задач, связанных с поиском, сортировкой, классификацией и вычислением данных. Например, бинарное дерево поиска (binary search tree) - это бинарное дерево, в котором для каждого узла выполняется условие: все значения в левом поддереве меньше значения узла, а все значения в правом поддереве больше или равны значению узла. Бинарное дерево поиска позволяет быстро находить, добавлять и удалять элементы по заданному ключу.

В голанг нет встроенного типа для бинарных деревьев, но их можно реализовать с помощью структур (structs) и указателей (pointers). Для создания бинарного дерева в голанг нужно определить тип узла и тип дерева:

Бинарные деревья Golang pt3 IT, Программирование, Обучение, Golang, Длиннопост

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

Бинарные деревья Golang pt3 IT, Программирование, Обучение, Golang, Длиннопост
Бинарные деревья Golang pt3 IT, Программирование, Обучение, Golang, Длиннопост

Для поиска элемента в бинарном дереве поиска нужно написать функцию, которая принимает указатель на дерево и значение, которое нужно найти. Функция должна вернуть указатель на узел, содержащий искомое значение, или nil, если такого узла нет в дереве:

Бинарные деревья Golang pt3 IT, Программирование, Обучение, Golang, Длиннопост

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

Бинарные деревья Golang pt3 IT, Программирование, Обучение, Golang, Длиннопост
Бинарные деревья Golang pt3 IT, Программирование, Обучение, Golang, Длиннопост
Бинарные деревья Golang pt3 IT, Программирование, Обучение, Golang, Длиннопост
Бинарные деревья Golang pt3 IT, Программирование, Обучение, Golang, Длиннопост
Бинарные деревья Golang pt3 IT, Программирование, Обучение, Golang, Длиннопост

Могут быть косяки, не судите строго. У меня через 20 минут созвон (я их очень не люблю).

Показать полностью 10

Алгоритмы поиска в гошечке (golang)

Привет, чувачёчки.

В этом посте я хочу поделиться с вами кодом на Go для некоторых популярных алгоритмов поиска.

Наслаждайтесь.

Линейный поиск

Линейный поиск (Linear Search) - это простой алгоритм поиска элемента в списке, массиве или коллекции. Он работает путем последовательного перебора всех элементов до тех пор, пока не будет найден искомый элемент или не будут проверены все элементы.

Описание алгоритма:

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

2. Сравните его с искомым элементом.

3. Если элемент совпадает с искомым, верните его индекс (или значение, в зависимости от реализации).

4. Если элемент не совпадает с искомым, перейдите к следующему элементу в списке.

5. Повторяйте шаги 2-4 до тех пор, пока не найдете искомый элемент или не пройдете весь список.

Линейный поиск имеет временную сложность O(n), где "n" - это количество элементов в списке. В худшем случае алгоритм может проверить все элементы, поэтому его производительность ухудшается с ростом размера списка.

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

Алгоритмы поиска в гошечке (golang) IT, Обучение, Golang, Алгоритм, Программирование, Длиннопост

Бинарный поиск

Бинарный поиск (Binary Search) - это эффективный алгоритм поиска элемента в отсортированном списке, массиве или коллекции. Он использует стратегию "разделяй и властвуй", что позволяет быстро находить искомый элемент.

Описание алгоритма:

1. Начните с определения границ поиска. Установите начальную границу (left) в начало списка и конечную границу (right) в его конец.

2. Найдите средний элемент между начальной и конечной границей.

3. Сравните средний элемент с искомым значением.

4. Если средний элемент совпадает с искомым значением, возвращаем его индекс (или значение, в зависимости от реализации).

5. Если средний элемент больше искомого значения, обновите конечную границу (right) на позицию перед средним элементом и перейдите к шагу 2.

6. Если средний элемент меньше искомого значения, обновите начальную границу (left) на позицию после среднего элемента и перейдите к шагу 2.

7. Повторяйте шаги 2-6 до тех пор, пока не будет найден искомый элемент или пока начальная граница (left) не станет больше конечной границы (right).

Бинарный поиск имеет временную сложность O(log n), где "n" - это количество элементов в списке. Это означает, что в худшем случае алгоритм будет выполняться за логарифмическое время, что является значительно более эффективным, чем линейный поиск.

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

Алгоритмы поиска в гошечке (golang) IT, Обучение, Golang, Алгоритм, Программирование, Длиннопост

Прыжковый поиск

Прыжковый поиск (Jump Search) - это алгоритм поиска элемента в отсортированном списке, массиве или коллекции. Он использует идею деления интервала на блоки и прыжки через эти блоки для быстрого приближения к искомому элементу.

Описание алгоритма:

1. Задайте размер прыжка (jump size). Обычно он выбирается как квадратный корень из общего количества элементов в списке.

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

3. Сравните текущий элемент с искомым значением.

4. Если текущий элемент равен искомому значению, верните его индекс (или значение, в зависимости от реализации).

5. Если текущий элемент больше искомого значения или достигнут конец списка, перейдите к следующему шагу.

6. Сделайте прыжок через блоки, перемещаясь вперед на размер прыжка.

7. Повторяйте шаги 3-6 до тех пор, пока текущий элемент не станет больше искомого значения или вы превысите границы списка.

8. Если текущий элемент больше искомого значения, выполните линейный поиск в предыдущем блоке с момента последнего прыжка.

9. Если элемент найден, верните его индекс (или значение, в зависимости от реализации).

10. Если элемент не найден, верните -1 (или другое значение, указывающее отсутствие элемента).

Прыжковый поиск имеет временную сложность O(√n), где "n" - количество элементов в списке. Он более эффективен, чем линейный поиск, но менее эффективен, чем бинарный поиск. Однако прыжковый поиск особенно полезен, когда список имеет равномерное распределение данных и доступ к элементам осуществляется за постоянное время.

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

Алгоритмы поиска в гошечке (golang) IT, Обучение, Golang, Алгоритм, Программирование, Длиннопост

В общем: да прибудет с вами сила.

Постепенно цикл буду дополнять.

Показать полностью 3

Алгоритмы и структуры в гошечке (golang) Pt1

Алгоритмы сортировки

Цимес: Тема крайне важна, в русскоязычном сегменте - мало представлена.

Таки будем исправлять.

Тема очень простая, важно начать, даже такой "укурок" как я осилил.

В общем - начнём мои чувачёчки...

Сортировка "Пузырьком"

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

Алгоритмы и структуры в гошечке (golang) Pt1 IT, Golang, Алгоритм, Обучение, Видео, YouTube, Длиннопост

Халява, идём дальше.

Рекурсивная сортировка "пузырьком"

Рекурсивная сортировка пузырьком - это вариант обычной сортировки пузырьком (также известной как итеративная сортировка пузырьком). Она работает так же, как и итеративная сортировка пузырьком, без дополнительных преимуществ по времени или сложности. Однако это улучшит ваше понимание сортировки пузырьком и рекурсии.

Алгоритмы и структуры в гошечке (golang) Pt1 IT, Golang, Алгоритм, Обучение, Видео, YouTube, Длиннопост

Тоже простенько.

Сортировка вставками

Сортировка вставками (Insertion Sort) - это алгоритм сортировки, в котором элементы входного массива поочередно выбираются и вставляются в отсортированную последовательность элементов. Каждый новый элемент сравнивается с уже отсортированными элементами, и вставляется в нужное место в последовательности. Этот процесс продолжается до тех пор, пока все элементы не будут отсортированы.

Алгоритмы и структуры в гошечке (golang) Pt1 IT, Golang, Алгоритм, Обучение, Видео, YouTube, Длиннопост
Алгоритмы и структуры в гошечке (golang) Pt1 IT, Golang, Алгоритм, Обучение, Видео, YouTube, Длиннопост

По мне - так ещё проще, строк то меньше

Сортировка выбором

Сортировка выбором (Selection Sort) - это алгоритм сортировки, который проходит по массиву и находит наименьший элемент, затем помещает его в начало массива. Затем алгоритм проходит по оставшейся части массива и находит следующий наименьший элемент, помещая его на следующую позицию в массиве. Этот процесс продолжается до тех пор, пока все элементы не будут отсортированы. Время выполнения сортировки выбором в худшем, среднем и лучшем случае составляет O(n^2), где n - количество элементов в массиве.

Алгоритмы и структуры в гошечке (golang) Pt1 IT, Golang, Алгоритм, Обучение, Видео, YouTube, Длиннопост
Алгоритмы и структуры в гошечке (golang) Pt1 IT, Golang, Алгоритм, Обучение, Видео, YouTube, Длиннопост

Чуточку сложнее... Продолжаем

Сортировка слиянием

Сортировка слиянием (Merge Sort) - это алгоритм сортировки, который упорядочивает элементы массива путем разделения его на две половины, сортировки каждой половины отдельно, а затем слияния отсортированных половин в один отсортированный массив. Алгоритм сортировки слиянием является эффективным и обычно используется для сортировки больших массивов. Время выполнения сортировки слиянием в худшем, среднем и лучшем случае составляет O(n log n), где n - количество элементов в массиве.

Алгоритмы и структуры в гошечке (golang) Pt1 IT, Golang, Алгоритм, Обучение, Видео, YouTube, Длиннопост
Алгоритмы и структуры в гошечке (golang) Pt1 IT, Golang, Алгоритм, Обучение, Видео, YouTube, Длиннопост

Стало интереснее

Сортировка подсчётом

Сортировка подсчётом (Counting Sort) - это алгоритм сортировки, который использует диапазон чисел в сортируемом массиве для подсчета количества совпадающих элементов. Затем элементы сортируются путем перебора диапазона и записи каждого элемента в выходной массив в соответствии с его количеством входных элементов. Алгоритм сортировки подсчетом является эффективным для сортировки массивов с небольшим диапазоном значений. Время выполнения сортировки подсчетом составляет O(n + k), где n - количество элементов в массиве, а k - размер диапазона значений.

Алгоритмы и структуры в гошечке (golang) Pt1 IT, Golang, Алгоритм, Обучение, Видео, YouTube, Длиннопост

В общем то на алгоритмах сортировки мы закончим, но это не всё!

Побольше кодим, поменьше задротим и всё у нас будет хорошо.

Показать полностью 9 1
Отличная работа, все прочитано!