2016-10-12 2 views
5

Предположим, что у меня есть два алгоритма A() и B() таким образом, что алгоритм A() занимает ровно O(3n^2) в то время как алгоритм B() занимает O(n^2). Хотя оба алгоритма работают в квадратичное время, можно сказать, что алгоритм B работает быстрее, чем?Когда мы должны рассмотреть константы времени работы

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

Спасибо

+0

«точно O (3n^2)», возможно, вы имеете в виду «ровно 3n^2 шага (используя конкретную реализацию на конкретном типе компьютера, который нас интересует)»? Если каждый шаг реализованной программы, запущенной на этом компьютере, занимает такое же количество времени (например, поскольку каждый шаг имеет тот же тип), то при n> = 1 алгоритм 3n^2-шага всегда будет медленнее, чем n^2-шаговый алгоритм * с использованием этих реализаций на этом компьютере *. Но многие из этих допущений не работают на практике: например, для алгоритма часто требуются шаги «сравнения» и «своп», и это может занять разные времена. –

+0

На любом современном компьютере даже шаги одного и того же базового типа могут занимать разные промежутки времени - например, шаг «копировать этот байт в этот байт» будет быстрее, если некоторые из его операндов окажутся в кеше. Либо вы можете включать такие детали в вашу модель, либо нет; если вы это сделаете, вы получите более точные выводы (на компьютерах, которые соответствуют модели), но меньше * общих * выводов (они не будут применяться к другим моделям). Границы наихудшего случая Big-O близки к самому общему концу спектра: при достаточно больших затратах они дают правильные выводы для * любого * компьютера. –

ответ

3

Вы можете взглянуть на this SO answer.

Из этого ответа:

В итоге - большой-O только так говорит о относительных классов темпов роста, он игнорирует постоянный коэффициент. Однако эти константы абсолютно значительны; они просто не имеют отношения к асимптотическому анализу.

Значит, это не может иметь значения с точки зрения нотации Big O, но в реальной жизни ваш алгоритм B действительно будет работать быстрее.

+0

Теперь вы мне что-то принесли, думаете ли вы, что мы должны учитывать константы, когда я уже знаю, что размер ввода моего алгоритма будет очень большим? – Kris

+0

Я думаю, что если вы делаете выбор между C * n или G * n^2 (где G и C - константы, а G намного меньше C), вы должны игнорировать константы и сосредоточиться на экспоненциальном или линейном. Если вместо этого у вас есть случай (например, ваш пример) из 2 алгоритмов, которые растут с одинаковой скоростью (игнорируя константы), тогда вы должны учитывать ваши константы. –

+0

Большое спасибо ... – Kris

2

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

В этом случае A имеет большую константу, поэтому она, вероятно, медленнее, но могут быть и другие факторы в игре (такие как детали реализации, как в реализации алгоритма, так и в аппаратном обеспечении, на котором он работает), которые могут влиять на баланс в любом случае.

Смежные вопросы