При разработке Алгоритма анализ сложности алгоритма является существенным аспектом. Главным образом, сложность алгоритма связана с его производительностью, с тем, насколько быстро или медленно он работает.
Сложность алгоритма описывает эффективность алгоритма с точки зрения объема памяти, необходимой для обработки данных, и времени обработки.
Сложность алгоритма анализируется в двух ракурсах: время и пространство .
Сложность времени
Это функция, описывающая количество времени, необходимое для запуска алгоритма, с точки зрения размера ввода. «Время» может означать количество выполненных обращений к памяти, количество сравнений между целыми числами, количество выполнений некоторого внутреннего цикла или некоторую другую натуральную единицу, связанную с количеством реального времени, которое займет алгоритм.
Космическая сложность
Это функция, описывающая объем памяти, занимаемый алгоритмом с точки зрения размера ввода в алгоритм. Мы часто говорим о «дополнительной» необходимой памяти, не считая памяти, необходимой для хранения самого ввода. Опять же, мы используем натуральные (но фиксированной длины) единицы измерения для этого.
Сложность пространства иногда игнорируется, поскольку используемое пространство минимально и / или очевидно, однако иногда оно становится такой же важной проблемой, как и время.
Асимптотические обозначения
Время выполнения алгоритма зависит от набора команд, скорости процессора, скорости дискового ввода-вывода и т. Д. Следовательно, мы оцениваем эффективность алгоритма асимптотически.
Функция времени алгоритма представлена как T (n) , где n — размер ввода.
Различные типы асимптотических обозначений используются для представления сложности алгоритма. Следующие асимптотические обозначения используются для вычисления сложности времени выполнения алгоритма.
-
О — Большой О
-
Ω — большая омега
-
θ — большая тета
-
о — маленький о
-
ω — маленькая омега
О — Большой О
Ω — большая омега
θ — большая тета
о — маленький о
ω — маленькая омега
O: асимптотическая верхняя граница
«О» (Big Oh) — наиболее часто используемая запись. Функция f (n) может быть представлена в следующем порядке: g (n), то есть O (g (n)) , если существует значение положительного целого числа n, равного n 0, и положительной константы c, такой что —
f(n) leqslantcg(n) для n>n0 во всех случаях
Следовательно, функция g (n) является верхней границей для функции f (n) , так как g (n) растет быстрее, чем f (n) .
пример
Рассмотрим данную функцию: f(n)=4.n3+10.n2+5.n+1
Учитывая, что g(n)=n3,
f(n) leqslant5.g(n) для всех значений n>2
Следовательно, сложность f (n) может быть представлена в виде O(g(n)), то есть O(n3)
Ω: асимптотическая нижняя граница
Мы говорим, что f(n)= Omega(g(n)), когда существует постоянная c, что f(n) geqslantcg(n) для всех достаточно больших значений n . Здесь n — положительное целое число. Это означает, что функция g является нижней границей для функции f ; после определенного значения n f никогда не опустится ниже g .
пример
Рассмотрим данную функцию: f(n)=4.n3+10.n2+5.n+1.
Учитывая g(n)=n3, f(n) geqslant4.g(n) для всех значений n>0.
Следовательно, сложность f (n) может быть представлена в виде Omega(g(n)), то есть Omega(n3)
θ: асимптотическая жесткая граница
Мы говорим, что f(n)= theta(g(n)), когда существуют константы c 1 и c 2, которые c1.g(n) leqslantf(n) leqslantc2.g(n) для всех достаточно больших значений n . Здесь n — положительное целое число.
Это означает, что функция g является точной оценкой для функции f .
пример
Рассмотрим данную функцию: f(n)=4.n3+10.n2+5.n+1
Учитывая g(n)=n3, 4.g(n) leqslantf(n) leqslant5.g(n) для всех больших значений n .
Следовательно, сложность функции f (n) может быть представлена в виде theta(g(n)), то есть theta(n3).
O — обозначение
Асимптотическая верхняя граница, обеспечиваемая O-обозначением, может быть или не быть асимптотически жесткой. Оценка 2.n2=O(n2) асимптотически тесная, а оценка 2.n=O(n2) — нет.
Мы используем o-обозначение для обозначения верхней границы, которая не является асимптотически жесткой.
Мы формально определяем o (g (n)) (little-oh of g of n) как множество f (n) = o (g (n)) для любой положительной константы c>0, и существует значение n0>0, так что 0 leqslantf(n) leqslantcg(n).
Интуитивно понятно, что в o-записи функция f (n) становится незначительной относительно g (n) при приближении n к бесконечности; то есть,
limn rightarrow infty left( fracf(n)g(n) right)=0
пример
Рассмотрим ту же функцию: f(n)=4.n3+10.n2+5.n+1.
Учитывая g(n)=n4,
limn rightarrow infty left( frac4.n3+10.n2+5.n+1n4 right)=0
Следовательно, сложность функции f (n) может быть представлена в виде o(g(n)), то есть o(n4).
ω — обозначение
Мы используем ω-обозначение для обозначения нижней границы, которая не является асимптотически жесткой. Формально, однако, мы определяем ω (g (n)) (мало омега g из n) как множество f (n) = ω (g (n)) для любой положительной константы C> 0 и существует значение n0>0, так что 0 leqslantcg(n)<f(n).
Например, fracn22= omega(n), но fracn22 neq omega(n2). Соотношение f(n)= omega(g(n)) подразумевает, что существует следующий предел
limn rightarrow infty left( fracf(n)g(n) right)= infty
То есть, f (n) становится произвольно большим относительно g (n), когда n приближается к бесконечности.
пример
Рассмотрим ту же функцию: f(n)=4.n3+10.n2+5.n+1
Учитывая g(n)=n2,
limn rightarrow infty left( frac4.n3+10.n2+5.n+1n2 right)= infty
Следовательно, сложность функции f (n) может быть представлена в виде o(g(n)), то есть omega(n2).
Априори и Апостиари Анализ
Априорный анализ означает, что анализ выполняется до запуска его в конкретной системе. Этот анализ является этапом, когда функция определяется с использованием некоторой теоретической модели. Следовательно, мы определяем временную и пространственную сложность алгоритма, просто взглянув на алгоритм, а не на его запуск в конкретной системе с другой памятью, процессором и компилятором.
Апостиарный анализ алгоритма означает, что мы выполняем анализ алгоритма только после запуска его в системе. Это напрямую зависит от системы и меняется от системы к системе.
В отрасли мы не можем выполнить анализ Apostiari, поскольку программное обеспечение, как правило, предназначено для анонимного пользователя, который запускает его в системе, отличной от существующих в отрасли.
В Apriori это причина, по которой мы используем асимптотические нотации для определения сложности времени и пространства при их изменении с компьютера на компьютер; однако асимптотически они одинаковы.