Potencjalna metoda - Potential method
W teorii złożoności obliczeniowej , potencjalna metoda to metoda stosowana do analizy czasu i przestrzeni zamortyzowanego złożoność o strukturze danych , miarą jego wydajności ponad sekwencji operacji, które wygładza kosztów rzadkie, ale drogie operacje.
Definicja amortyzowanego czasu
W metodzie potencjalnej wybierana jest funkcja Φ, która odwzorowuje stany struktury danych na liczby nieujemne. Jeśli S jest stanem struktury danych, Φ ( S ) reprezentuje pracę, która została uwzględniona („opłacona”) w zamortyzowanej analizie, ale nie została jeszcze wykonana. Zatem Φ ( S ) można traktować jako obliczenie ilości energii potencjalnej zmagazynowanej w tym stanie. Potencjalna wartość przed operacją inicjalizacji struktury danych jest zdefiniowana jako zero. Alternatywnie, Φ ( S ) może być traktowane jako reprezentujące wielkość nieporządku w stanie S lub jego odległość od stanu idealnego.
Niech o będzie dowolną indywidualną operacją w sekwencji operacji na pewnej strukturze danych, gdzie S przed oznaczeniem stanu struktury danych przed operacją o i S po oznaczeniu jej stanu po zakończeniu operacji o . Po wybraniu Φ określa się, że zamortyzowany czas operacji o wynosi
gdzie C jest nieujemną stałą proporcjonalności (w jednostkach czasu), która musi pozostać niezmienna przez całą analizę. Oznacza to, że zamortyzowany czas definiuje się jako rzeczywisty czas potrzebny na operację plus C razy różnica potencjału spowodowana tą operacją.
Podczas badania asymptotycznej złożoności obliczeniowej przy użyciu notacji dużego O , stałe współczynniki są nieistotne, więc stała C jest zwykle pomijana.
Relacja między zamortyzowanym a rzeczywistym czasem
Pomimo swojego sztucznego wyglądu całkowity zamortyzowany czas sekwencji operacji stanowi ważną górną granicę rzeczywistego czasu dla tej samej sekwencji operacji.
Dla dowolnej sekwencji operacji określ:
- Całkowity czas amortyzacji:
- Całkowity rzeczywisty czas:
Następnie:
gdzie sekwencja wartości funkcji potencjału tworzy szereg teleskopowy, w którym wszystkie wyrazy inne niż początkowe i końcowe wartości funkcji potencjału anulują się parami. Przekształcając to, otrzymujemy:
Ponieważ i , więc zamortyzowany czas może być wykorzystany do określenia dokładnej górnej granicy rzeczywistego czasu sekwencji operacji, nawet jeśli zamortyzowany czas dla pojedynczej operacji może znacznie różnić się od czasu rzeczywistego.
Zamortyzowana analiza danych wejściowych z najgorszego przypadku
Zazwyczaj analiza zamortyzowana jest stosowana w połączeniu z najgorszym założeniem dotyczącym sekwencji wejściowej. Przy takim założeniu, jeśli X jest typem operacji, którą może wykonać struktura danych, a n jest liczbą całkowitą określającą rozmiar danej struktury danych (np. Liczbę pozycji, które zawiera), to czas amortyzacji dla operacji typu X jest określona jako maksymalna spośród wszystkich możliwych sekwencji operacji na strukturach danych o rozmiarze n i wszelkich operacji o i typu X w sekwencji czasu amortyzowane pracy o i .
Przy takiej definicji czas wykonania sekwencji operacji można oszacować poprzez pomnożenie zamortyzowanego czasu dla każdego typu operacji w sekwencji przez liczbę operacji tego typu.
Przykłady
Tablica dynamiczna
Tablica dynamiczna to struktura danych służąca do przechowywania tablicy elementów, umożliwiająca zarówno swobodny dostęp do pozycji w tablicy, jak i możliwość zwiększenia rozmiaru tablicy o jeden. Jest dostępny w Javie jako typ „ArrayList”, aw Pythonie jako typ „list”.
Tablica dynamiczna może być implementowana przez strukturę danych składającą się z tablicy A elementów o pewnej długości N wraz z liczbą n ≤ N reprezentującą pozycje w tablicy, które były do tej pory używane. W przypadku tej struktury losowy dostęp do tablicy dynamicznej może być realizowany poprzez dostęp do tej samej komórki tablicy wewnętrznej A , a gdy n < N , operacja zwiększająca rozmiar tablicy dynamicznej może być realizowana po prostu przez zwiększenie n . Jednak gdy n = N , konieczna jest zmiana rozmiaru A , a typową strategią jest podwojenie jego rozmiaru, zastępując A nową tablicą o długości 2 n .
Strukturę tę można analizować za pomocą funkcji potencjalnej:
- Φ = 2 n - N.
Ponieważ strategia zmiany rozmiaru zawsze powoduje, że A jest co najmniej w połowie pełne, ta potencjalna funkcja jest zawsze nieujemna, zgodnie z potrzebami.
Gdy operacja zwiększania rozmiaru nie prowadzi do operacji zmiany rozmiaru, Φ wzrasta o 2, co jest stałą wartością. Dlatego stały rzeczywisty czas operacji i stały wzrost potencjału łącznie dają stały, zamortyzowany czas operacji tego typu.
Jednak gdy operacja zwiększania rozmiaru powoduje zmianę rozmiaru, potencjalna wartość n zmniejsza się do zera po zmianie rozmiaru. Przydzielenie nowej tablicy wewnętrznej A i skopiowanie wszystkich wartości ze starej tablicy wewnętrznej do nowej zajmuje O ( n ) faktycznego czasu, ale (przy odpowiednim doborze stałej proporcjonalności C ) jest to całkowicie anulowane przez zmniejszenie potencjalna funkcja, pozostawiając ponownie stały całkowity zamortyzowany czas operacji.
Inne operacje struktury danych (odczyt i zapis komórek tablicy bez zmiany rozmiaru tablicy) nie powodują zmiany funkcji potencjalnej i mają taki sam stały czas zamortyzowany, jak ich rzeczywisty czas.
Dlatego przy takim wyborze strategii zmiany rozmiaru i potencjalnej funkcji metoda potencjalna pokazuje, że wszystkie dynamiczne operacje na tablicach wymagają stałego zamortyzowanego czasu. W połączeniu z nierównością związaną z zamortyzowanym czasem i rzeczywistym czasem w sekwencjach operacji, pokazuje to, że każda sekwencja n dynamicznych operacji tablicowych zajmuje O ( n ) rzeczywistego czasu w najgorszym przypadku, pomimo faktu, że niektóre indywidualne operacje mogą same zająć liniowa ilość czasu.
Gdy tablica dynamiczna zawiera operacje, które zmniejszają rozmiar tablicy, a także ją zwiększają, potencjalna funkcja musi zostać zmodyfikowana, aby nie stała się ujemna. Jednym ze sposobów jest zastąpienie powyższego wzoru na Φ jego wartością bezwzględną .
Multi-Pop Stack
Rozważ stos, który obsługuje następujące operacje:
- Inicjalizuj - utwórz pusty stos.
- Wepchnij - dodaj pojedynczy element na wierzch stosu, powiększając stos o 1.
- Pop ( k ) - usuwa k elementów ze szczytu stosu, gdzie k jest nie większe niż aktualny rozmiar stosu
Pop ( k ) wymaga O ( k ) czasu, ale chcemy pokazać, że wszystkie operacje wymagają O (1) zamortyzowanego czasu.
Strukturę tę można analizować za pomocą funkcji potencjalnej:
- Φ = liczba elementów w stosie
Zgodnie z wymaganiami liczba ta jest zawsze nieujemna.
Operacja Push zajmuje stały czas i zwiększa się Φ o 1, więc jej zamortyzowany czas jest stały.
Operacja Pop wymaga czasu O ( k ), ale także zmniejsza Φ o k , więc jej zamortyzowany czas jest również stały.
Dowodzi to, że jakakolwiek sekwencja m operacji w najgorszym przypadku zajmuje O ( m ) czasu rzeczywistego.
Licznik binarny
Rozważmy licznik reprezentowany jako liczba binarna i obsługujący następujące operacje:
- Inicjalizuj: utwórz licznik o wartości 0.
- Inc: dodaj 1 do licznika.
- Odczyt: zwraca bieżącą wartość licznika.
W tym przykładzie nie używamy transdychotomicznego modelu maszyny , ale zamiast tego wymagamy jednej jednostki czasu na operację bitową w inkrementacji. Chcemy pokazać, że Inc pobiera O (1) zamortyzowanego czasu.
Strukturę tę można analizować za pomocą funkcji potencjalnej:
- Φ = liczba-bitów-równa-1 = waga hamminga (licznik)
Ta liczba jest zawsze nieujemna i zaczyna się od 0, zgodnie z wymaganiami.
Operacja Inc odwraca najmniej znaczący bit . Następnie, jeśli LSB zostało odwrócone z 1 na 0, to następny bit również jest odwrócony. Trwa to do momentu, gdy w końcu następuje odwrócenie bitu z 0 na 1, w którym to momencie przerzucanie się zatrzymuje. Jeśli licznik początkowo kończy się na k 1 bitach, przerzucamy w sumie k +1 bitów, biorąc rzeczywisty czas k +1 i zmniejszając potencjał o k −1, tak więc zamortyzowany czas wynosi 2. Stąd rzeczywisty czas na wykonanie m Operacje Inc to O ( m ).
Aplikacje
Metoda funkcji potencjalnej jest powszechnie stosowana do analizy stert Fibonacciego , formy kolejki priorytetowej, w której usunięcie elementu wymaga logarytmicznego zamortyzowanego czasu, a wszystkie inne operacje wymagają stałego amortyzowanego czasu. Może być również używany do analizy drzew splay , samodopasowującej się postaci binarnego drzewa wyszukiwania z logarytmicznie amortyzowanym czasem na operację.