Co oznacza szybszy algorytm w informatyce teoretycznej?


18

Jeśli istnieje algorytm działający w czasie O(f(n)) dla jakiegoś problemu A, a ktoś wymyśli algorytm działający w czasie, , gdzie , czy uważa się to za ulepszenie w stosunku do poprzedniego algorytmu?O(f(n)/g(n))g(n)=o(f(n))

Czy ma sens, w kontekście informatyki teoretycznej, wymyślić taki algorytm?


4
Przez „szybszy algorytm” rozumiemy „asymptotycznie szybszy algorytm”.
Yuval Filmus,

@YuvalFilmus, co masz na myśli przez „asymptotycznie”
niezdefiniowany

1
Bieg w czasie o(fa(n)) .
Yuval Filmus,

Odpowiedzi:


26

Nie, algorytm działający w czasie O(f(n)/g(n)) , gdzie g(n)=o(f(n)) , niekoniecznie jest uważany za poprawę. Na przykład załóżmy, że f(n)=n i g(n)=1/n . Następnie oznacza gorsze ograniczenie czasowe niż O ( f ( n ) ) = O ( n ) .O(f(n)/g(n))=O(n2)O(f(n))=O(n)

Aby ulepszyć algorytm działający w czasie , musisz opracować algorytm działający w czasie o ( f ( n ) ) , to znaczy w czasie g ( n ) dla niektórych funkcji g ( n ) = o ( f ( n ) ) .f(n)o(f(n))g(n)g(n)=o(f(n))

Jeśli wszystko, co wiesz, to że algorytm działa w czasie , nie jest jasne, czy algorytm działający w czasie O ( g ( n ) ) jest poprawą, niezależnie od f ( n ) , g ( n ) są. Wynika to z faktu, że duże O stanowi jedynie górną granicę czasu działania. Zamiast tego często bierze się pod uwagę złożoność najgorszego przypadku i szacuje się ją jako dużą Θ, a nie dużąO(f(n))O(g(n))f(n),g(n)Θ .O


21
Lepiej byłoby wziąć w pierwszym akapicie. Korzystanie z funkcji zmniejszania wydaje się nieco oszukiwać. sol(n)=1
David Richerby

1
@DavidRicherby: Może trochę, ale OP nigdy nie powiedział, że mieli algorytm działający w więc nie można zakładać monotoniczności. O(g(n))
Kevin,

7
@Kevin Pewnie, ale kontekstem jest informatyka, a w informatyce notacja wielkiej litery O jest zwykle używana do funkcji nie zmniejszających się. Prawdopodobnie pytający tak myślał.
David Richerby,

11

Pamiętaj, że Notacja jest przeznaczona do analizy, w jaki sposób zadanie rośnie o różnej wielkości wejściowych, a konkretnie pomija czynniki multyplikatywnych, niższego rzędu okresie, a stałe.O(...)

Załóżmy, że masz algorytm , którego rzeczywisty czas działania wynosi 1 n 2 + 2 n + 1 (zakładając, że możesz liczyć instrukcje i znać dokładne czasy itd., Co jest oczywiście dużym założeniem we współczesnych systemach). Załóżmy, że opracowałeś nowy algorytm, którym jest O ( n ) , ale rzeczywisty czas działania wynosi 1000 n + 5000 . Załóżmy również, że wiesz, że oprogramowanie do korzystania z tego algorytmu nigdy nie zobaczy problemu o rozmiarze n >O(n2)1n2+2n+1O(n)1000n+5000 .n>10

A więc, który byś wybrał - algorytm , który zajmie 15 000 jednostek czasu, lub algorytm O ( n 2 ), który zajmie tylko 121 jednostek? Teraz, jeśli twoje oprogramowanie ewoluuje w zakresie rozwiązywania problemów o rozmiarach n > 100000 , który wybierzesz? Co byś zrobił, gdyby rozmiar problemu był bardzo różny?O(n)O(n2)n>100000


2
„nigdy nie widzę problemu o rozmiarze n> 10” - wtedy w ogóle nie
używalibyśmy

5
@AnoE Proste liczby ze względu na argument. Ta sama logika ma zastosowanie niezależnie od tego, czy analizujesz problem o rozmiarze 10 vs 1e5, czy analizujesz pod kątem 1e6 vs 1e9.
twalberg,

1
@AnoE Większość programów komputerowych nie próbuje poradzić sobie z nieskończenie rosnącym rozmiarem problemu. Więc nastąpi kompromis. Właśnie dlatego big-O jest przeznaczony dla informatyki teoretycznej , a koncepcje można zastosować do ulepszenia rzeczywistych programów.
mbomb007,

Dokładnie @ mbomb007. Tytuł pytania brzmi: „Co oznacza szybszy algorytm w teoretycznej informatyce?” i ma to w ciele: „Czy to ma sens w kontekście informatyki teoretycznej ...”.
AnoE,

@AnoE Z doświadczenia wynika, że ​​notacja O jest używana, gdy n <10 przez cały czas! Nie jest to dobry pomysł ... ale jest to całkowicie zrobione!
Cort Ammon - Przywróć Monikę

5

Zasadniczo oznacza to, że dla każdego rozmiaru wejściowego, który jest wystarczająco duży, najgorszy przypadek działania starego algorytmu jest wolniejszy niż nowego. Jest to równoważne z formalizmem , gdzie g jest złożonością czasową nowego algorytmu, zaś f złożonością czasową starego.g(n)o(f(n))gf

Czasami jednak informatykom zależy na przeciętnej wydajności. Klasycznym przykładem jest Quicksort: jego najgorszym czasem działania jest podczas gdy znamy inne, które działają w Θ ( n log n )Θ(n2)Θ(nlogn) , ale jest szeroko stosowane w praktyce ze względu na dobry średni czas działania. Można go dodatkowo dostosować, aby działał bardzo szybko w przypadkach najczęściej występujących na wolności, takich jak tablice, które są w większości we właściwej kolejności.

A czasami nawet teoretyczni informatycy używają „szybciej” w taki sam sposób, jak zwykli ludzie. Na przykład, większość implementacji klas String ma Optymalizację Krótkiego Ciągu (zwaną również Optymalizacją Małych Ciągów), mimo że przyspiesza to tylko dla krótkich ciągów i jest czystym narzutem dla dłuższych. Ponieważ rozmiar wejściowy staje się coraz większy, czas działania operacji String z SSO będzie dłuższy o mały stały okres, więc zgodnie z definicją podaną w pierwszym akapicie usunięcie SSO z klasy String powoduje, że „szybciej” . ”W praktyce jednak większość ciągów znaków jest niewielka, więc SSO sprawia, że ​​większość programów, które ich używają, jest szybsza, a większość profesorów informatyki wie, że lepiej się nie kręcić, domagając się, aby ludzie mówili tylko o rzędach asymptotycznej złożoności czasu.


1

Nie ma jednej ujednoliconej definicji „szybszego algorytmu”. Nie ma organu zarządzającego, który decydowałby, czy algorytm jest szybszy niż inny.

Aby wyjaśnić, dlaczego tak jest, chciałbym przedstawić dwa różne scenariusze, które pokazują tę mętną koncepcję.

Pierwszy przykład to algorytm, który wyszukuje połączoną listę nieuporządkowanych danych. Jeśli mogę wykonać tę samą operację z tablicą, nie mam wpływu na dużą miarę wydajności Oh. Oba wyszukiwania mają wartość O (n). Jeśli popatrzę tylko na duże wartości Oh, mogę powiedzieć, że wcale nie poprawiłem. Jednak wiadomo, że przeszukiwanie tablicy jest szybsze niż przeszukiwanie połączonej listy w większości przypadków, więc można zdecydować, że dzięki temu algorytm stał się „szybszy”, nawet jeśli duże Oh się nie zmieniło.

Jeśli mogę użyć tradycyjnego przykładu programowania robota do zrobienia kanapki PBJ, mogę pokazać, co mam na myśli w inny sposób. Rozważ tylko punkt, w którym otwiera się słoik masła orzechowego.

Pick up the jar
Grab the lid
Unscrew the lid

Przeciw

Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Grab the lid
Unscrew the lid

Nawet w najbardziej akademickim otoczeniu teoretycznym, jakie mogę wymyślić, przekonasz się, że ludzie akceptują to, że pierwszy algorytm jest szybszy niż drugi, nawet jeśli wyniki dużej notacji Oh są takie same.

Dla kontrastu możemy rozważyć algorytm do złamania szyfrowania RSA. Obecnie uważa się, że ten proces to prawdopodobnie O (2 ^ n), gdzie n jest liczbą bitów. Rozważ nowy algorytm, który działa n ^ 100 szybciej. Oznacza to, że mój nowy proces działa w O (2 ^ n / n ^ 100). Jednak w świecie kryptografii przyspieszenie wielomianowe algorytmu wykładniczego nie jest tradycyjnie uważane za przyspieszenie teoretyczne. Robiąc dowody bezpieczeństwa, zakłada się, że osoba atakująca może odkryć jedno z tych przyspieszeń i że nie przyniesie to żadnego efektu.

Tak więc w jednym przypadku możemy zmienić O (n) na O (n) i nazwać to szybciej. W innych okolicznościach możemy zmienić O (2 ^ n) na O (2 ^ n / n ^ 100) i twierdzić, że w ogóle nie było znaczącego przyspieszenia. Dlatego mówię, że nie ma jednej ujednoliconej definicji „szybszego algorytmu”. Jest to zawsze zależne od kontekstu.


1

ZA(n)O(fa(n))

 0dofa< lim supnZA(n)fa(n)=dofa

sol(n)lim supnsol(n)=h(n)=fa(n)sol(n) .

ZA(n)O(h(n))ZA(n)O(h(n))

 0doh< lim supnZA(n)h(n)=doh

Korzystając z reguł limitów, możemy również napisać:

doh=lim supnZA(n)h(n)=lim supnZA(n)sol(n)fa(n)=dofalim supnsol(n)

doh<dofa=0

dofa0ZA(n)O(h(n)) .

ZA(n)ZA(n)ZA(n)Θ(fa(n))sol(n) jest arbitralnie wzrasta.

ZA(n)O(fa(n))ZA(n)ZA(n)O(h(n))


1
Twój limit powinien być wyższy niż limit.
Yuval Filmus,

1
@YuvalFilmus Zaktualizowano
Jared Goguen,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.