Suma przedrostka w C ++

Suma przedrostka w C ++
Sumy prefiksów to suma bieżących liczby tablicy. Jest to kolejna pełna sekwencja liczb. Na przykład rozważ następującą listę: 5, 2, -6, 8, -4, 0, 9, 3, -1, 7

Jest dziesięć elementów. Wyobraź sobie 0, który poprzedza tę listę.

Następnie 0 + 5 = 5, jest pierwszą sumą przedrostka.
0 + 5 + 2 = 7 to kolejna suma przedrostka.
0 + 5 + 2 + -6 = 1 to suma przedrostka po.
0 + 5 + 2 + -6 + 8 = 9 to nowa suma 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;
int a [] = 5, 2, -6, 8, -4, 0, 9, 3, -1, 7;
int p [n+1];
P [0] = 0;
dla (int i = 0; iint sum = 0;
int J;
dla (j = 0; jsum = sum + a [j];

P [j] = sum;

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;
int a [] = 5, 2, -6, 8, -4, 0, 9, 3, -1, 7;
int p [n+1];
P [0] = 0;
dla (int i = 1; iP [i] = p [i-1] + a [i-1];

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, 7

Suma podrzędnej od elementu 8 do elementu 9 to:

8 + -4 + 0 + 9 = 13

8 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;
int a [] = 5, 2, -6, 8, -4, 0, 9, 3, -1, 7;
int p [n+1];
P [0] = 0;
int x = 3, y = 6;
dla (int i = 1; iP [i] = p [i-1] + a [i-1];

int sliceum = p [y+1] - p [x];
Cout<Wyjście wynosi 13, zgodnie z oczekiwaniami, ale z wydajnego kodu.

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.