Ваш архетипический - это алгоритм « разделяй и властвуй» , который делит (и рекомбинирует) работу за линейное время и повторяет ее по частям. Сортировка слиянием работает следующим образом: тратьте O ( n ) времени, разбивая входные данные на две примерно равные части, рекурсивно сортируйте каждый фрагмент и тратите Θ ( n ) времени на объединение двух отсортированных половин.Θ ( п журналн )O ( n )Θ ( н )
Интуитивно, продолжая идею «разделяй и властвуй», каждый этап деления занимает в целом линейное время, потому что увеличение количества частей, подлежащих разделению, точно соответствует уменьшению размера частей, поскольку время, затрачиваемое на деление, является линейным. Общее время выполнения - это произведение общей стоимости этапа деления, умноженное на количество этапов деления. Поскольку размер кусков уменьшается вдвое, есть этапов деления, поэтому общее время выполнения составляет n ⋅ log ( n ) . (До мультипликативной константы основание логарифма не имеет значения.)журнал2( н )n ⋅ log( н )
Подставляя его в уравнения (), один из способов оценки времени работы такого алгоритма состоит в том, чтобы выразить его рекурсивно: T ( n ) = 2 T ( n / 2 ) + Θ ( n ) . Понятно, что этот алгоритм занимает больше, чем линейное время, и мы можем увидеть, насколько больше, разделив на n :
T ( n )T( н )T( n ) = 2 Тл( n / 2 ) + Θ ( n )N
Когдаnудваивается,T(n)/nувеличивается на постоянную величину:T(n)/nувеличивается логарифмически, или, другими словами,T(n)=Θ(nlogn).
T( н )N= Т( н / 2 )н / 2+ Θ ( 1 )
NT( n ) / nT( n ) / nT(n)=Θ(nlogn)
Это пример более общего паттерна: основная теорема . Для любого рекурсивного алгоритма , который делит его ввод размера в течение кусков размера п / б и занимает время п ( п ) для выполнения разделения и рекомбинации, время работы удовлетворяет условие Т ( п ) = а ⋅ Т ( п / б ) + f ( n ) . Это приводит к закрытой форме, которая зависит от значений a и b и формыnan/bf(n)T(n)=a⋅T(n/b)+f(n)ab . Если a = b и f ( n ) = Θ ( n ) , основная теорема утверждает, что T ( n ) = Θ ( n log n ) .fa=bf(n)=Θ(n)T(n)=Θ(nlogn)