Алгоритмы — различия между версиями

Материал из m6a
Перейти к: навигация, поиск
(Алгоритмы Поиска)
(Рекурсия)
Строка 97: Строка 97:
  
 
==Рекурсия==
 
==Рекурсия==
*Определение: Рекурсия — это метод решения задачи, при котором функция вызывает саму себя для решения подзадач.
+
===Определение:===
**Базовый случай: Условие, при котором рекурсия останавливается и возвращает результат без дальнейших вызовов.
+
Рекурсия — это метод решения задачи, при котором функция вызывает саму себя для решения подзадач.
**Рекурсивный вызов: Функция вызывает саму себя с измененными входными данными, приближая решение к базовому случаю.
+
*Базовый случай: Условие, при котором рекурсия останавливается и возвращает результат без дальнейших вызовов.
**Пример (вычисление факториала):
+
*Рекурсивный вызов: Функция вызывает саму себя с измененными входными данными, приближая решение к базовому случаю.
 +
*Пример (вычисление факториала):
  
 
     ```python
 
     ```python

Версия 14:47, 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)$ — экспоненциальное время.

Дополнительные Алгоритмы и Темы

  • Динамическое программирование: Метод решения сложных задач путем разбиения их на более простые подзадачи и сохранения результатов этих подзадач для избежания повторных вычислений.
    • Жадные алгоритмы: Принимают локально оптимальные решения на каждом шагу с надеждой найти глобально оптимальное решение.
    • Алгоритмы на графах:
      • Поиск кратчайшего пути (алгоритм Дейкстры, алгоритм Флойда-Уоршелла).
      • Поиск минимального остовного дерева (алгоритм Прима, алгоритм Крускала).