Это могло бы быть слишком математически, но здесь является моей попыткой. (Я математик.)
, Если что-то - O ( f ( n)), тогда это - время выполнения на n , элементы будут равны А f ( n) + B (измеренный в, скажем, тактах или операциях ЦП). Это является ключевым для понимания, что у Вас также есть эти константы А и B, которые являются результатом определенной реализации. B представляет по существу "постоянные издержки" Вашей операции, например, некоторой предварительной обработки, которую Вы делаете, который не зависит от размера набора. А представляет скорость Вашего фактического обрабатывающего объект алгоритма.
ключ, тем не менее, - то, что Вы используете большую нотацию O для выяснения , как хорошо что-то масштабируется . Таким образом, те константы не будут действительно иметь значения: при попытке выяснить, как масштабироваться от 10 до 10 000 объектов, кто заботится о константе, служебной B? Точно так же другие проблемы (см. ниже), конечно, перевесят вес мультипликативной константы А .
, Таким образом, реальное соглашение f ( n). Если f не вырастет нисколько с [1 117] n, например, f ( n) = 1, то Вы масштабируетесь фантастически---, Ваше время выполнения всегда просто будет А + B. Если f вырастет линейно с [1 123] n, т.е. f ( n) = n, то Ваше время выполнения масштабируется в значительной степени настолько лучше всего, как может ожидаться---, если Ваши пользователи будут ожидать 10 нс 10 элементов, они будут ожидать 10 000 нс 10 000 элементов (игнорирующий аддитивную постоянную). Но если это становится быстрее, как [1 127] <глоток> n 2 глоток>, тогда Вы в беде; вещи начнут замедляться слишком очень, когда Вы получите большие наборы. f ( n) = журнал n ( n) является хорошим компромиссом, обычно: Ваша операция не может быть столь простой, чтобы дать линейное масштабирование, но Вам удалось сократить вещи, таким образом, что это масштабируется намного лучше, чем [1 132] f ( n) = <глоток> n 2 глоток>.
Практически, вот некоторые хорошие примеры:
Как работает любой вызов slice.call () в приведенных примерах, если параметр контекста не предоставляется? Реализует ли slice собственный метод вызова, тем самым отменяя метод вызова JavaScript? Методы call и apply принимают в качестве первого параметра объект, определяющий объект контекста (this), применяемый к вызову.