[Powered by Google Translate] Prawdopodobnie słyszeliście ludzie mówią o algorytmu szybkiego lub wydajny
za wykonanie swoją szczególną zadanie,
Ale co to dokładnie zgadza się z to oznaczać, dla algorytmu, aby być szybko lub wydajny?
Cóż, to nie mówi o pomiaru w czasie rzeczywistym,
jak sekundy lub minuty.
Jest to, ponieważ sprzęt komputerowy
i oprogramowanie różnią się w zależności drastycznie.
Mój program może działać wolniej niż twój,
, bo jestem uruchomienie go na starszym komputerze,
lub dlatego, I się zdarzyć, które mają być grając w w trybie online grę wideo
w tym samym czasie,, które jest wyginanie całości mojej pamięci,
lub też mogłoby I być uruchomiony mój program za pośrednictwem różnego oprogramowania
, które komunikuje się z na maszyny w różny sposób się na niskim poziomie.
To jest jak porównując jabłek i pomarańczy.
Po prostu, ponieważ mój wolniejsze komputer trwa dłużej,
niż twoje, aby dać z powrotem odpowiedź,
, nie oznacza, Państwo mają do bardziej wydajnej algorytmu.
>> Tak więc, skoro nie możemy bezpośrednio porównać ich czasy autonomii programów
w sekundach lub minuta,
jak mamy porównaj 2 różne algorytmy,
niezależnie od ich sprzętu lub środowiska oprogramowania?
Aby utworzyć bardziej jednolitego sposób mierzenia algorytmiczny efektywność,
naukowcy komputerowe i matematycy, pozwoliły opracować
koncepcje do pomiaru asymptotyczną złożoność z w programu
i notacja nazywa się 'Big Ohnotation'
dla opisywania to.
Formalna definicja jest to, że funkcja f (x)
jest uruchamiany na Postanowieniem z dnia g (x)
, jeśli istnieje nawet pewien (x) wartość, x ₀ i
niektóre stała, C,, dla których
f (x) jest mniej niż lub równa, aby
, że stała czasy w g (x)
dla wszystkich x większej niż x ₀.
>> Ale nie daj się przestraszony od hotelu przez formalnego definicji.
Co oznacza ten właściwie znaczy w mniej kategoriach teoretycznych?
Cóż, jest to w zasadzie sposobem of analizując
jak szybko programu uruchomieniowa rośnie asymptotycznie.
, Że jest, jak rozmiar z twoich wejściami rośnie w kierunku nieskończoności,
słownie, jesteś sortowaniu tablicę wielkości, 1000 w porównaniu do tablicy wielkości, 10.
Jak zgadza się z uruchomieniowa of Twojego programu rosnąć?
Na przykład, wyobraź sobie, liczenie samym liczbę znaków,
w ciągu znaków Najprostszym sposobem
w trakcie spaceru przez na całego łańcucha znaków
letter-przez-letter i dodając 1 do licznika dla każdego znaku.
Algorytm ten powiedział do uruchomienia w czasie liniowym
się z w odniesieniu do liczby z znaków,
'N' w ciągu.
W skrócie, to działa w czasie O (n).
Dlaczego tak jest?
Well, przy użyciu to podejście, czas wymagany
przemierzać cały ciąg
jest proporcjonalne do liczby znaków.
Zliczanie znaków w 20-ciąg znaków
jest dzieje do podjęcia dwa razy na tak długo,, jak to ma
, aby policzyć znaków w 10-znakowym ciąg znaków,
, ponieważ masz aby spojrzeć na wszystkich znaków
i każdy znak przyjmuje taką samą ilość czasu, aby przyjrzeć.
Jak zwiększyć liczbę znaków, z,
czas pracy zwiększy się liniowo wraz z długością wejściowego.
>> Teraz, sobie wyobrazić, jeśli Ci się zdecydować, że liniową czas,
O (n), po prostu nie było wystarczająco szybki, dla ciebie?
Może jesteś przechowywania ogromne ciągi znaków,
i nie możesz sobie pozwolić na dodatkowy czas, jaki byłby potrzebny
przechodzenie wszystkich swoich znaków licząc jeden po drugim.
Więc, ty zdecydować się na spróbować czegoś innego.
Co, jeżeli zechciałby Pan się zdarzyć do już przechowuj liczbę znaków, z
w ciąg, powiedzmy, w zmiennej o o nazwie 'len,'
wcześnie na w programie,
, zanim nawet przechowywane na bardzo 1-gi znak w Twojego ciąg?
Potem, wszystko trzeba było zrobić, aby dowiedzieć się długość ciągu,
, to sprawdzić, to, co wartość zmiennej jest.
You nie będzie musiał, aby spojrzeć na sam ciąg na wszystkich,
i dostęp do wartości zmiennej jak len jest uważane
asymptotically stała operacja czas,
lub O (1).
Dlaczego tak jest? Well, pamiętaj, co asymptotyczna złożoność oznacza.
Jak działa uruchomieniowa zmiana jako rozmiar
Of Your Wejścia rośnie?
>> Say Ci się były próby, aby uzyskać liczbę znaków, z, w ramach większego ciąg znaków.
Cóż, to nie miałoby znaczenia, jak duży Ci dokonać ciąg znaków,
nawet milionów znaków długa,
wszystko trzeba było zrobić, aby znaleźć wartość ciągu długości z tego podejścia,
jest odczytać wartość zmiennej len,
, które masz już wykonane.
Długość wejście, to jest długość ciągu próbujesz znaleźć,
, nie wpływa w ogóle, jak szybko Twój program biegnie.
Ta część Twojego programu byłoby uruchamiane równie szybkie na zasadzie jeden-znakowym łańcucha znaków
i tysiąc-character string,
i dlatego ten program będzie dalej działa w czasie stałym
w odniesieniu do na wielkości wejściowego.
>> Of Oczywiście, istnieje znajduje się wadą.
Państwo spędzić dodatkową przestrzeń pamięci, na Twoim komputerze
Przechowując zmienną,
i dodatkowy czas potrzebny
do faktycznego przechowywania zmiennej
ale punkt wciąż stoi,
dowiedzieć się, jak długo Twój ciąg był
, nie zależy od na długości z ciągu znaków, od wszystkie.
Tak więc, że działa on w O (1) lub Stała czasowa.
To z pewnością nie zgadza się z musi oznaczać
, że Twój kod jest uruchamiany w 1 kroku,
ale nie ma znaczenia, ile kroków jest,
jeśli nie zmienia się wielkości wejściowych,
to wciąż asymptotycznie stałą, która reprezentujemy jako O (1).
>> Jak można prawdopodobnie guess,
istnieje wiele różnych Big O czasy autonomii do mierzenia algorytmy, z.
O (n) ² algorytmy są asymptotycznie wolniej niż O (n) algorytmów.
, Że jest, w miarę jak liczba się z elementów (n) rośnie,
ostatecznie O (n) ² algorytmów będzie zająć więcej czasu,
niż O (n) algorytmy do uruchomienia.
To nie znaczy, O (n) algorytmy zawsze uruchamiane szybciej
niż O (N) ² algorytmów, nawet w tym samym środowiska naturalnego,
na tym samym Komputery.
Może dla małych rozmiarach wejściowych,
O (n) ² algorytm może faktycznie pracować szybciej,
, ale, w końcu,, jak na wielkości wejściowego zwiększa
w kierunku nieskończoności, O (n) algorytm ² jego uruchomieniowa
będzie ostatecznie przyćmi środowisko wykonawcze prac rady (n) O algorytmu.
Tak jak każdy funkcji kwadratowej matematycznej
będzie ostatecznie wyprzedzić jakąkolwiek liniową funkcję,
nie ważne jak dużo się z głowicy rozpocząć liniową funkcję rozpoczyna się off z.
Jeśli jesteś pracy z dużymi ilości danych,
algorytmy, które są uruchamiane w O (n) Czas ² może naprawdę skończyć się spowalniając Twój program,
ale dla małych rozmiarach wejściowych,
Ci się prawdopodobnie nie będzie nawet zauważy.
>> Another asymptotyczna złożoność jest,
logarytmiczna czas, O (log n).
Przykładem algorytmu, który działa to szybko
jest klasyczny algorytm wyszukiwania binarnego,
do znalezienia elementu w już posortowanej listy elementów.
>> Jeśli nie wiesz, co wyszukiwanie binarne nie,
Wytłumaczę to dla Ciebie bardzo szybko.
Powiedzmy, że szukasz numeru 3
w tej tablicy liczb całkowitych.
Wygląda na środkowym elemencie tablicy
i pyta: "Czy element chcę większa, równa lub mniejsza niż to?"
Jeśli jest równe, to świetnie. Znalazłeś element i gotowe.
Jeśli jest większa, to wiesz, element
musi być w prawej stronie tablicy
i można tylko patrzeć na to w przyszłości,
i jeśli jest mniejsza, to wiesz, że musi być z lewej strony.
Proces ten jest powtarzany przy mniejszym rozmiarze tablicy
aż poprawna element jest znaleziony.
>> Ten potężny algorytm skraca rozmiar tablicy na pół z każdej operacji.
Tak więc, aby znaleźć element w posortowanej tablicy o wielkości 8,
co najwyżej (log ₂ 8),
lub 3 z tych operacji,
sprawdzając środkowy element, a następnie cięcie tablicy w pół będzie wymagane,
podczas gdy tablica ma rozmiar 16 (log ₂ 16),
lub 4 operacje.
To tylko 1 więcej operacji o podwojeniu wielkości tablicy.
Podwojenie rozmiaru tablicy
zwiększa czas pracy tylko o 1 kawałek kodu.
Ponownie, sprawdzając środkowy element z listy, a następnie pęka.
Tak więc, jest to że działanie w logarytmicznej czasu
O (log n).
Ale poczekaj, można powiedzieć,
nie zależy od tego, gdzie na liście Element szukasz jest?
Co jeśli pierwszy element spojrzeć na dzieje się właściwa?
Wtedy, to zajmuje tylko 1 operację,
bez względu na to, jak duża lista.
>> Cóż, dlatego informatycy mają więcej warunków
do asymptotycznej złożoności które odzwierciedlają najlepszą sprawę
i najgorszy występy algorytmu.
Bardziej poprawnie, górne i dolne granice
na starcie.
W najlepszym przypadku dla wyszukiwania binarnego, nasz element jest
tam w środku,
i masz go w stałym czasie,
niezależnie od tego jak duża reszta tablicy jest.
Używa się do tego symbolu jest Ω.
Tak więc, ten algorytm jest powiedziane do uruchomienia w Ω (1).
W najlepszym przypadku, stwierdzi element szybko,
bez względu na to, jak duża jest tablica,
a w najgorszym przypadku,
ma do wykonania (log n) kontrole międzyczasy
macierzy znaleźć odpowiedni element.
Najgorszy górne granice są określone z wielkim "O", które już znasz.
Tak, to O (log n), ale Ω (1).
>> Linear search, natomiast
w którym można przejść przez każdego elementu tablicy
, aby znaleźć taki, który chcesz,
jest w najlepszym Ω (1).
Ponownie, pierwszy element chcesz.
Tak, to nie ma znaczenia, jak duża tablica jest.
W najgorszym przypadku, to ostatni element w tablicy.
Więc, musisz chodzić po wszystkich n elementów w tablicy, aby znaleźć to,
jak jeśli szukaliśmy 3.
Tak, to działa w O (n) czasu
, ponieważ jest proporcjonalna do ilości elementów w tablicy.
>> Jeden używany symbol Θ.
Może to być wykorzystane do opisania algorytmów gdzie najlepszym i najgorszym przypadku
są takie same.
Jest to przypadek w ciągu długości algorytmów rozmawialiśmy o wcześniej.
To jest, jeśli przechowuje się w zmiennej przed
możemy przechowywać ciąg i przejść ją później w czasie stałym.
Bez względu na to, jaka liczba
jesteśmy przechowywania tej zmiennej, musimy na to patrzeć.
Najlepszym przypadkiem jest, patrzymy na niego
i znaleźć długość łańcucha.
Więc Ω (1) lub najlepiej sprawa stała czas.
Najgorszy przypadek jest
patrzymy na nią i znaleźć długość łańcucha.
Tak więc, o (1) lub w stałej czasowej w najgorszym przypadku.
Tak więc, ponieważ najlepsze najgorszych przypadków przypadku i są takie same,
to można powiedzieć, aby uruchomić w Θ (1) czasu.
>> Podsumowując, mamy dobrych sposobów na wymyślenie efektywności kodów
nie wiedząc nic o świecie rzeczywistym czasu ich podjęcia do pracy,
który ma wpływ wiele czynników zewnętrznych,
odmiennego sprzętu, w tym oprogramowania,
lub specyfika kodzie.
Ponadto, pozwala rozumowi oraz o tym, co się wydarzy
gdy rozmiar wejść wzrasta.
>> Jeśli pracujesz w O (n) ² algorytmu,
lub gorzej, O (2 ⁿ) algorytm,
jednym z najszybciej rozwijających się typów,
będziesz naprawdę zacząć zwracać uwagę spowolnienie
po rozpoczęciu pracy z większą ilością danych.
>> To asymptotyczna złożoność. Dzięki.