Алгосы
This commit is contained in:
3
математика/Биективнотсь.md
Normal file
3
математика/Биективнотсь.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Свойство [функции](функция), которое объединяет в себе [[Сюрьективность]] и [[Иньективность]] одновременно, для любого x существует только один y.
|
||||
$\forall x\in X\exists !y\in Y:(x,y)\in F$
|
||||
![[биекция.png]]
|
||||
25
математика/Блочная сортировка.md
Normal file
25
математика/Блочная сортировка.md
Normal file
@@ -0,0 +1,25 @@
|
||||
Алгоритм в котором сортируемые элементы распределяются между конечным числом отдельных блоков так, чтобы все элементы в каждом следующем по порядку блоке были всегда больше (или меньше), чем в предыдущем. Каждый блок затем сортируется отдельно, либо рекурсивно тем же методом, либо другим. Затем элементы помещаются обратно в массив. Этот тип сортировки может обладать линейным временем исполнения. [Сложность алгоритма](Оценка%20сложности%20алгоритма): $O(n)$.
|
||||
#### Алгоритм
|
||||
Если входные элементы подчиняются равномерному закону распределения, то математическое ожидание времени работы алгоритма карманной сортировки является линейным. Это возможно благодаря определенным предположениям о входных данных. При карманной сортировке предполагается, что входные данные равномерно распределены на отрезке \[0, 1).
|
||||
|
||||
Идея алгоритма заключается в том, чтобы разбить отрезок \[0, 1) на $n$ одинаковых отрезков (карманов), и разделить по этим карманам $n$ входных величин. Поскольку входные числа равномерно распределены, предполагается, что в каждый карман попадет небольшое количество чисел. Затем последовательно сортируются числа в карманах. Отсортированный массив получается путём последовательного перечисления элементов каждого кармана.
|
||||
#### Пример
|
||||
![[sort_bucket.png]]
|
||||
#### В виде кода
|
||||
```python
|
||||
def block_sort(arr, block_size=5):
|
||||
if not arr:
|
||||
return arr
|
||||
min_val = min(arr)
|
||||
max_val = max(arr)
|
||||
block_count = (max_val - min_val) // block_size + 1
|
||||
blocks = [[] for _ in range(block_count)]
|
||||
for x in arr:
|
||||
index = (x - min_val) // block_size
|
||||
blocks[index].append(x)
|
||||
result = []
|
||||
for block in blocks:
|
||||
block.sort()
|
||||
result.extend(block)
|
||||
return result
|
||||
```
|
||||
22
математика/Быстрая сортировка.md
Normal file
22
математика/Быстрая сортировка.md
Normal file
@@ -0,0 +1,22 @@
|
||||
Один из самых быстрых известных универсальных алгоритмов сортировки массивов: в среднем [Сложность алгоритма](Оценка%20сложности%20алгоритма) $O(n\log(n))$ обменов при упорядочении $n$ элементов, из-за наличия ряда недостатков на практике обычно используется с некоторыми доработками.
|
||||
#### Алгоритм
|
||||
Алгоритм состоит из трёх шагов:
|
||||
1. Выбрать элемент из массива. Назовём его опорным.
|
||||
2. Разбиение: перераспределение элементов в массиве таким образом, что элементы, меньшие опорного, помещаются перед ним, а большие или равные — после.
|
||||
3. Рекурсивно применить первые два шага к двум подмассивам слева и справа от опорного элемента. Рекурсия не применяется к массиву, в котором только один элемент или отсутствуют элементы.
|
||||
|
||||
В ранних реализациях, как правило, опорным выбирался первый элемент, что снижало производительность на отсортированных массивах. Для улучшения эффективности может выбираться средний, случайный элемент или (для больших массивов) медиана первого, среднего и последнего элементов. Медиана всей последовательности является оптимальным опорным элементом, но её вычисление слишком трудоёмко для использования в сортировке.
|
||||
#### Пример
|
||||
![[sort_qsort.gif]]
|
||||
#### В виде кода
|
||||
```python
|
||||
def quicksort(arr):
|
||||
if len(arr) <= 1:
|
||||
return arr
|
||||
pivot = arr[len(arr) // 2]
|
||||
left = [x for x in arr if x < pivot]
|
||||
middle = [x for x in arr if x == pivot]
|
||||
right = [x for x in arr if x > pivot]
|
||||
return quicksort(left) + middle + quicksort(right)
|
||||
|
||||
```
|
||||
3
математика/Иньективность.md
Normal file
3
математика/Иньективность.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Свойство [функции](функция), которое означает что одинаковый результат возможен только при одинаковых входных данных, для любого x существует только один y.
|
||||
$\forall x_1,x_2\in X:(x_1\not =x_2=>f(x_1)\not =f(x_2))$
|
||||
![[иньекция.png]]
|
||||
21
математика/Сортировка Шелла.md
Normal file
21
математика/Сортировка Шелла.md
Normal file
@@ -0,0 +1,21 @@
|
||||
Усовершенствованный вариант сортировки вставками. Идея метода Шелла состоит в сравнении элементов, стоящих не только рядом, но и на определённом расстоянии друг от друга. Иными словами — это сортировка вставками с предварительными «грубыми» проходами. [Сложность алгоритма](Оценка%20сложности%20алгоритма) $O(n^2)$
|
||||
#### Алгоритм
|
||||
При сортировке Шелла сначала сравниваются и сортируются между собой значения, стоящие один от другого на некотором расстоянии $d$. После этого процедура повторяется для некоторых меньших значений $d$, а завершается сортировка Шелла упорядочиванием элементов при $d=1$. Эффективность сортировки Шелла в определённых случаях обеспечивается тем, что элементы «быстрее» встают на свои места.
|
||||
#### Пример
|
||||
![[sort_shell.gif]]
|
||||
#### В виде кода
|
||||
```python
|
||||
def shell_sort(data: list[int]) -> list[int]:
|
||||
last_index = len(data)
|
||||
step = len(data)//2
|
||||
while step > 0:
|
||||
for i in range(step, last_index, 1):
|
||||
j = i
|
||||
delta = j - step
|
||||
while delta >= 0 and data[delta] > data[j]:
|
||||
data[delta], data[j] = data[j], data[delta]
|
||||
j = delta
|
||||
delta = j - step
|
||||
step //= 2
|
||||
return data
|
||||
```
|
||||
3
математика/Сюрьективность.md
Normal file
3
математика/Сюрьективность.md
Normal file
@@ -0,0 +1,3 @@
|
||||
Свойство [функции](функция), которое означает что при любом входе получишь значение, для любого x существует хотя бы один y.
|
||||
$\forall x\in X\exists y\in Y:f(x)=y$
|
||||
![[сюрьекция.png]]
|
||||
Reference in New Issue
Block a user