Grupowanie danych liczbowych w kontenerze vector

Grupowanie danych liczbowych w kontenerze vector
duf
  • Rejestracja:prawie 19 lat
  • Ostatnio:4 miesiące
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

Kopiuj
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ę

MarekR22
opisz to jakoś bardzie zrozumiale. Najlepiej opisz problem jaki ma rozwiązywać twój kod, bo na razie to wygląda na "problem xy".
Xupicor
"stąd moje pytanie." - jakie pytanie? W Twoim poście nie ma ani jednego znaku zapytania. :P Poza tym - to co wyżej, zdefiniuj co masz na myśli przez "vector" i opisz lepiej swój problem.
duf
Pytanie brzmi: Czy można to zadanie grupowania wartości zrobić szybciej niż poprzez pętle?
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Lokalizacja:Szczecin
1

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


duf
  • Rejestracja:prawie 19 lat
  • Ostatnio:4 miesiące
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ę

Kopiuj
 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

edytowany 3x, ostatnio: duf
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Lokalizacja:Szczecin
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?


duf
  • Rejestracja:prawie 19 lat
  • Ostatnio:4 miesiące
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

MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:6 minut
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ń.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.