@topik92 dowód może być analityczny i opierać się będzie o takie magiczne pojęcie jak logarytm. Bo właśnie logarytm potrafi powiedzieć ci ile tych mniejszych czynników będziesz miał.
Załóżmy przypadek prosty kiedy wszystko jest potęgą 2, żeby się ładnie liczyło:
a64 = a32 * a32
a32 = a16 * a16
a16 = a8 * a8
a8 = a4 * a4
a4 = a2 * a2
a2 = a * a
Więc do policzenia mamy: a2, a4, a8, a16 i a32 czyli 5 wyrazów podczas gdy log2(64) = 6
Nie jest to przypadek ;)
W przypadku ogólnym dla każdego czynnika możemy wykonać 1 lub 2 mnożenia, zależnie od tego czy był podzielny przez 2 nie. Jeśli wszystkie są podzielne to liczba potrzebnych mnożeń wyniesie po prostu log2(exponenta)-1
, jeśli mamy przypadek pesymistyczny to na każdym poziomie będą potrzebne 2 mnożenia, czyli w sumie 2*(ceil(log2(exponenta))-1)
. Czy faktycznie tak jest? Weźmy na przykład a63 i rozpiszmy tak jak poprzednio:
a63 = a31 * a31 * a
a31 = a15 * a15 * a
a15 = a7 * a7 * a
a7 = a3 * a3 * a
a3 = a * a * a
Jak widać mamy tutaj 5*2 = 10 mnożeń, podczas gdy log2(63) = 5.97 i jednocześnie ceil(5.97) = 6 więc 2*(ceil(log2(exponenta))-1) = 2*(6-1) = 10
Średnio dla losowej liczby będziemy potrzebowali w połowie przypadków 2 mnożeń i w połowie 1 mnożenia, więc średnio *1.5
ale jeśli interesuje nas tylko rząd zlożoności to mamy po prostu O(log(exponenta)).
Co się zmieni jeśli zmienimy dzielnik z 2 na 3? Zmieni sie podstawa logarytmu oraz liczba mnożeń potrzebnych w jednej rundzie - tym razem będą potrzebne 2 lub 3 mnożenia. Optymistycznie będzie więc (log3(exponenta)-1)*2
a pesymistycznie (log3(exponenta)-1)*3
, a średnio oczywiście *2.5
i jednocześnie rząd złożoności to O(log3(exponenta)).
Pytanie więc czy (dla przypadku średniego) funkcja (log2(n)-1)*1.5
rośnie szybciej czy wolniej od (log3(n)-1)*2.5
. Polecam czytelnikowi przeprowadzić analizę obu tych funkcji w celu ustalenia stanu faktycznego, podpowiem jednak że wynikiem powinien być wniosek, że dla odpowiednio dużych n
funkcja z 3
rośnie szybciej.