Здесь под асимптотическим анализом я предполагаю, что мы имеем в виду поведение алгоритма, поскольку размер входных данных уходит в бесконечность.
Причина, по которой мы используем асимптотический анализ, заключается в том, что
он полезен для прогнозирования поведения алгоритмов на практике . Предсказания позволяют нам принимать решения, например, когда у нас есть разные алгоритмы для проблемы, какой из них мы должны использовать? (Быть полезным не значит, что это всегда правильно.)
Тот же вопрос можно задать о любой упрощенной модели реального мира. Почему мы используем упрощенные математические модели реального мира?
Подумай о физике. Классическая ньютоновская физика не так хороша, как релятивистская физика в предсказаниях реального мира. Но это достаточно хорошая модель для строительства автомобилей, небоскребов, подводных лодок, самолетов, мостов и т. Д. Есть случаи, когда это не достаточно хорошо, например, если мы хотим построить спутник или отправить космический зонд Плутону или предсказать движение массивных небесных объектов, таких как звезды и планеты, или очень высокоскоростных объектов, таких как электроны.
Важно знать, каковы границы модели.
Обычно это достаточно хорошее приближение к реальному миру.
На практике мы часто видим, что алгоритм с лучшим асимптотическим анализом работает лучше на практике. Редко случается, что алгоритм обладает лучшим асимптотическим поведением. Поэтому, если входные данные могут быть достаточно большими, мы обычно можем полагаться на асимптотический анализ в качестве первого предсказания поведения алгоритмов. Это не так, если мы знаем, что ввод будет небольшим. В зависимости от желаемой производительности нам может потребоваться провести более тщательный анализ, например, если у нас есть информация о распределении входных данных, будет предоставлен алгоритм, мы можем провести более тщательный анализ для достижения поставленных целей (например, быстро на 99 % входов). Дело в том, что в качестве первого шага асимптотический анализ является хорошей отправной точкой. На практике мы также должны проводить тесты производительности, но имейте в виду, что у этого также есть свои проблемы.
AAAимеет лучшую асимптотическую сложность. Чем ни один из них не лучше другого во всех входах? Тогда это становится более сложным и зависит от того, что нас волнует. Мы заботимся о больших входах или маленьких входах? Если мы заботимся о больших входных данных, то не часто алгоритм имеет лучшую асимптотическую сложность, но ведет себя хуже всего при больших входных данных, которые нас интересуют. Если мы больше заботимся о небольших входах, то асимптотический анализ может оказаться не таким уж полезным. Мы должны сравнить время работы алгоритмов на входах, которые нас интересуют. На практике для сложных задач со сложными требованиями асимптотический анализ может быть не таким полезным. Для простых основных задач, которые рассматриваются в учебниках по алгоритму, это весьма полезно.
Короче говоря, асимптотическая сложность - это сравнительно легко вычисляемая аппроксимация реальной сложности алгоритмов для простых базовых задач (задач в учебнике по алгоритмам). По мере того как мы создаем более сложные программы, требования к производительности меняются и становятся все более сложными, и асимптотический анализ может оказаться не таким полезным.
Полезно сравнить асимптотический анализ с другими подходами для прогнозирования производительности алгоритмов и их сравнения. Одним из распространенных подходов является тестирование производительности на случайных или эталонных входных данных. Это обычно, когда вычисление асимптотической сложности является трудным или невыполнимым, например, когда мы используем эвристику, как, скажем, в решении SAT. Другой случай, когда требования более сложны, например, когда производительность программы зависит от внешних факторов, и наша цель может заключаться в том, чтобы что-то заканчивалось в определенные фиксированные временные рамки (например, подумать об обновлении интерфейса, показанного пользователю) на 99% входы.
Но имейте в виду, что анализ производительности также имеет свои проблемы. Он не предоставляет математических грантополучателей за меньшую производительность, но мы фактически запускаем тест производительности на всех входных данных, которые будут переданы алгоритму (часто в вычислительном отношении), и зачастую невозможно решить, что некоторые входные данные никогда не будут предоставлены). Если мы
проводим тестирование на случайной выборке или эталоне, мы неявно предполагаем некоторую регулярность производительности алгоритмов, то есть алгоритм будет работать аналогично на других входных данных, которые не были частью теста производительности.
Вторая проблема с тестами производительности заключается в том, что они зависят от среды тестирования. Т.е. производительность программы определяется не одними входными данными, а внешними факторами (например, типом машины, операционной системой, эффективностью кодированного алгоритма, использованием ЦП, временем доступа к памяти и т. Д.), Некоторые из которых могут различаться в зависимости от разных прогонов тест на той же машине. Здесь мы снова предполагаем, что конкретные среды, в которых проводится тест производительности, аналогичны реальной среде, если только мы не проводим тесты производительности во всех средах, на которых мы можем запустить программу (и как мы можем предсказать, на каких машинах кто-то может выполнить сортировку). алгоритм на 10 лет?).
Θ ( н лгн )Θ ( н2)Θ ( LGн )O ( n )