Каковы характеристики


19

Иногда легко определить временную сложность алгоритма, если внимательно его изучить. Алгоритмы с двумя вложенными циклами , очевидно, N 2 . Алгоритмы , которые исследуют все возможные комбинации N групп из двух значений, очевидно , 2 N .NN2N2N

Однако я не знаю, как «определить» алгоритм со сложностью . Например, рекурсивная реализация сортировки слиянием - одна. Каковы общие характеристики или другая слияние thetas ; ( N журнал N ) алгоритмы , которые дали бы мне ключ , если я анализировал один?Θ(NlogN)Θ(NlogN)

Я уверен, что существует более одного способа, с помощью которых алгоритм может иметь сложность , поэтому любые ответы приветствуются. Кстати, я ищу общие характеристики и советы, а не строгие доказательства.Θ(NlogN)


6
означает дерево. O(logn)
Pratik Deoghare


2
@PratikDeoghare: не обязательно.
Рафаэль

3
@ Рафаэль Я имел в виду в основном! :)
Pratik Deoghare

Ответы:


17

Ваш архетипический - это алгоритм « разделяй и властвуй» , который делит (и рекомбинирует) работу за линейное время и повторяет ее по частям. Сортировка слиянием работает следующим образом: тратьте O ( n ) времени, разбивая входные данные на две примерно равные части, рекурсивно сортируйте каждый фрагмент и тратите Θ ( n ) времени на объединение двух отсортированных половин.Θ(nlogn)O(n)Θ(n)

Интуитивно, продолжая идею «разделяй и властвуй», каждый этап деления занимает в целом линейное время, потому что увеличение количества частей, подлежащих разделению, точно соответствует уменьшению размера частей, поскольку время, затрачиваемое на деление, является линейным. Общее время выполнения - это произведение общей стоимости этапа деления, умноженное на количество этапов деления. Поскольку размер кусков уменьшается вдвое, есть этапов деления, поэтому общее время выполнения составляет n log ( n ) . (До мультипликативной константы основание логарифма не имеет значения.)log2(n)nlog(n)

Подставляя его в уравнения (), один из способов оценки времени работы такого алгоритма состоит в том, чтобы выразить его рекурсивно: T ( n ) = 2 T ( n / 2 ) + Θ ( n ) . Понятно, что этот алгоритм занимает больше, чем линейное время, и мы можем увидеть, насколько больше, разделив на n : T ( n )T(n)T(n)=2T(n/2)+Θ(n)n Когдаnудваивается,T(n)/nувеличивается на постоянную величину:T(n)/nувеличивается логарифмически, или, другими словами,T(n)=Θ(nlogn).

T(n)n=T(n/2)n/2+Θ(1)
nT(n)/nT(n)/nT(n)=Θ(nlogn)

Это пример более общего паттерна: основная теорема . Для любого рекурсивного алгоритма , который делит его ввод размера в течение кусков размера п / б и занимает время п ( п ) для выполнения разделения и рекомбинации, время работы удовлетворяет условие Т ( п ) = а Т ( п / б ) + f ( n ) . Это приводит к закрытой форме, которая зависит от значений a и b и формыnan/bf(n)T(n)=aT(n/b)+f(n)ab . Если a = b и f ( n ) = Θ ( n ) , основная теорема утверждает, что T ( n ) = Θ ( n log n ) .fa=bf(n)=Θ(n)T(n)=Θ(nlogn)


1
Подводя итог: алгоритмы, которые устраняют постоянные доли пространства поиска за один раз, будут иметь логарифмические термины. Другие факторы зависят от того, сколько времени потребуется, чтобы отыграться.
Рафаэль

1
пример: средний случай быстрой сортировки O(nlogn)
vzn

11

Две другие категории алгоритмов, которые занимают времени:Θ(nlogn)

Алгоритмы, в которых каждый элемент обрабатывается по очереди, и для обработки каждого элемента требуется логарифмическое время (например, HeapSort или многие из алгоритмов вычислительной геометрии развертки плоскости).

Алгоритмы, в которых во время выполнения преобладает этап предварительной обработки сортировки. (Например, в алгоритме Крускала для минимального остовного дерева мы можем отсортировать ребра по весу в качестве первого шага).


Проголосовал за первый абзац. Второе кажется избыточным, поскольку известные нам алгоритмы линейной сортировки либо разделяют, либо завоевывают, либо heapsort. Примером для первой категории является поиск объектов в двоичном дереве поиска (или отсортированном массиве) размера n ; на более абстрактном уровне это также можно рассматривать как разделяй и властвуй. nn
Рафаэль

@ Рафаэль Я знаю, что сортировка избыточна с уже заданными категориями времени выполнения. Дело в том, что сортировка иногда является «узким местом», и алгоритмы, где на первый взгляд вопрос не о сортировке, могут все еще иметь время выполнения, потому что сортировка требуется.
Джо

9

Другая категория: Алгоритмы , в которых выходной сигнал имеет размер & , и , следовательно , Θ ( п войти п ) время работы является линейной в выходном размере .Θ(nlogn)Θ(nlogn)

Хотя в деталях таких алгоритмов часто используются методы «разделяй и властвуй», они не обязательно должны это делать. Время выполнения в основном зависит от задаваемого вопроса, и поэтому я думаю, что стоит упомянуть отдельно.

Это происходит в структурах данных, которые основаны на расширенном бинарном дереве поиска, где каждый узел хранит структуру данных линейного размера для поиска по листьям в поддереве этого узла. Такие структуры данных часто встречаются при поиске геометрического диапазона и часто основаны на схеме декомпозиции . Смотрите обзор Агарвала .

O(nlogn)O(logn)


θ(nlogn)


5

Это, как правило, алгоритмы типа «разделяй и властвуй», где затраты на деление и объединение подрешений не являются «слишком большими». Посмотрите этот FAQ, чтобы увидеть, какие виды рецидивов приводят к такому поведению.



-1

O(nlogn)

for (i = 0; i < constant; i++){
    for(j = 0; j < n; j++){
        // Do some O(1) stuff on the input
    }
}

// Alternative Variant:
for (i = 0; i < constant; i++){
    for(j = n; j < constant; j++){
        // Do some O(1) stuff on the input
    }
}

O(n2)

Я не могу привести конкретный пример алгоритма, который использует этот цикл, но он часто возникает при кодировании пользовательских алгоритмов.


O(nlogn)Θ(n)Θ(1)Θ(|n|)n

O(nlogn)

Кроме того, оригинальный вопрос не задал вопрос о биг-тэте.
Николас Миари

1
O(nlogn)O(22n)O(almost anything else)Θ(nlogn)O(nlogn)
Дэвид Ричерби,

O(nlogn)O(nlogn)O(nlogn)O(nlogn)
Николас Миари
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.