Powyżej na to pytanie o liczeniu inwersji , ja znalazłem papier , który okazuje się dolną granicę przestrzeni złożoności dla wszystkich (dokładne) algorytmy strumieniowe . Twierdziłem, że to ograniczenie obejmuje wszystkie liniowe algorytmy czasowe. Jest to nieco odważne, ponieważ ogólnie algorytm czasu liniowego może skakać do woli (dostęp losowy), czego nie może algorytm przesyłania strumieniowego; musi badać elementy w kolejności. Mogę wykonywać wiele przejść, ale tylko ciągle wiele (dla liniowego środowiska uruchomieniowego).
Dlatego moje pytanie:
Czy każdy algorytm czasu liniowego może być wyrażony jako algorytm przesyłania strumieniowego z ciągłą liczbą przejść?
Losowy dostęp zdaje się uniemożliwiać (prostą) konstrukcję potwierdzającą pozytywną odpowiedź, ale nie byłem w stanie wymyślić kontrprzykładu.
W zależności od modelu maszyny losowy dostęp może nawet nie stanowić problemu, jeśli chodzi o środowisko wykonawcze. Byłbym zainteresowany odpowiedziami na te modele:
- Maszyna Turinga, płaski wkład
- RAM, dane wejściowe jako tablica
- RAM, wprowadź jako listę połączoną
Odpowiedzi:
Aby algorytmy przesyłania strumieniowego były znaczące, muszą pracować ze znacznie mniejszą ilością miejsca do pracy niż samo wejście. Na przykład, jeśli zezwolisz na taką samą ilość miejsca pracy jak dane wejściowe, możesz w prosty sposób określić dowolny algorytm jako „algorytm strumieniowania jednoprzebiegowego”, który najpierw kopiuje dane wejściowe do przestrzeni roboczej w jednym przejściu, a następnie używa tylko pracy przestrzeń.
Myślę, że typowe jest ograniczenie przestrzeni roboczej do co najwyżej polilogarytmicznej wielkości wejściowej, gdy mówimy o algorytmach przesyłania strumieniowego. Przy tym założeniu, wybór mediany nie ma algorytmu przesyłania strumieniowego O (1) w wyniku Munro i Patersona [MP80]: dowolny algorytm przesyłania strumieniowego P dla wyboru mediany na N elementach musi przechowywać Ω ( N 1 / P ) elementy. Z drugiej strony, wybór mediany ma dobrze znany deterministyczny algorytm czasu liniowego [BFPRT73].
[BFPRT73] Manuel Blum, Robert W. Floyd, Vaughan Pratt, Ronald L. Rivest i Robert E. Tarjan. Terminy wyboru. Journal of Computer and System Sciences , 7 (4): 448–461, sierpień 1973. DOI: 10.1016 / S0022-0000 (73) 80033-9
[MP80] J. Ian Munro i Mike S. Paterson. Wybór i sortowanie z ograniczonym miejscem do przechowywania. Theoretical Computer Science , 12 (3): 315–323, listopad 1980. DOI: 10.1016 / 0304-3975 (80) 90061-4
źródło
W modelu przesyłania strumieniowego dozwolone jest przechowywanie tylko stałych lub polik logarytmicznych dodatkowych danych podczas skanowania danych wejściowych. Jeśli weźmiesz pod uwagę liniowy algorytm czasu
zgodny z paradygmatem dziel i podbij , musisz przechowywać więcej informacji i / lub powinieneś skanować swoje dane tyle razy, ile głębokość rekurencji.
Jednym z przykładów jest algorytm DC3 do konstruowania tablicy sufiksów tekstu (podanego jako tablica w modelu RAM). Aby zbudować tablicę sufiksów, pogrupuj znaki w trojaczki, aby otrzymać tekst z nowymi super znakami . Możesz to zrobić z przesunięciem 0 , 1 , 2 , co daje trzy nowe teksty T 1 , T 2 , T 3 . Co ciekawe, możesz obliczyć tablicę przyrostków, jeśli masz tablicę przyrostków T 1 ⋅ T 2 w czasie liniowym. Stąd algorytm potrzebujeT. 0 , 1 , 2 T.1, T2), T3) T1⋅T2
czas. Ta rekurencja rozwiązuje wyraźnie . Nie rozumiem, jak można to zmienić w algorytm przesyłania strumieniowego.t(n)=O(n)
Innym dobrze znanym przykładem jest klasyczny algorytm wyboru czasu liniowego .
źródło
Interpretuję twoje pytanie w następujący sposób. Załóżmy rozwiązać jakiś obliczeniowej problemu . Definiujemy:P
źródło
Nawet w najprostszej definicji „algorytmu przesyłania strumieniowego” (algorytmu, który po każdej inkrementalnej iteracji w źródle skutkuje natychmiastową znajomością następnego przyrostowego fragmentu wyniku), mogę wymyślić kilka algorytmów liniowych, które nie zachowuj się w ten sposób. Algorytmy mieszania są duże; FNV-1a jest liniowy względem liczby bajtów w źródle, ale nie znamy żadnej części końcowego skrótu, dopóki pełne źródło nie zostanie przetworzone.
RadixSort, czyli BucketSort, to O (N) (technicznie O (NlogM), gdzie M to maksymalna wartość w N elementach, która jest uważana za małą) i musi działać w całości, aby zagwarantować, że każdy pojedynczy element znajdzie się na ostatnim miejscu.
Aby być algorytmem „strumieniowym”, w najprostszym przypadku algorytm musi mieć następujące dwie właściwości, z których żadna nie jest wyraźnie związana z czasem:
Dlatego główną klasą algorytmów tego strumienia są algorytmy wykonujące „projekcje” (przyrostowe transformacje jednego wejścia na X> 0 wyjść).
źródło