Dostałem zadanie domowe z Big O. Utknąłem z zagnieżdżonymi pętlami zależnymi od poprzedniej pętli. Oto zmieniona wersja mojego pytania do pracy domowej, ponieważ naprawdę chcę to zrozumieć:
sum = 0;
for (i = 0; i < n; i++
for (j = 0; j < i; j++)
sum++;
Część, która mnie wyrzuca, to j < i
część. Wygląda na to, że działałby prawie jak silnia, ale z dodatkiem. Wszelkie wskazówki będą mile widziane.
Odpowiedzi:
Pozwólcie, że wyjaśnię kilka rzeczy, interesuje was notacja big-O - oznacza to górną granicę . Innymi słowy, można liczyć więcej kroków niż faktycznie. W szczególności możesz zmodyfikować algorytm do
Tak więc dwa zagnieżdżonej pętli, z których każdy działa w pętlin razy, co daje górna granica w O(n2)
Oczywiście chciałbyś mieć dobre oszacowanie górnej granicy. Aby zakończyć, chcemy ustalić dolną granicę. Oznacza to, że można liczyć mniej kroków. Rozważ więc modyfikację
Tutaj wykonujemy tylko niektóre z iteracji pętli. Ponownie mamy dwie zagnieżdżone pętle, ale tym razem mamy iteracji na pętlę, co pokazuje, że mamy co najmniej dodatków. W tym przypadku oznaczamy tę asymptotyczną dolną granicę . Ponieważ dolna i górna granica pokrywają się, możemy nawet powiedzieć, że jest ciasną asymptotyczną granicą i piszemy .n/2 n2/4 Ω(n2) n2 Θ(n2)
Jeśli chcesz dowiedzieć się więcej, przeczytaj tutaj .
źródło
Prześledźmy to:
0<0 == false
).Ten algorytm zwiększy zatem
sum
następującą liczbę razy:Po inspekcji możemy zobaczyć, że suma jest „liczbą trójkątną”. Rozprowadzanie do końca licznika, otrzymujemy , przy czym najszybciej rośnie czas jest stąd Bachman, Landau, Big-theta złożoność .n n2−n2 n2 θ(n2)≡O(n2) and Ω(n2)
źródło
zobaczmy, czy mogę to wyjaśnić ...
Więc jeśli wewnętrzna pętla to j
Teraz, dla pierwszej iteracji, wykonujesz n- (n-1) razy przez wewnętrzną pętlę. za drugim razem wykonasz n- (n-2) razy przez wewnętrzną pętlę. W N-tym czasie robisz n- (nn) razy, czyli n razy.
jeśli uśrednisz ile razy przejdziesz przez wewnętrzną pętlę, n / 2 razy.
Można więc powiedzieć, że to O (n * n / 2) = O (n ^ 2/2) = O (n ^ 2)
Czy to ma sens?
źródło
j < i
część rzeczywiście byłaj < i^2
, to wynikowe O dla tej części wynosiłoby n ^ 2/2?