Различие между Array.slice и массивом () .slice

Это могло бы быть слишком математически, но здесь является моей попыткой. (Я математик.)

, Если что-то - 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 .

Практически, вот некоторые хорошие примеры:

  • O (1): получение элемента от массива. Мы знаем точно, где это находится в памяти, таким образом, мы просто идем, получают его. Не имеет значения, если набор имеет 10 объектов или 10000; это все еще в индексе (говорят) 3, таким образом, мы просто переходим к местоположению 3 в памяти.
  • O ( n): получение элемента из связанного списка. Здесь, А = 0.5, потому что в среднем '' ll необходимо пройти 1/2 связанного списка перед нахождением элемента, который Вы ищете.
  • O ( <глоток> n 2 ): различные "немые" алгоритмы сортировки. Поскольку обычно их стратегия включает для каждого элемента ( n), Вы смотрите на все другие элементы (так времена другой n, давая <глоток> n 2 ), затем положение сами в правильном месте.
  • O ( журнал n ( n)): различные "умные" алгоритмы сортировки. Оказывается, что только необходимо посмотреть на, скажем, 10 элементов в 10 <глоток> 10 - набор элемента еще для интеллектуальной сортировки себя относительно [1 143] все в наборе. Поскольку все остальные также попытка посмотреть на 10 элементов, и поведение на стадии становления организуется просто право так, чтобы этого было достаточно для создания отсортированного списка.
  • O ( n!): алгоритм, который "пробует все", с тех пор существует (пропорционален) n! возможные комбинации [1 147] n элементы, которые могли бы решить данную проблему. Таким образом, это просто циклы через все такие комбинации, пробует их, затем останавливается каждый раз, когда это успешно выполняется.
27
задан juan 23 September 2008 в 13:50
поделиться

1 ответ

Как работает любой вызов slice.call () в приведенных примерах, если параметр контекста не предоставляется? Реализует ли slice собственный метод вызова, тем самым отменяя метод вызова JavaScript? Методы call и apply принимают в качестве первого параметра объект, определяющий объект контекста (this), применяемый к вызову.

1
ответ дан 28 November 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: