В качестве простой интуиции о том, что такое big-O (big-O) и big-Θ (big-Theta), они рассказывают о том, как изменяется количество операций, которые необходимо выполнить, когда вы значительно увеличите размерпроблема (например, в 2 раза).
Линейная сложность по времени означает, что вы увеличиваете размер в 2 раза, количество шагов, которые вам нужно выполнить, также увеличивается примерно в 2 раза.Это то, что называется Θ(n)
и часто взаимозаменяемо, но не точно O(n)
(разница между O
и Θ
заключается в том, что O
обеспечивает только верхнюю границу, а Θ
гарантирует как верхнюю, так и нижнюю границу).
Логарифмическая сложность по времени (Θ(log(N))
) означает, что при увеличении размера в 2 раза количество шагов, которые вам нужно выполнить, увеличивается на некоторое фиксированное количество операций.Например, используя бинарный поиск, вы можете найти данный элемент в вдвое длинном списке, используя только одну итерацию цикла.
Аналогично, экспоненциальная сложность времени (Θ(a^N)
для некоторой константы a > 1
) означает, что если вы увеличитедля решения этой проблемы всего в 1 раз вам потребуется в * 1016 раз больше операций.(Обратите внимание, что между Θ(2^N)
и 2^Θ(N)
есть небольшая разница, и фактически второй является более общим, оба лежат в экспоненциальном времени, но ни один из двух не покрывает все это, см. wiki для некоторых другихдетали)
Обратите внимание, что эти определения в значительной степени зависят от того, как вы определяете "размер задачи"
. Как правильно заметил @DavidEisenstat, существует два возможных контекста, в которых ваш алгоритм может быть виден:
Некоторые числа фиксированной ширины (например, 32-разрядные числа).В таком контексте очевидной мерой сложности алгоритма первичного тестирования является само проверяемое значение.В таком случае ваш алгоритм является линейным.
На практике существует множество контекстов, в которых алгоритм простого тестирования должен работать для действительно больших чисел.Например, многие криптоалгоритмы, используемые сегодня (например, обмен ключами Диффи-Хеллмана или RSA ), используют очень большие простые числа, такие как 512-битные, 1024-битные и так далее.Также в этом контексте безопасность измеряется количеством этих битов, а не конкретным простым значением.Таким образом, в таких условиях естественным способом измерения размера задачи является количество бит.И теперь возникает вопрос: сколько операций нам нужно выполнить, чтобы проверить значение известного размера в битах, используя ваш алгоритм?Очевидно, что если значение N
имеет m
битов, оно равно N ≈ 2^m
.Таким образом, ваш алгоритм из линейного Θ(N)
преобразуется в экспоненциальный 2^Θ(m)
.Другими словами, чтобы решить проблему для значения, которое на 1 бит длиннее, вам нужно выполнить примерно в 2 раза больше работы.