Grupowanie danych liczbowych w kontenerze vector

0

Witam,

Mam swój sposób na grupowanie danych w vectorze ale poszukuję szybszej metody jeśli w ogóle taka istnieje.

Grupowanie polega na sumowaniu wartości przy spełnionym warunku równości jednego, dwóch lub więcej elementów w kontenerze.
Przykład:

Kontener ma takie wartości typu string ale to nie ma znaczenia

A;B;0;M;3;4;C;D;0;M;3;4;A;B;0;M;3;4

Mój sposób polega na tym, że wyobrażam sobie vector jako tablicę dwuwymiarową a iteratory skaczą po wierszach co 6 element

A;B;0;M;3;4
C;D;0;M;3;4
A;B;0;M;3;4

for ( str = vTab.begin(); str < vTab.end(); str+=6 ) 
{
	if ( (*str) == L"0" ) continue;

	for ( it = str+6; it < vTab.end(); it+=6 )
	{
		if ( (*it) == L"0" ) continue;

		if( (*str) == (*it) && (*(str+1)) == (*(it+1)) )
                {
                    // jeśli warunek zajdzie to tu sumowane są wartości liczbowe 3 i 4 z wierszy a wiersz jest wypełniany zerami żeby przy kolejnej pętli nie brany był już pod uwagę
                }
        }
}

Wynik:

A;B;0;M;6;8
C;D;0;M;3;4
0;0;0;0;0;0

Jest to proste rozwiązanie grupowania jednak przy kilkuset wierszach grupowanie potrafi zająć trochę więcej niż chwilę stąd moje pytanie.
Dziękuję

1

A co jeśli 0 i M są różne? Nadpisujesz?

0
kq napisał(a):

A co jeśli 0 i M są różne? Nadpisujesz?

Warunek jasno określa, ze tylko dwie pierwsze wartości z vectora są brane pod uwagę

 if( (*str) == (*it) && (*(str+1)) == (*(it+1)) )

Czyli A i B ( poz: 0,1 i 6,7 )reszta co nie jest cyfrą po prostu jest ignorowana w tym przykładzie

0

Nie pytam o warunek, tylko o efekt. Dwie ostatnie wartości są sumowane kolumnami - ok. A co z 3. i 4.? W przykładzie są identyczne i się nie zmieniają. A co jeśli są różne?

0

To również są ignorowane bo nie są w tym przykładzie ważne
Np:

A;B;1;D;3;4
C;D;0;M;3;4
A;B;0;M;3;4

A;B;1;D;6;8
C;D;0;M;3;4
0;0;0;0;0;0

1

Ciągle uważam, że to pytanie to problem XY (liczyłem na wyjaśnienie/opis pierwotnego problemu, ale się przeliczyłem).
Z tego co zrozumiałem to można to przyspieszyć prostymi standardowymi sztuczkami:

  • mapowanie pierwszych wierszy dla danego klucza (u ciebie pierwsze dwie komórki wiersza są kluczem)
  • hashowanie kluczy by przyspieszyć przeszukiwanie mapy, jak masz C++11 to masz dostępną już hash mapę unordered_map
  • wszelkie optymalizacje redukujące cache miss (z braku detali nic nie da się powiedzieć tylko rzucić hasłem).

z obecnej złożoności o(n2) zejdziesz do złożoności o(n) czyli poprawa będzie znaczna.

Zamiast robić jakieś dziwne akcje z iteratorami i przeskakiwaniem co 6 (magic number) lepiej zdefiniować strukturę lub coś w ten deseń.

1 użytkowników online, w tym zalogowanych: 0, gości: 1