Jest dziesięć elementów. Wyobraź sobie 0, który poprzedza tę listę.
Następnie 0 + 5 = 5, jest pierwszą sumą przedrostka.Ta suma biegania zwykle trwa do ostatniego elementu, 7, na danej liście. Druga sekwencja (lista) ma sumę prefiksów jedenastu elementów. Pierwszym elementem w tablicy sum prefiksów (druga sekwencja) jest założona (wyobrażona) zero. Poniższe dwa tabele, w których drugi rząd dla każdej tabeli ma indeksy tablicy zerowej, ilustrują te dwie sekwencje:
Podana tabela | ||||||||||
5 | 2 | -6 | 8 | -4 | 0 | 9 | 3 | -1 | 7 | |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
Prefiks Sums Tabela | ||||||||||
5 | 7 | 1 | 9 | 5 | 5 | 14 | 17 | 16 | 23 | |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
Pierwsza tabela dotyczy danej tablicy, a druga tabela dotyczy tablicy sum prefiks. Jeśli liczba elementów w danej tablicy wynosi n, wówczas liczba elementów w tablicy sum przedrostka wynosi n+1. W tym artykule wyjaśniono główne cechy sum prefiks. W tym kontekście „przed-” oznacza to, co zostało wcześniej dodane. Może to również oznaczać prefiksowanie tablicy prefiksów z zero.
Brutalna siła
Programista powinien znać znaczenie brutalnej siły stosowanej w programowaniu. Brutalna siła oznacza rozwiązanie problemu przy użyciu bezpośredniego algorytmu, który zwykle nie jest tak wydajny (aby używać mniej czasu i pamięci), jak kolejny starannie nauczany algorytm.
Suma przedrostka brutalną siłą
W celu wytworzenia tablicy sum prefiksów, z brutalnej siły, dla powyższej tablicy, 5 zostanie po raz pierwszy odnotowane jako pierwsza suma przedrostka. Następnie zostaną dodane 5 i 2, aby dać następną sumę przedrostka, 7. Następnie zostaną dodane 5, 2 i -6, aby zapewnić sumę przedrostka po 1. Dalej, 5, 2, -6 i 8 zostaną dodane, aby nadać nową sumę prefiks. Ta procedura może być męcząca.
Męczące, czy nie, kod do wytworzenia tablicy sum prefiksów, z zakładanego zeru, z brutalną siłą jest:
int n = 10;Zewnętrzna for pętka itera od 0 do tylko mniej niż n. Wewnętrzne iterację pętli od 0 do i, wskaźnik iteracji zewnętrznej pętli. Dzięki temu istnieje 55 głównych operacji. Złożoność czasu to jest O (n.dziennik2N).
Suma przedrostka w czasie liniowym
Złożoność poprzedniej czasu wynosi w przybliżeniu O (n.dziennik2N). Algorytm można poprawić w taki sposób, aby sumy są wytwarzane w czasie liniowym dla złożoności czasu, O (N). Prefiks w tym kontekście oznacza dodanie sumy wszystkich poprzednich elementów do danego elementu bieżącego. Rozważ poprzednie dwie tabele, narysowane jako jedna tabela, z pewnymi modyfikacjami:
Prefiks Sums Tabela | ||||||||||
Dany: | 5 | 2 | -6 | 8 | -4 | 0 | 9 | 3 | -1 | 7 |
0 + 5 = | 5 + 2 = | 7 + -6 = | 1 + 8 = | 9 + -4 = | 5 + 0 = | 5 + 9 = | 14+3 = | 17+ -1 = | 16+7 = | |
0 | 5 | 7 | 1 | 9 | 5 | 5 | 14 | 17 | 16 | 23 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
Pierwszy rząd w tej tabeli ma podane elementy na przypisanych pozycjach. Dla drugiego i trzeciego rzędu zakłada się początkowe zero. Dla drugiego i trzeciego wiersza każdy element jest równy sumie wszystkich poprzednich elementów, a także bieżący element. Ostatni wiersz ma indeksy tablic prefiksów (oparte na zero). Należy zauważyć, że tablica podsumowań przedrostek jest jednym elementem dłuższym niż podana tablica.
Ten algorytm wytwarza podwyżki prefiksów w liniowym czasie złożoności O (N). Oznacza to, że istnieje około N. A zalecany kod sum prefiksu w C ++ dla O (n) złożoność czasu wynosi:
int n = 10;Zauważ, że tym razem nie ma zagnieżdżonej pętli. Niezbędne są stwierdzenia wewnątrz nawiasów na pętlę. Ważne jest również główne działanie ciała na pętlę. Tak jak poprzednio, for pętla iteruje od 1 do mniej niż n+1, a nie od 0 do mniej niż n. Oświadczenie ciała na pętlę jest:
P [i] = p [i-1] + a [i-1];Oznacza to, że bieżąca wartość danej tablicy jest dodawana do poprzedniej sumy przedrostka, aby zapewnić bieżącą sumę przedrostka.
Powszechny problem dla sum prefiks
Zauważ, że odpowiedni wskaźnik kwot prefiksów mali 1 dodano do niej w porównaniu z wskaźnikiem danej tablicy.
Częstym problemem dla kwot prefiksów jest skuteczne znalezienie sumy sub-podarunki kolejnych elementów. To jest suma plastra. Słowo „skutecznie” oznacza, że nie należy używać algorytmu brutalnej siły. Wskaźniki ograniczające dla podrzędnej to x i y. Rozważ podaną listę:
5, 2, -6, 8, -4, 0, 9, 3, -1, 7Suma podrzędnej od elementu 8 do elementu 9 to:
8 + -4 + 0 + 9 = 138 jest w indeksie 3, dla x; a 9 jest w indeksie 6 przez y. Skutecznym sposobem na to jest odjęcie sumy prefiksu przy indeksie 2, dla danej tablicy, od sumy prefiksu na indeksie 6 dla danej tablicy. W przypadku tablicy prefiksów są to indeks y+1 i indeks x. 1 do dodania zostanie usunięty, aby uzyskać indeks tablicy prefiksów, pokazany poniżej, a wydajny kod to:
int n = 10;Wniosek
Sumy prefiksów to suma bieżących elementów tablicy. W grę wchodzą dwie tablice: podana tablica i wyprodukowana tablica sum przedrostek. Tablica sum prefiksów jest dłuższa niż podana tablica według jednego elementu. Główną operacją uzyskania elementów tablicy prefiksów jest: bieżącą wartość w tablicy sum prefiks. Aby uzyskać sumę plastra z danej tablicy, użyj: int sliceum = p [y+1] - p [x];
Gdzie x jest dolnym indeksem granicznym plasterem w danej tablicy, a y jest górnym wskaźnikiem granicznym plasterki w danej tablicy.