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

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)
6

O(nlogn)kO(n)O(n)O(n)

Юваль Фильмус
источник
5

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

vonbrand
источник
3

Как правило, алгоритмы «разделяй и властвуй» приведут к сложности O (N log N).

Брент Хроник
источник
-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)
Николас Миари