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

Материал из m6a
Перейти к: навигация, поиск
(Ветвление (Условные операторы):)
(Циклы:)
Строка 49: Строка 49:
 
===Циклы:===
 
===Циклы:===
 
Повторяющееся выполнение блока кода до тех пор, пока выполняется определенное условие.
 
Повторяющееся выполнение блока кода до тех пор, пока выполняется определенное условие.
**`for`:
+
*`for`:
  
 
         ```
 
         ```
Строка 56: Строка 56:
 
         }
 
         }
 
         ```
 
         ```
**`while`:
+
*`while`:
  
 
         ```
 
         ```
Строка 63: Строка 63:
 
         }
 
         }
 
         ```
 
         ```
**`do-while`:
+
*`do-while`:
  
 
         ```
 
         ```

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

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

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