Почему временная и пространственная сложность подсчета сортировки равна O(n + k), а не O(max(n, k))?
Здесь 'n' и 'k' - это размер входного массива и максимальный элемент массива соответственно.
Так как в массиве размера 'n' есть один прогон для подсчета частоты элементов и отдельного прогона в массиве размера 'k' и для каждого прохода (или итерации) в массиве, есть count[i] итерации, где 'count' - это массив размера 'k'.
То же самое с пространственной сложностью.
Я ищу хорошее объяснение, объясняющее каждую часть концепции, поскольку вы можете догадаться, что я ужасно смущен.
2 ответа
Обратите внимание, что O(n+k) = O(max(n, k))
так как
max(n,k) <= n+k <= 2max(n,k)
а биг-о не видит константу 2
,
Спасибо всем, кто откликнулся. Но я думаю, что понял.
Предположения:
- Фактический массив с размером
N
являетсяA[]
- Максимальный элемент в массиве
A[]
являетсяK
- Массив для подсчета частоты элементов с размером
K
являетсяcount[]
- Вспомогательный массив для хранения отсортированных элементов с размером
N
являетсяsorted[]
Я смотрел на это таким образом, есть один прогон в A[]
для получения максимального элемента и еще один прогон для хранения частоты каждого элемента. Это занимает O(N)
,
Теперь есть один забег в count[]
и для каждой итерации есть цикл для count[i]
время для вставки элементов массива в отсортированном порядке в sorted[]
, Сумма всех элементов в count[]
не может быть больше чем N
, Таким образом, общее время для этих операций O(N + K)
Следовательно, сложность времени наихудшего случая O(N + K)
, Поправь меня если я где то не прав.
На самом деле, есть два запуска на массиве k
k
представляет размер массива. Буква "k" в обозначении O фактически представляет максимальный элемент.
Если мы напишем O(max(n,k)), это скроет детали алгоритма, который сильно зависит от максимального элемента