Мое любимое повторение проявляется в чувствительных к выходу алгоритмах для вычисления выпуклых оболочек, сначала Киркпатрика и Зайделя , но позже повторенных другими. Обозначим через время вычисления выпуклой оболочки из n точек на плоскости, когда выпуклая оболочка имеет h вершин. (Значение h заранее неизвестно, кроме тривиальной границы h ≤ n .) Алгоритм Киркпатрика и Зайделя дает рекуррентность
T ( n , h ) = { O ( n ), если T(n,h)nhhh≤n
гдеn1,n2≤3n/4иn1+n2=nиh1+h2=h.
T(n,h)={O(n)T(n1,h1)+T(n2,h2)+O(n)if n≤3 or h≤3otherwise
n1,n2≤3n/4n1+n2=nh1+h2=h
Решение . Это немного удивительно, поскольку h не является параметром, делимым равномерно. Но на самом деле, наихудший случай рецидива случается, когда h 1 и h 2 равны h / 2 ; если каким-то волшебным образом h 1 всегда постоянен, решение будет T ( n , h ) = O ( n ) .T(n,h)=O(nlogh)hh1h2h/2h1T(n,h)=O(n)
Я использовал вариант этого повторения в одной из моих первых работ по вычислительной топологии :
где
T( н , г) = { O ( n )T( н1, г1) + T( н2, г2) + O ( мин { п1, н2} )если n ≤ 3 или г= 0в противном случае
и
g 1 + g 2 = g . Опять же, решением является
O ( n log g ) , и
наихудшийслучай возникает, когда
n и
g всегда делятся равномерно.
n1+n2=ng1+g2=gO(nlogg)ng