2010-10-11 15 views
9

Podczas odpowiadania na this question rozpoczęła się debata w komentarzach dotyczących złożoności QuickSort. Z czasów uniwersyteckich pamiętam, że QuickSort to w najgorszym przypadku: O(n^2), O(n log(n)) w przeciętnym przypadku i O(n log(n)) (ale z bardziej ograniczonym limitem) w najlepszym wypadku.Znaczenie średniej złożoności przy korzystaniu z notacji Big-O

Potrzebuję poprawnego matematycznego wyjaśnienia znaczenia average complexity, aby jasno wyjaśnić, co to jest dla kogoś, kto wierzy, że notacja big-O może być używana tylko w najgorszym przypadku.

Co pamiętam, jeśli w celu określenia średniej złożoności należy wziąć pod uwagę złożoność algorytmu dla wszystkich możliwych danych wejściowych, policzyć liczbę przypadków zwyrodniałych i normalnych. Jeśli liczba przypadków degeneracji podzielona przez n dąży do 0, gdy n staje się duża, możesz mówić o średniej złożoności ogólnej funkcji dla normalnych przypadków.

Czy ta definicja jest właściwa, czy też definicja przeciętnej złożoności jest inna? A jeśli to prawda, czy ktoś może to bardziej rygorystycznie niż ja?

+0

Jeśli chodzi o argument, myślę, że jeśli podajesz notację big-o dla czasu biegania i nie kwalifikujesz go, powinieneś mówić o najgorszym przypadku, po prostu dlatego, że mówisz, że czas jest ograniczony przez funkcję z podanym big-O. Jeśli czas jest ograniczony, oznacza to, że najgorszy możliwy czas jest ograniczony, z definicji "związany". Jeśli powiesz: "to jest przeciętny przypadek O (n log n)", to jest to dobrze zdefiniowane i oznacza to, co mówisz w tym pytaniu. –

+0

Może warto spróbować http://cstheory.stackexchange.com/ na pytanie –

+0

@Chris: chociaż najczęściej zadawane pytania na tej stronie mówią, że "typowe problemy z pracą domową w podręcznikach" są zbyt proste, i myślę, że to jest tak podstawowe jak że. –

Odpowiedz

4

Jeśli szukasz formalnej definicji, a następnie:

Średnia złożoność jest czas pracy expected dla wejścia losowej.

+0

cytat proszę. Artykuł Wiki nie ma bezpośredniego związku. – Unreason

+1

faktycznie znalazłem http://en.wikipedia.org/wiki/Average-case_complexity, +1 dla twojej odpowiedzi, wydaje się (jeśli wierzymy, wikipedia), że formalna definicja jest naprawdę na losowym wkładzie. – Unreason

+0

również w odniesieniu do koncepcji case vs test złożoności http://en.wikipedia.org/wiki/Best,_worst_and_average_case; a także wydaje się, że używasz terminu 'running time' dla funkcji ograniczającej. – Unreason

0

Średnia analiza case wykonuje następujące operacje:

Take wszystkich wejść o stałej długości (słownie n) Podsumowując wszystkie razy z rzędu wszystkich wystąpień tej długości i budowie średnią.

Problem polega na tym, że prawdopodobnie trzeba będzie wyliczyć wszystkie dane wejściowe o długości n, aby uzyskać średnią złożoność.

1

Myślę, że twoja definicja jest poprawna, ale twoje wnioski są błędne.

Niekoniecznie prawdą jest, że jeśli odsetek "złych" przypadków zmierza do 0, średnia złożoność jest równa złożoności "normalnych" przypadków.

Załóżmy na przykład, że przypadki 1/(n^2) są "złe", a pozostałe "normalne", a "złe" przypadki wykonują dokładnie (n^4) operacje, podczas gdy "normalne" przypadki mają dokładnie n operacji.

od średniej liczby operacji wymaganych jest równa:

(n^4/n^2) + n(n^2-1)/(n^2) 

Funkcja O (N^2), ale nie O (n).

W praktyce jednak może się okazać, że czas jest wielomianem we wszystkich przypadkach, a odsetek przypadków "złych" kurczy się wykładniczo. To wtedy zignorujesz złe przypadki przy obliczaniu średniej.

+0

OK, zgadzam się z tobą. Naprawdę robię dokładnie to, co sugerujesz, aby obliczyć złożoność średniej. To nawet rachunek, który umieściłem w komentarzach do połączonego pytania. Zbyt szybko mówiłem, że zachowujemy normalny przypadek, co oczywiście nie zawsze jest prawdą i zależy od złożoności degenerujących się przypadków. Mówi się tak jak ja, zły przypadek może nawet trwać wiecznie i program nigdy się nie skończy i to zdecydowanie nie jest dobre dla przeciętnego. – kriss

+0

@kriss: tak, przypadek braku zatrzymania jest prostszym przykładem niż mój, chociaż wtedy nie jest to technicznie "algorytm", który analizujesz. –

8

Masz rację.

Big O (duży Theta itp.) Służy do mierzenia funkcji. Kiedy piszesz f = O (g), nie ma znaczenia, co oznacza f i g. Mogą być średnia złożoność czas, najgorszy czas złożoności, złożoność przestrzeni oznaczają rozkład liczb pierwszych itp

Najgorszy przypadek złożoność to funkcja, która bierze rozmiarze n, i mówi, co jest maksymalna liczba kroków algorytmu dane wejście o rozmiarze n.

Złożoność średniej wielkości to funkcja, która przyjmuje rozmiar n, i informuje, jaka jest oczekiwana liczba kroków algorytmu danych wejściowych o rozmiarze n.

Jak widać najgorsza i największa złożoność to funkcje, więc możesz użyć dużej litery O, aby wyrazić swój wzrost.

+0

Nie jest dobrze napisać f = O (g), jeśli jesteśmy pedantyczni. Big O jest zbiorem, więc powinniśmy napisać f \ in O (g) – jhclark

+0

@jhclark: Jest to bardzo dobry zwyczaj pisania = gdy używamy wielkiej litery O, zobacz http://en.wikipedia.org/wiki/Asymptotic_notation#Equals_sign lub Matematyka betonu w notacji asymptotycznej. W rzeczywistości nigdy nie widziałem żadnego podręcznika, który używa \ in, z wyjątkiem wskazania tej osobliwości. – sdcvvc

+0

Uzgodniono, że jest to zwyczajowe - jestem pedantyczny. Jednakże, jak mówi wikipedia, wiele osób uważa, że ​​"f = O (g) jest nadużyciem notacji, ponieważ czysta matematyka zazwyczaj definiuje = wskazywać na dwukierunkową równość." Jestem zdecydowanie w obozie, który uważa, że ​​to użycie = raczej odrażające – jhclark

0

Niech odnoszą Big O Notation in Wikipedia:

Niech f i g są dwie funkcje zdefiniowane na pewnym podzbiorze liczb rzeczywistych. Jeden pisze f(x)=O(g(x)) as x --> infinity jeśli ...

Więc co przesłanką stanach definicji jest to, że funkcja f należy podjąć szereg jako wejście i dają szereg jako wyjście. O jakim numerze wejściowym mówimy? Przypuszczalnie jest to szereg elementów w kolejności do posortowania. O jakiej liczbie wyjściowej możemy mówić? Może to być liczba operacji wykonywanych w celu uporządkowania sekwencji. Ale przestań. Co to jest funkcja? Function in Wikipedia:

funkcją jest relacja między zestawem wejść i wyjść zestawu dopuszczalnych z własności, że każde wejście jest związane z dokładnie jeden wyjściowego.

Czy jesteśmy produkujących exacly jeden wyjście z naszej wcześniejszej defition? Nie, nie robimy tego. Dla danego rozmiaru sekwencji możemy uzyskać dużą różnorodność liczby operacji. Aby zapewnić, że definicja dotyczy naszego przypadku, musimy zredukować zestaw możliwych wyników (liczbę operacji) do pojedynczej wartości. Może to być maksimum ("najgorszy przypadek"), minimum ("najlepszy przypadek") lub średnia.

Wniosek jest taki, że mówienie o najlepszym/najgorszym/przeciętnym przypadku jest poprawne matematycznie i użycie dużej notacji O bez tych w kontekście sortowania złożoności jest nieco niedbałe.

Z drugiej strony, możemy być bardziej precyzyjni i używać dużej notacji Theta zamiast wielkiej notacji O.

+0

Paragraf, który wskazałeś jako błędny, stwierdza tylko, że możemy obliczyć granicę średniej w kierunku nieskończoności, stosując rozwinięcie Taylora i ignorując nieistotne terminy. Oczywiście, średnia wartość jest dotknięta i wskazuję konkretny przypadek, gdy przypadek zwyrodnienia jest * nieistotny * Oczywiście nie zawsze tak jest, innymi słowy, oczywiście średnia wartość jest zawsze definiowalna, ale to niewiele pomaga, gdy chcemy, aby to nie było * definiowanie * to, ale * obliczanie * to. – kriss

+0

@kriss, po prostu nie wiem 't understand ", wtedy możesz mówić o średniej złożoności ogólnej funkcji dla normalnych przypadków." – Alexey

+0

OK, powinienem zmienić sformułowanie.I mam na myśli ignorowanie terminu zmierzającego w kierunku zera (wyjątkowe przypadki) i na zachowaj termin "normalny przypadek". – kriss