Zwykle w algorytmach nie dbamy o porównywanie, dodawanie lub odejmowanie liczb - zakładamy, że działają one w czasie . Na przykład zakładamy, że mówimy, że sortowanie na podstawie porównania to , ale gdy liczby są zbyt duże, aby zmieścić się w rejestrach, zwykle reprezentujemy je jako tablice, więc podstawowe operacje wymagają dodatkowych obliczeń dla elementu.
Czy istnieje dowód, że porównanie dwóch liczb (lub innych prymitywnych funkcji arytmetycznych) można wykonać w ? Jeśli nie, dlaczego mówimy, że sortowanie na podstawie porównania to ?O ( n log n )
I napotkał ten problem, kiedy odpowiedział na pytanie SO i zdałem sobie sprawę, że mój algorytm nie jest , ponieważ prędzej czy później powinien sobie radzić z big-int, również nie było czasu algorytm pseudo wielomian, był P .
Odpowiedzi:
Dla ludzi takich jak ja, którzy badają algorytmy życia, standardowym modelem obliczeń XXI wieku jest całkowita liczba pamięci RAM . Model ma dokładniej odzwierciedlać zachowanie prawdziwych komputerów niż model maszyny Turinga. Komputery w świecie rzeczywistym przetwarzają wiele bitów liczb całkowitych w stałym czasie przy użyciu równoległego sprzętu; nie dowolne liczby całkowite, ale (ponieważ rozmiary słów stale rosną z czasem) nie są też liczbami całkowitymi o stałej wielkości .
Model zależy od jednego parametru , zwanego rozmiarem słowa . Każdy adres pamięci zawiera jedną liczbę całkowitą w- bit lub słowo . W tym modelu wielkość wejściowa n to liczba słów na wejściu, a czas działania algorytmu to liczba operacji na słowach . Standardowe operacje arytmetyczne (dodawanie, odejmowanie, mnożenie i dzielenie całkowite, pozostałość porównanie) i operacji logicznych (bitowe, i, albo XOR, zmiany, obraca się) słów wymaga O ( 1 ) razem z definicji .w w n O ( 1 )
Formalnie rozmiar słowa NIE jest stałąw do celów analizy algorytmów w tym modelu. Aby model był zgodny z intuicją, wymagamy , ponieważ w przeciwnym razie nie możemy nawet zapisać liczby całkowitej n w jednym słowie. Niemniej jednak w przypadku większości algorytmów nienumerycznych czas działania jest w rzeczywistości niezależny od w , ponieważ algorytmy te nie dbają o binarną reprezentację ich danych wejściowych. Mergesort i heapsort działają w czasie O ( n log n ) ; mediana-z-3-szybkich biegów działa w O ( n 2w ≥ log2)n n w O ( n logn ) czas w najgorszym przypadku. Jednym wyjątkiem jest binarny rodzaj podstawa, która rozciąga się w O ( n W ) czasu.O ( n2)) O ( n w )
Ustawienie daje nam tradycyjny model RAM o koszcie logarytmicznym. Ale niektóre algorytmy liczb całkowitych RAM są zaprojektowane dla większych rozmiarów słów, jak algorytm sortowania liczb całkowitych w czasie liniowym Andersson i in. , co wymaga w = Ω ( log 2 + ε n ) .w = Θ ( logn ) w = Ω ( log2 + εn )
Dla wielu algorytmów, które pojawiają się w praktyce, wielkość słowo to nie tylko problem, a my możemy (i robią) spadnie z powrotem na znacznie prostszą jednolity kosztach modelu RAM. Jedyna poważna trudność pochodzi z zagnieżdżonego mnożenia, które mogą być wykorzystane do budowy bardzo dużych liczb całkowitych bardzo szybko. Gdybyśmy mogli wykonywać arytmetykę na dowolnych liczbach całkowitych w stałym czasie, moglibyśmy rozwiązać każdy problem w PSPACE w czasie wielomianowym .w
Aktualizacja: Powinienem również wspomnieć, że istnieją wyjątki od „modelu standardowego”, takiego jak algorytm mnożenia liczb całkowitych Fürera , który wykorzystuje maszyny Turinga na wielu taśmach (lub równoważnie „bitowa pamięć RAM”) oraz większość algorytmów geometrycznych, które są analizowane teoretycznie czysty, ale wyidealizowany model „prawdziwej pamięci RAM” .
Tak, to puszka robaków.
źródło
To zależy tylko od kontekstu. Kiedy mamy do czynienia ze złożonością algorytmów na poziomie bitów , nie mówimy, że dodanie dwóch liczb bitów jestn , mówimy, że jest to O ( n ) . Podobnie domnożeniaitp.O ( 1 ) O ( n )
źródło
Aby odpowiedzieć na pytanie, jak stwierdzono: algorytmowie po prostu robią to dość często, używając modelu pamięci RAM. W celu sortowania w wielu przypadkach ludzie analizują nawet prostszy model porównawczy , który omawiam nieco więcej w powiązanej odpowiedzi.
Aby odpowiedzieć na ukryte pytanie, dlaczego to robią: Powiedziałbym, że ten model ma dość dobrą moc predykcyjną dla niektórych rodzajów algorytmów kombinatorycznych, w których wszystkie liczby są „małe” i, na prawdziwych maszynach, mieszczą się w rejestrach.
Aby odpowiedzieć na dorozumiane działania następcze dotyczące algorytmów numerycznych: Nie, zwykły stary model pamięci RAM nie jest tutaj standardem. Nawet eliminacja gaussowska może wymagać pewnej uwagi. Zazwyczaj do obliczeń rang wchodzi Schwartz Lemma (np. Sekcja 5 tutaj ). Innym kanonicznym przykładem jest analiza algorytmu elipsoidalnego, która wymaga pewnej staranności w analizie.
I wreszcie: ludzie myśleli o sortowaniu łańcuchów wcześniej , nawet ostatnio.
Aktualizacja: Problem z tym pytaniem polega na tym, że „my” i „zakładamy” nie są tak dokładnie określone. Powiedziałbym, że ludzie, którzy pracują w modelu RAM, nie robią algorytmów numerycznych ani teorii złożoności (gdzie ustalenie złożoności podziału było znanym rezultatem ).
źródło
python -mtimeit "$a * $b"
$a
$b = 2*$a
. (Zatrzymałem się na 66, ponieważ wtedy składnia Pythona przestaje akceptować literały całkowite i musiałbym nieco zmienić kod oceny, więc nie zrobiłem tego: p)źródło
źródło
Powiedziałbym, że zazwyczaj zakładamy operacje arytmetyczne O (1), ponieważ zwykle robimy rzeczy w kontekście 32-bitowych liczb całkowitych lub 64-bitowych liczb całkowitych lub liczb zmiennoprzecinkowych IEEE 754. O (1) jest prawdopodobnie całkiem dobrym przybliżeniem dla tego rodzaju arytmetyki.
Ale ogólnie to nie prawda. Zasadniczo potrzebny jest algorytm do dodawania, odejmowania, mnożenia i dzielenia. Obliczalność i logika Boolosa, Burgessa i Jefferiesa mi na myśl jako sposób na zrozumienie tego dowodu, jeśli chodzi o kilka różnych systemów formalnych, Funkcje Rekurencyjne i Maszyny Abacusa, przynajmniej w moim egzemplarzu z 4. edycji.
Możesz spojrzeć na warunki rachunku lambda dla odejmowania i dzielenia za pomocą cyfr liczb kościelnych, aby uzyskać łatwe do zrozumienia wyjaśnienie, dlaczego te dwie operacje nie są O (1). Nieco trudniej jest dostrzec dodawanie, mnożenie i potęgowanie, ale jest tam, jeśli weźmie się pod uwagę formę samych Kościelnych Liczb.
źródło