Два алгоритма работают за O(n)

Меня срезали на тесте на этом вопросе, но я никак не могу вникнуть в суть.

Вопрос звучал так

Два алгоритма работают за O(n) времени. Выберите верное утверждение

1 - Оба алгоритма работают за одинаковое количество секунд 2 - Либо первый алгоритм работает всегда быстрее, либо второй 3 - Иногда первый может отработать быстрее, иногда второй, иногда одинаково

Я ответил 1 - и оказался не прав

В условии ничего не сказано ни про комплектацию, ни про процессы.

O(n) - это же линейная асимптотика. Пока все элементы циклом не переберутся ничего не поменяется


Ответы (2 шт):

Автор решения: Stanislav Volodarskiy

Линейная сложность означает что алгоритм работает за время примерно равное CN. Время работы двух разных алгоритмов будет примерно C1 * N, C2 * N. C1 и C2 - положительные константы зависящие от алгоритма и обрудования.

Ответ 1 не подходит: если C1 и C2 будут заметно разные, времена работы тоже будут разные.

Ответ 2 не подходит если C1 и С2 примерно равны, то вы не можете сказать что один алгоритм быстрее другого.

Ответ 3 тоже не подходит. Вернее он подходит, но только если C1 и С2 примерно равны. Тогда алгоритмы будут работать примерно одно время. А так как "примерно" то возможно что "Иногда первый может отработать быстрее, иногда второй, иногда одинаково".

Что в голове у автора задачи было не скажу. Возможно имелся в виду третий ответ - в нём одном есть слово "может".

→ Ссылка
Автор решения: CrazyElf

Я за 3-й вариант.

  • 1 - Оба алгоритма работают за одинаковое количество секунд - у нас нет такой гарантии, O(n) гарантирует только что время работы обоих алгоритмов линейно зависит от n, но не гарантирует, что это время одинаковое
  • 2 - Либо первый алгоритм работает всегда быстрее, либо второй - опять же O(n) не гарантирует, что время конкретное и не говорит ничего о коэффициенте, на который нужно умножать n, и время работы алгоритма может зависеть от данных, ничто не мешает тому, чтобы на одних данных работал быстрее первый алгоритм, а на каких-то другой, при этом они оба всё-равно будут O(n)
  • 3 - Иногда первый может отработать быстрее, иногда второй, иногда одинаково - а вот это утверждение как-раз не накладывает никаких ограничений и оно, кстати, могло бы быть справедливо для любого O, если про n тут ничего не говорится, я ставлю на этот вариант. Вот если бы говорилось, что при увеличении n один из алгоритмов оказывался бы строго быстрее другого, то тут можно было бы сказать, что O у этих алгоритмов должно было быть разным (например, O(n) и O(n^2)).
→ Ссылка