Ответ на первую часть, очевидно, (а), потому что O (n * n)> O (n).
Ответ на вторую часть заключается в том, что вы не можете сказать «что лучше для небольших входных размеров», потому что вы не даете никакой информации о том, что такое «элементарные операции» в каждом случае, и о том, сколько времени занимает каждая из этих операций. Компилятор или процессор могут применить некоторую оптимизацию, которая заставляет так называемый более медленный алгоритм выполнять НАМНОГО быстрее, чем «лучший» алгоритм при небольших входных размерах.
И «маленькими» размерами ввода, которые могут означать 10, 100 или 1 миллион +! Пересечение между умным алгоритмом O (n) и алгоритмом немого O (n * n) может быть огромным, потому что компиляторы и процессоры отлично справляются с очень быстрой работой тупого кода.
Многие люди совершают ошибку, «оптимизируя» свой код на основе O (), не принимая во внимание размер ввода и не проверяя, насколько хорошо каждый работает с наборами данных, которые они будут использовать.
Конечно, это не значит, что вы всегда должны исправлять тупой код, когда есть намного лучший алгоритм, или структура данных, которая может сделать это за O (n) время, но это означает, что вы должны тщательно обдумать, прежде чем инвестировать работу в создайте гораздо более умный (но сложный в обслуживании) алгоритм, который, по вашему мнению, является оптимальным, поскольку он имеет лучший O ().