Możesz odwołać się do twierdzenia głównego o znalezieniu dużego O metod rekursywnych. Oto artykuł wikipedia: http://en.wikipedia.org/wiki/Master_theorem
Chcesz myśleć o rekurencyjnym problemie, takim jak drzewo. Następnie rozważ każdy poziom drzewa i ilość wymaganej pracy. Problemy z reguły mieszczą się w 3 kategoriach: root ciężki (pierwsza iteracja >> reszta drzewa), zrównoważony (każdy poziom ma równe ilości pracy), liść ciężki (ostatnia iteracja >> reszta drzewa).
Przeprowadzanie scalania sortowania jako przykład:
define mergeSort(list toSort):
if(length of toSort <= 1):
return toSort
list left = toSort from [0, length of toSort/2)
list right = toSort from [length of toSort/2, length of toSort)
merge(mergeSort(left), mergeSort(right))
Można zobaczyć, że każde wezwanie mergesort z kolei wywołuje 2 więcej mergeSorts 1/2 pierwotnej długości. Wiemy, że procedura scalania będzie wymagała czasu proporcjonalnego do liczby scalanych wartości.
Relacja rekurencyjna to wtedy T (n) = 2 * T (n/2) + O (n). Te dwa elementy pochodzą z 2 połączeń, a n/2 pochodzi z każdego połączenia mającego tylko połowę liczby elementów. Jednak na każdym poziomie znajduje się ta sama liczba elementów, które muszą zostać połączone, więc stała praca na każdym poziomie to O (n).
Wiemy, że praca jest równomiernie rozłożona (O (n) na każdej głębokości), a drzewo jest log_2 (n) głębokie, więc dużym O funkcji rekursywnej jest O (n * log (n)).
To naprawdę ma niewiele wspólnego z rekurencją i wszystkim, co ma związek z dużą notacją O. Jeśli możesz zapisać go rekurencyjnie, możesz go zapisać iteracyjnie – MStodd
@MStodd Niekoniecznie. Spróbuj iteracyjnie przetasować drzewo binarne. – Drise
@Drise Potrzebujesz stosu, ale jest to możliwe. Rekursja po prostu ukrywa stos wewnątrz stosu wywołań. –