Этот вопрос вызвал некоторую путаницу и много комментариев о том, являются ли алгоритмы, предложенные в различных ответах, O (1) или O (n).
Давайте используем простой пример, чтобы проиллюстрировать две точки зрения:
мы хотим найти длинный
x
такой, чтоa * x + b = 0
, гдеa
иb
известны, ненулевые длинные.
- Очевидным алгоритмом O(1) является
x = - b / a
- Гораздо более медленный алгоритм будет состоять в проверке всех возможных длинных значений, что в среднем будет примерно в 2^63 раза медленнее.
Является ли второй алгоритм O (1) или O (n)?
Аргументы, представленные в связанных вопросах:
- это O (n), потому что в худшем случае вам нужно перебрать все возможные длинные значения
- это O(1) , потому что его сложность имеет вид
c x O(1)
, гдеc = 2^64
— константа.
Хотя я понимаю аргумент, говорящий, что это O (1), он кажется нелогичным.
PS: я добавил java, поскольку исходный вопрос находится в Java, но этот вопрос не зависит от языка.