Алгоритмы — различия между версиями
Материал из m6a
Vshpagin (обсуждение | вклад) (→Ветвление (Условные операторы):) |
Vshpagin (обсуждение | вклад) (→Ветвление (Условные операторы):) |
||
Строка 21: | Строка 21: | ||
===Ветвление (Условные операторы):=== | ===Ветвление (Условные операторы):=== | ||
Выполнение инструкций зависит от выполнения определенного условия. | Выполнение инструкций зависит от выполнения определенного условия. | ||
− | `if`: | + | *`if`: |
``` | ``` | ||
Строка 28: | Строка 28: | ||
} | } | ||
``` | ``` | ||
− | `else if`: | + | *`else if`: |
``` | ``` | ||
Строка 37: | Строка 37: | ||
} | } | ||
``` | ``` | ||
− | `else`: | + | *`else`: |
``` | ``` |
Версия 14:44, 8 марта 2025
Содержание
Алгоритмы
Общее понимание
Определение:
Алгоритм — это четкая и конечная последовательность инструкций, предназначенная для решения определенной задачи.
Свойства:
- Конечность: Алгоритм должен завершаться за конечное число шагов.
- Определённость: Каждая инструкция должна быть ясной и не допускать двусмысленности.
- Эффективность: Алгоритм должен быть выполним с использованием доступных ресурсов за приемлемое время.
- Ввод: Алгоритм может принимать входные данные.
- Вывод: Алгоритм должен выдавать результат.
Основные Алгоритмические Конструкции
- Последовательное выполнение: Инструкции выполняются одна за другой в заданном порядке.
``` Инструкция 1; Инструкция 2; Инструкция 3; ```
Ветвление (Условные операторы):
Выполнение инструкций зависит от выполнения определенного условия.
- `if`:
``` if (условие) { // Инструкции, выполняемые, если условие истинно } ```
- `else if`:
``` if (условие1) { // Инструкции, выполняемые, если условие1 истинно } else if (условие2) { // Инструкции, выполняемые, если условие2 истинно } ```
- `else`:
``` if (условие) { // Инструкции, выполняемые, если условие истинно } else { // Инструкции, выполняемые, если условие ложно } ```
Циклы:
Повторяющееся выполнение блока кода до тех пор, пока выполняется определенное условие.
- `for`:
``` for (инициализация; условие; изменение) { // Инструкции, выполняемые в цикле } ```
- `while`:
``` while (условие) { // Инструкции, выполняемые, пока условие истинно } ```
- `do-while`:
``` do { // Инструкции, выполняемые хотя бы один раз } while (условие); ```
Алгоритмы Сортировки
- Сортировка пузырьком (Bubble Sort): Многократно проходит по списку, сравнивая соседние элементы и меняя их местами, если они находятся в неправильном порядке.
- Сложность: $O(n^2)$
- Сортировка вставками (Insertion Sort): Каждый элемент поочередно вставляется на правильную позицию в уже отсортированной части списка.
- Сложность: $O(n^2)$
- Сортировка выбором (Selection Sort): Находит минимальный элемент в списке и меняет его местами с первым элементом, затем повторяет процесс для оставшейся части списка.
- Сложность: $O(n^2)$
- Быстрая сортировка (Quick Sort): Выбирает опорный элемент, разделяет список на две части (элементы меньше опорного и элементы больше опорного), а затем рекурсивно сортирует эти части.
- Сложность: $O(n \log n)$ в среднем, $O(n^2)$ в худшем случае.
- Сортировка слиянием (Merge Sort): Разделяет список на меньшие списки, сортирует их и затем сливает в отсортированный список.
- Сложность: $O(n \log n)$
Алгоритмы Поиска
- Линейный поиск: Последовательно просматривает каждый элемент списка, пока не найдет искомый элемент или не достигнет конца списка.
- Сложность: $O(n)$
- Бинарный поиск: Требует отсортированного списка. Сравнивает искомый элемент со средним элементом списка. Если искомый элемент меньше, поиск продолжается в левой половине, иначе — в правой.
- Сложность: $O(\log n)$
Рекурсия
- Определение: Рекурсия — это метод решения задачи, при котором функция вызывает саму себя для решения подзадач.
- Базовый случай: Условие, при котором рекурсия останавливается и возвращает результат без дальнейших вызовов.
- Рекурсивный вызов: Функция вызывает саму себя с измененными входными данными, приближая решение к базовому случаю.
- Пример (вычисление факториала):
```python def factorial(n): if n == 0: # Базовый случай return 1 else: return n * factorial(n - 1) # Рекурсивный вызов ```
Анализ Сложности Алгоритмов
- Нотация "O" (Big O notation): Используется для описания асимптотического поведения алгоритма, то есть как время выполнения или использование памяти растет с увеличением размера входных данных.
- Временная сложность: Оценивает, как время выполнения алгоритма зависит от размера входных данных.
- Пространственная сложность: Оценивает, как объем памяти, используемый алгоритмом, зависит от размера входных данных.
- Примеры:
$O(1)$ — константное время (не зависит от размера входных данных). $O(\log n)$ — логарифмическое время. $O(n)$ — линейное время. $O(n \log n)$ — линейно-логарифмическое время. $O(n^2)$ — квадратичное время. $O(2^n)$ — экспоненциальное время.
Дополнительные Алгоритмы и Темы
- Динамическое программирование: Метод решения сложных задач путем разбиения их на более простые подзадачи и сохранения результатов этих подзадач для избежания повторных вычислений.
- Жадные алгоритмы: Принимают локально оптимальные решения на каждом шагу с надеждой найти глобально оптимальное решение.
- Алгоритмы на графах:
- Поиск кратчайшего пути (алгоритм Дейкстры, алгоритм Флойда-Уоршелла).
- Поиск минимального остовного дерева (алгоритм Прима, алгоритм Крускала).