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

Материал из m6a
Перейти к: навигация, поиск
(Ветвление (Условные операторы):)
(Дополнительные Алгоритмы и Темы)
 
(не показано 5 промежуточных версий этого же участника)
Строка 49: Строка 49:
 
===Циклы:===
 
===Циклы:===
 
Повторяющееся выполнение блока кода до тех пор, пока выполняется определенное условие.
 
Повторяющееся выполнение блока кода до тех пор, пока выполняется определенное условие.
**`for`:
+
*`for`:
  
 
         ```
 
         ```
Строка 56: Строка 56:
 
         }
 
         }
 
         ```
 
         ```
**`while`:
+
*`while`:
  
 
         ```
 
         ```
Строка 63: Строка 63:
 
         }
 
         }
 
         ```
 
         ```
**`do-while`:
+
*`do-while`:
  
 
         ```
 
         ```
Строка 72: Строка 72:
  
 
==Алгоритмы Сортировки==
 
==Алгоритмы Сортировки==
*Сортировка пузырьком (Bubble Sort): Многократно проходит по списку, сравнивая соседние элементы и меняя их местами, если они находятся в неправильном порядке.
+
===Сортировка пузырьком (Bubble Sort):===
**Сложность: $O(n^2)$
+
Многократно проходит по списку, сравнивая соседние элементы и меняя их местами, если они находятся в неправильном порядке.
*Сортировка вставками (Insertion Sort): Каждый элемент поочередно вставляется на правильную позицию в уже отсортированной части списка.
+
*Сложность: $O(n^2)$
**Сложность: $O(n^2)$
+
===Сортировка вставками (Insertion Sort):===
*Сортировка выбором (Selection Sort): Находит минимальный элемент в списке и меняет его местами с первым элементом, затем повторяет процесс для оставшейся части списка.
+
Каждый элемент поочередно вставляется на правильную позицию в уже отсортированной части списка.
**Сложность: $O(n^2)$
+
*Сложность: $O(n^2)$
*Быстрая сортировка (Quick Sort): Выбирает опорный элемент, разделяет список на две части (элементы меньше опорного и элементы больше опорного), а затем рекурсивно сортирует эти части.
+
===Сортировка выбором (Selection Sort):===
**Сложность: $O(n \log n)$ в среднем, $O(n^2)$ в худшем случае.
+
Находит минимальный элемент в списке и меняет его местами с первым элементом, затем повторяет процесс для оставшейся части списка.
*Сортировка слиянием (Merge Sort): Разделяет список на меньшие списки, сортирует их и затем сливает в отсортированный список.
+
*Сложность: $O(n^2)$
**Сложность: $O(n \log n)$
+
===Быстрая сортировка (Quick Sort):===
 +
Выбирает опорный элемент, разделяет список на две части (элементы меньше опорного и элементы больше опорного), а затем рекурсивно сортирует эти части.
 +
*Сложность: $O(n \log n)$ в среднем, $O(n^2)$ в худшем случае.
 +
===Сортировка слиянием (Merge Sort):===
 +
Разделяет список на меньшие списки, сортирует их и затем сливает в отсортированный список.
 +
*Сложность: $O(n \log n)$
  
 
==Алгоритмы Поиска==
 
==Алгоритмы Поиска==
*Линейный поиск: Последовательно просматривает каждый элемент списка, пока не найдет искомый элемент или не достигнет конца списка.
+
===Линейный поиск:===
**Сложность: $O(n)$
+
Последовательно просматривает каждый элемент списка, пока не найдет искомый элемент или не достигнет конца списка.
*Бинарный поиск: Требует отсортированного списка. Сравнивает искомый элемент со средним элементом списка. Если искомый элемент меньше, поиск продолжается в левой половине, иначе — в правой.
+
*Сложность: $O(n)$
**Сложность: $O(\log n)$
+
===Бинарный поиск:===
 +
Требует отсортированного списка. Сравнивает искомый элемент со средним элементом списка. Если искомый элемент меньше, поиск продолжается в левой половине, иначе — в правой.
 +
*Сложность: $O(\log n)$
  
 
==Рекурсия==
 
==Рекурсия==
*Определение: Рекурсия — это метод решения задачи, при котором функция вызывает саму себя для решения подзадач.
+
===Определение:===
**Базовый случай: Условие, при котором рекурсия останавливается и возвращает результат без дальнейших вызовов.
+
Рекурсия — это метод решения задачи, при котором функция вызывает саму себя для решения подзадач.
**Рекурсивный вызов: Функция вызывает саму себя с измененными входными данными, приближая решение к базовому случаю.
+
*Базовый случай: Условие, при котором рекурсия останавливается и возвращает результат без дальнейших вызовов.
**Пример (вычисление факториала):
+
*Рекурсивный вызов: Функция вызывает саму себя с измененными входными данными, приближая решение к базовому случаю.
 +
*Пример (вычисление факториала):
  
 
     ```python
 
     ```python
Строка 104: Строка 112:
  
 
==Анализ Сложности Алгоритмов==
 
==Анализ Сложности Алгоритмов==
*Нотация "O" (Big O notation): Используется для описания асимптотического поведения алгоритма, то есть как время выполнения или использование памяти растет с увеличением размера входных данных.
+
===Нотация "O" (Big O notation):===
**Временная сложность: Оценивает, как время выполнения алгоритма зависит от размера входных данных.
+
Используется для описания асимптотического поведения алгоритма, то есть как время выполнения или использование памяти растет с увеличением размера входных данных.
**Пространственная сложность: Оценивает, как объем памяти, используемый алгоритмом, зависит от размера входных данных.
+
*Временная сложность: Оценивает, как время выполнения алгоритма зависит от размера входных данных.
**Примеры:
+
*Пространственная сложность: Оценивает, как объем памяти, используемый алгоритмом, зависит от размера входных данных.
 +
*Примеры:
 
     $O(1)$ — константное время (не зависит от размера входных данных).
 
     $O(1)$ — константное время (не зависит от размера входных данных).
 
     $O(\log n)$ — логарифмическое время.
 
     $O(\log n)$ — логарифмическое время.
Строка 116: Строка 125:
  
 
==Дополнительные Алгоритмы и Темы==
 
==Дополнительные Алгоритмы и Темы==
*Динамическое программирование: Метод решения сложных задач путем разбиения их на более простые подзадачи и сохранения результатов этих подзадач для избежания повторных вычислений.
+
===Динамическое программирование:===
**Жадные алгоритмы: Принимают локально оптимальные решения на каждом шагу с надеждой найти глобально оптимальное решение.
+
Метод решения сложных задач путем разбиения их на более простые подзадачи и сохранения результатов этих подзадач для избежания повторных вычислений.
**Алгоритмы на графах:
+
===Жадные алгоритмы:===
***  Поиск кратчайшего пути (алгоритм Дейкстры, алгоритм Флойда-Уоршелла).
+
Принимают локально оптимальные решения на каждом шагу с надеждой найти глобально оптимальное решение.
***  Поиск минимального остовного дерева (алгоритм Прима, алгоритм Крускала).
+
===Алгоритмы на графах:===
 +
*  Поиск кратчайшего пути (алгоритм Дейкстры, алгоритм Флойда-Уоршелла).
 +
*  Поиск минимального остовного дерева (алгоритм Прима, алгоритм Крускала).

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

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

Динамическое программирование:

Метод решения сложных задач путем разбиения их на более простые подзадачи и сохранения результатов этих подзадач для избежания повторных вычислений.

Жадные алгоритмы:

Принимают локально оптимальные решения на каждом шагу с надеждой найти глобально оптимальное решение.

Алгоритмы на графах:

  • Поиск кратчайшего пути (алгоритм Дейкстры, алгоритм Флойда-Уоршелла).
  • Поиск минимального остовного дерева (алгоритм Прима, алгоритм Крускала).