Как правило, мы используем нотацию big-O только тогда, когда n может подниматься до неприлично больших значений, потому что нотация big-O описывает, как увеличивается время выполнения при увеличении входных данных. Например, при сортировке списка большинство лучших алгоритмов сортируются по O(n log n)
- что означает, а only означает, что когда список достаточно длинный, время, необходимое для его сортировки, пропорциональнодо n log n
. Когда список недостаточно длинный, другие факторы (например, любое время, которое может потребоваться вашему алгоритму для выделения дополнительного пространства), становятся значительными и могут даже занять время выполнения.
С помощью строк JavaScript n
действительно может быть сколь угодно большим *, поэтому мы говорим, что сравнение занимает O(n)
время. Но с числами JavaScript (которые являются IEEE 754 числами с плавающей запятой двойной точности ), n
имеет максимальный предел 64 - 1 для знакового бита, 11 для показателя степени и 53 для значащих цифр **. Из-за этого мы точно знаем, сколько времени, возможно, потребуется для сравнения чисел, и лучшие системы, которые у нас есть для сравнения чисел этого точного размера, более или менее работают одинаково, независимо от того, сколько из этих 64 цифр каждое число на самом делеимеет - следовательно, сравнение этих чисел в JavaScript считается O(1)
.
* Технически, существует верхний предел, потому что RAM может закончиться. Однако в языке не указан максимальный размер для строк, и часть сравнения строк O(n)
доминирует во времени выполнения задолго до того, как это произойдет.
** Кстати, это означает, что числа вJavaScript не может расти бесконечно. После определенной точки они начинают выбрасывать меньшие цифры (например, числа выше 2 ^ 53 могут быть только четными, а числа выше 2 ^ 54 могут делиться только на 4), а когда число становится достаточно большим, оно округляется вверхдо бесконечности. И наоборот, если вы делите число снова и снова, чтобы сделать его бесконечно малым, оно в итоге округляется до нуля.