Простыми словами
(Всё, что я здесь напишу, будет изложено неформально. Постараюсь избежать каких бы то ни было определений, и, тем более, сложных выводов... Хотя это будет совсем не просто)))

Что же такое сложность алгоритма? На самом деле, понять это интуитивно довольно легко.
Алгоритмическая сложность — это зависимость времени исполнения алгоритма от длины входных данных.
То есть, конечно же очевидно, что если нам нужно что-то найти во входных данных или что-то переставить местами, то чем больше количество информации на входе, тем больше времени понадобится, чтобы получить результат.
"Время" здесь величина довольно абстрактная. Естественно, она (эта величина) должна быть универсальной, и не зависеть от типа и производительности компьютера или иного устройства, а также от других частностей. Измеряется она числом элементарных шагов. Сейчас поясню, что это такое.

читать дальше

UPD: В комментариях важное дополнение сделал  Хранитель печати. Он привел основные классы сложности с их описанием.

@темы: Алгоритмы, Искусственный интеллект, Поп-математика, Amicus Plato

Комментарии
23.06.2008 в 00:21

Таар-лайх!
Множество вычислительных проблем, для которых существуют алгоритмы, схожие по сложности, называется классом сложности.
Здесь можно заметить, что для одной и той же проблемы могут существовать алгоритмы, различные по сложности. В таком случае данное определение становится дуальным, что не есть хорошо (корректнее говорить о сложности алгоритма, а не задачи).
Вообще говоря, сложность алгоритма принято обозначать как О (читается "О-большое"), это так называемая О-нотация.
Наиболее часто встречающиеся классы сложности в зависимости от числа входных данных N таковы (в порядке нарастания сложности, т.е. увеличения времени работы алгоритма, при стремлении N к бесконечности):
О(1) - количество шагов алгоритма не зависит от количества входных данных. Обычно это алгоритмы, использующие определённую часть данных входного потока и игнорирующие все остальные данные. Например, Чистка 1квадратного метра ковра :) вне зависимости от его размеров.
О(log N) - логарифмический алгоритм. Главным образом, в эту категорию попадают алгоритмы поиска
О(N) - алгоритм линейной сложности. Например, просмотр обложки каждой поступающей книги - то есть для каждого входного объекта выполняется только одно действие
О(N log N) - специального названия не имеет. Такую сложность имеют алгоритмы быстрой сортировки, сортировки слиянием и "кучной" сортировки.
O(N2) - квадратичные алгоритмы. В основном, все простейшие алгоритмы сортировки
O(Nx) - полиномиальные алгоритмы
O(XN) - экспоненциальные алгоритмы
О(N!) - факториальные алгоритмы, в основном, используются в комбинаторике для определения числа сочетаний, перестановок.
Конечно, если посмотреть на вышеприведённые записи, на первый взгляд, О(1) - самый лучший алгоритм. Но это не всегда так! Всё определяется числом входных данных. Константное время, требуемое для исполнения алгоритма сложности О(1) может оказаться во много раз больше, чем даже О(N!) при малом числе входных данных. Хотя, естественно, ничто не сравнится с О(1) при N, стремящемся к бесконечности.
Поэтому при программировании алгоритмов требуется оценить как трудоёмкость решения (более быстрые алгоритмы, как правило, требуют большей оптимизации кода, иногда менее устойчивы и уж как пить дать существенно тяжелее для проверки), так и класс задач, т.е. оценить максимальный объём входных данных - и уже исходить из полученных соотношений. Следует помнить, что выражение "Цель оправдывает средства" далеко не всегда применимо при реализации алгоритмов :)
23.06.2008 в 09:50

Простыми словами
Хранитель печати
О!
Вот спасибо!
Это прямо как раз то, что нужно для продолжения!
23.06.2008 в 18:40

practically perfect in every way.
учусь на архитектора. понятия не имею как мне это может пригодиться, но ужасно интересно!:-D
23.06.2008 в 20:15

Простыми словами
Nazarova Varvara
ну... одно и то же знание для разных людей может быть и утилитарным, и "чистым", лишенным прикладной ценности, но от этого не менее интересным ))))
спасибо))