Небольшое веселое соревнование между алгоритмами разных задач.
Уважаемый читатель,
Это будет забавный блог о том, как работают лучшие алгоритмы и как реализовать их в псевдокоде, а также некоторые подробности о них.
So 1,2,3 go….
Правила и этапы конкурса: -
- Будет 3 тура
- Каждый алгоритм будет оцениваться по временной и пространственной сложности.
- Каждому читателю будет выдан жетон сертификации для участия.
- Первый раунд будет алгоритмом сортировки.
- Второй этап - алгоритм обхода дерева.
- Третий раунд будет бонусным, без победителей и проигравших, только игроки с моими любимыми функциями активации.
Первый раунд:-
Нам нужны методы сортировки в основном каждый день для очистки данных и для чтения данных, а иногда для обработки и сортировки огромных беспорядочных наборов данных.
Наши номинанты - это быстрая сортировка, нечет-четность и коктейль, я знаю, что они не распространены.
Быстрая сортировка: -
Quicksort - это эффективный алгоритм сортировки. Этот алгоритм, разработанный британским ученым-компьютерщиком Тони Хоаром в 1959 году и опубликованный в 1961 году, до сих пор остается широко используемым алгоритмом сортировки. При правильной реализации он может быть примерно в два или три раза быстрее, чем его основные конкуренты, сортировка слиянием и сортировка в кучах.
нечетно-четная сортировка: -
В вычислениях сортировка по четным и нечетным данным или сортировка с перестановкой нечетных и четных является относительно простым алгоритмом сортировки, первоначально разработанным для использования на параллельных процессорах с локальными соединениями. Это сортировка сравнения, связанная с пузырьковой сортировкой, с которой она имеет много общих характеристик.
Сорт коктейля: -
Сортировка коктейльных шейкеров, также известная как двунаправленная пузырьковая сортировка, коктейльная сортировка, шейкерная сортировка, волновая сортировка, случайная сортировка или челночная сортировка, является расширением пузырьковой сортировки. Алгоритм расширяет пузырьковую сортировку, работая в двух направлениях.
код в Python по адресу: -
Псевдокоды
function quicksort(A, lo, hi) is if lo < hi then p := partition(A, lo, hi) quicksort(A, lo, p - 1) quicksort(A, p + 1, hi) function partition(A, lo, hi) is pivot := A[hi] i := lo for j := lo to hi do if A[j] < pivot then swap A[i] with A[j] i := i + 1 swap A[i] with A[hi] return i function A = cocktailShakerSort(A) #`beginIdx` and `endIdx` marks the first and last index to check beginIdx = 1; endIdx = length(A) - 1; while beginIdx <= endIdx newBeginIdx = endIdx; newEndIdx = beginIdx; for ii = beginIdx:endIdx if A(ii) > A(ii + 1) [A(ii+1), A(ii)] = deal(A(ii), A(ii+1)); newEndIdx = ii; end end #decreases `endIdx` because the elements after `newEndIdx` are in correct order endIdx = newEndIdx - 1; for ii = endIdx:-1:beginIdx if A(ii) > A(ii + 1) [A(ii+1), A(ii)] = deal(A(ii), A(ii+1)); newBeginIdx = ii; end end #increases `beginIdx` because the elements before `newBeginIdx` are in correct order beginIdx = newBeginIdx + 1; end end function oddEvenSort(list) { function swap(list, i, j) { var temp = list[i]; list[i] = list[j]; list[j] = temp; } var sorted = false; while (!sorted) { sorted = true; for (var i = 1; i < list.length - 1; i += 2) { if (list[i] > list[i + 1]) { swap(list, i, i + 1); sorted = false; } } for (var i = 0; i < list.length - 1; i += 2) { if (list[i] > list[i + 1]) { swap(list, i, i + 1); sorted = false; } } } }
Quicksort имеет временную сложность O (log n) и пространственную сложность O (n).
Сортировка по нечетному и четному имеет временную сложность O (n²) и пространственную сложность O (1).
Сортировка коктейлей имеет сложность пространства O (n²) и O (1).
Итак, время для оценки: -
В категории временной сложности для сортировки победителем является Quicksort.
В категории космической сложности по сортировке победителем признан коктейльный сорт.
Второй раунд:-
Обход дерева - очень важная часть любого двоичного дерева, он помогает нам обходить или сортировать двоичное дерево. Обход - это процесс посещения всех узлов дерева и может также распечатать их значения. Поскольку все узлы соединены ребрами, мы всегда начинаем с корневого узла. То есть мы не можем получить произвольный доступ к узлу в дереве.
Кандидатами являются Inorder, Preorder и postorder.
Чтобы:-
В этом методе обхода сначала посещается левое поддерево, затем корень, а затем правое поддерево. Мы всегда должны помнить, что каждый узел может представлять собой поддерево.
Если пройти по бинарному дереву по порядку, на выходе будут получены отсортированные значения ключей в возрастающем порядке.
Мы начинаем с A и после обхода по порядку переходим к его левому поддереву B. B также просматривается по порядку. Процесс продолжается до тех пор, пока не будут посещены все узлы. Результатом обхода этого дерева будет -
D → B → E → A → F → C → G
Предзаказ:-
в этом методе обхода сначала посещается корневой узел, затем левое поддерево и, наконец, правое поддерево.
Мы начинаем с A и после обхода предварительного заказа сначала посещаем сам A, а затем переходим к его левому поддереву B. B также проходит предварительный заказ. Процесс продолжается до тех пор, пока не будут посещены все узлы. Результат предварительного просмотра этого дерева будет -
A → B → D → E → C → F → G
Пост-заказ: -
Пост-заказ обход
В этом методе обхода корневой узел посещается последним, отсюда и название. Сначала мы проходим левое поддерево, затем правое поддерево и, наконец, корневой узел.
Мы начинаем с A и после обхода пост-заказа сначала посещаем левое поддерево B. B также проходит пост-заказ. Процесс продолжается до тех пор, пока не будут посещены все узлы. Результатом обхода этого дерева после заказа будет -
D → E → B → F → G → C → A
Порядок уровней: -
Обход дерева в порядке уровней - это обход дерева в ширину.
Порядок обхода приведенного выше дерева в порядке уровней 1 2 3 4 5
Algorithm Inorder(tree) 1. Traverse the left subtree, i.e., call Inorder(left-subtree) 2. Visit the root. 3. Traverse the right subtree, i.e., call Inorder(right-subtree) Algorithm Preorder(tree) 1. Visit the root. 2. Traverse the left subtree, i.e., call Preorder(left-subtree) 3. Traverse the right subtree, i.e., call Preorder(right-subtree) Algorithm Postorder(tree) 1. Traverse the left subtree, i.e., call Postorder(left-subtree) 2. Traverse the right subtree, i.e., call Postorder(right-subtree) 3. Visit the root. Algorithm Levelorder(tree) for d = 1 to height(tree) printGivenLevel(tree, d); function printGivenLevel(tree, level) if tree is NULL then return; if level is 1, then print(tree->data); else if level greater than 1, then printGivenLevel(tree->left, level-1); printGivenLevel(tree->right, level-1);
И теперь победителем является обход Inorder Tree, потому что он самый быстрый из всех.
Третий раунд: -
Функции активации являются наиболее неотъемлемой и важной частью любой нейронной сети, от простого яблока или банана до сложной классификации и прогнозирования климата до небольшого устройства, которое вы носите с собой и читаете и разговариваете с ним.
Наши номинанты: ReLU, Sigmoid, Softmax и TanH.
ReLU: -
Выпрямленная линейная функция активации или сокращенно ReLU - это кусочно-линейная функция, которая выводит входной сигнал напрямую, если он положительный, в противном случае он выдает ноль. Она стала функцией активации по умолчанию для многих типов нейронных сетей, потому что модель, в которой она используется, легче обучать и часто обеспечивает лучшую производительность.
Сигмовидная: -
Сигмовидная функция - это математическая функция, имеющая характеристическую S-образную кривую или сигмовидную кривую. Типичным примером сигмовидной функции является логистическая функция, показанная на первом рисунке и определяемая формулой.
Софтмакс: -
ТанХ: -
В математике гиперболические функции являются аналогами обычных тригонометрических функций, определенных для гиперболы, а не для окружности: точно так же, как точки образуют окружность с единичным радиусом, точки образуют правую половину равносторонней гиперболы.
функция: -
SinH (х) = 1/2 * (е ^ х-е ^ -х)
CosH (x) = 1/2 * (e ^ x + e ^ -x)
TanH (x) = SinH (x) / CosH (x)
Код Python по адресу: -
Но мне очень жаль, что я не написал код для TanH на python, поэтому я добавлю код только в этот блог.
Псевдокоды
function sigmoid x return 1/1+e^x function softmax x y = [] for i in range n(x) eq = x[i]/sum(x) insert eq into y return y sub-function sum x tmp = 0 for i in x tmp+=i return tmp function ReLU x if x > 0: return x else: return 0 function TanH x y = (1/2*(e^x-e^-x))/(1/2*(e^x+e^-x))
Код функции TanH в Python: -
import numpy as np def f(x): y = (1/2*(np.exp(x)-np.exp(-x))/(1/2*(np.exp(x)+np.exp(-x)) return y
Спасибо за чтение:-
Будьте в безопасности во время пандемии Covid-19. Еще раз спасибо или читайте, следите за обновлениями и продолжайте читать.
Удачного ведения блога.
Хотите получать от меня больше блогов и информационных бюллетеней подписывайтесь