💀
Второй курс РПО
Разработка программных модулей
Разработка программных модулей
  • Модели разработки
  • Ошибки и отладка программ
  • Средства разработки алгоритмов
    • Основные принципы и стадии тестирования
  • Сложностные классы
  • Эмуляторы операционных систем
  • Сложность сортировки
  • Уровни тестирования
  • Задание №1
  • Регрессионное тестирование
  • Тестирование «белым ящиком»
  • Как делать оценку сложности?
  • Алгоритмы и сложность
  • Тестирование "белым ящиком" №2
  • Сложность алгоритмов
  • Тестирование "белым ящиком" №3
  • Тестирование "Чёрным ящиком»" №1
  • Тестирование "Черным ящиком" №2
  • Оценка сложности эвристических алгоритмов
  • Принципы ООП
  • Тестирование "Черным ящиком" №3
  • КТ - В3
  • Модульное тестирование
    • С кодами
  • Модульное тестирование
  • Абстрактные классы и интерфейсы в Python
  • Структуры в Python по аналогии с C++
    • Диалоги гениев
  • Делегаты в Python
    • Ещё более не смешные диалоги
  • Регулярные выражения в Python от простого к сложному
  • Python: Коллекции
  • Параметризованные классы (шаблоны)
  • Указатели и операции со списками в Python
  • Интеграционное тестирование
  • Работа с классами. Перегрузка методов
  • Определение операций в классе.
  • Создание наследованных классов
  • Интеграционное тестирование
  • Работа с объектами через интерфейсы
  • Использование стандартных интерфейсов
  • Работа с типом данных "Структура"
  • Коллекции. Параметризованные классы
  • Использование регулярных выражений
  • Операции со списками
  • Что такое паттерны проектирования?
  • Шпаргалка по шаблонам проектирования
    • [Habr] Шпаргалка
  • UML-диаграммы проектирования
  • Использование основных шаблонов.
  • Использование каких то там шаблонов
  • 15-я Практическая
  • 16-я Практическая
  • Graphviz Online
  • 17-я Практическая
  • Введение в теорию программирования: Объектно-ориентированный подход
  • Документирование софта и стандарты
  • C# Ввод и вывод
  • Оптимизация кода: просто о главном
  • Автоматизация разработки технической документации
  • Автоматизированное документирование и первичные данные
  • ADO.NET что это?
Powered by GitBook
On this page
  • Как оценивать сложность алгоритмов?
  • Основные виды сложности
  • Как определить сложность
  • Часто встречающиеся порядки роста
  • Пример оценки сложности
  • Рекомендации для анализа
  • Примечания

Как делать оценку сложности?

19.11.2024 - Инструкция для студентов

PreviousТестирование «белым ящиком»NextАлгоритмы и сложность

Last updated 6 months ago

Как оценивать сложность алгоритмов?

Оценка сложности алгоритма помогает понять, как он будет вести себя при увеличении размера входных данных. Основное внимание уделяется скорости выполнения и объему памяти, который он использует.


Основные виды сложности

  1. Временная сложность Определяет, сколько операций выполняется алгоритмом для обработки данных. Обозначается через O(n), где n — размер входных данных.

  2. Пространственная сложность Показывает, сколько памяти требуется для выполнения алгоритма. Учитываются как входные данные, так и используемые переменные.


Как определить сложность

1

Анализ по коду

  • Найти основные блоки: циклы, рекурсию, ветвления.

  • Определить количество операций для каждого блока.

2

Оценить вклад каждого блока

  • Циклы: сколько итераций и операций на каждой итерации.

  • Рекурсия: определить количество вызовов.

  • Вложенные структуры: учитывать вложенность циклов и условий.

3

Учесть порядок роста

  • Игнорировать константы и незначимые члены. Например: вместо 5n + 3 писать O(n).


Часто встречающиеся порядки роста

Тип сложности
Обозначение
Пример

Константная

O(1)

Поиск элемента в хэш-таблице

Линейная

O(n)

Проход по массиву

Логарифмическая

O(log n)

Бинарный поиск

Линейно-логарифмическая

O(n log n)

Быстрая сортировка

Квадратичная

O(n²)

Сравнение всех пар элементов

Кубическая

O(n³)

Тройная вложенность циклов

Факториальная

O(n!)

Перебор всех перестановок


Пример оценки сложности

Алгоритм с циклом и условием:

#include <iostream>
#include <vector>

// Функция проверяет, есть ли в массиве положительные числа
bool hasPositive(const std::vector<int>& arr) {
    for (int i = 0; i < arr.size(); i++) { // Цикл выполняется n раз
        if (arr[i] > 0) { // Проверка на каждом шаге
            return true;  // Если найден положительный элемент, алгоритм завершается
        }
    }
    return false; // Если не найдено, возвращается false
}

int main() {
    std::vector<int> data = {-1, -2, -3, 4, -5};
    std::cout << (hasPositive(data) ? "Есть положительное" : "Нет положительных");
    return 0;
}

Разбор сложности:

  • Цикл: выполняется n раз (в худшем случае). Сложность: O(n).

  • Условие внутри цикла: выполняется за O(1).

  • Итоговая сложность: O(n).


Рекомендации для анализа


Примечания

  • Важно учитывать худший случай, так как он показывает пределы работы алгоритма.

  • Некоторые алгоритмы имеют разные сложности для лучших, средних и худших случаев (например, сортировка вставками).

  • Линковщик: программа, которая объединяет объектный код и зависимости в финальный исполняемый файл (.EXE).