Optymalizacja iteracji
Ostatnio zmodyfikowano 2016-10-29 22:19
Jakub_30 Temat założony przez niniejszego użytkownika |
Optymalizacja iteracji » 2016-10-26 15:35:51 Mam 3 różne ciała tego samego voida. Czas wykonywania jest zbyt długi i wynosi dla wszystkich ciał voida +/- 20.5 sek. Proszę nadal o pomysł na alternatywne ciała voida, a w szczególności rekurencyjne. Poniżej kod voida. void Zliczanie( double B1[], double B2[], int B3[] )
{ q = 0; int s = - 1; double a; for( int S = 0; S <= 19; S++ ) { do { ++s; a =( B1[ s ] - B2[ S ] ) / B2[ S ]; if( a < 0 ) { a *= - 1; }; } while( a > 0.000000001 ); ++B3[ s ]; } q = s; }
Funkcja ma porównać dwie liczby niewymierne o zadanej dokładności i jeżeli są tożsame , przypisać w osobnej tabeli +=1 Ludzie radzą by korzystać z std::unordered_map
std::unordered_map < int, int > occurences; int max = 10000; for( int i = 0; i < max; ++i ) { occurences[ get_random() ] += 1; }
for( auto it = occurences.cbegin(); it != occurences.cend(); ++it ) { std::cout << it->first << " occured " << it->second << " times\n"; }
Jak mogę wyniki odczytać z tablicy, ale też polecano mi std::vector Proszę o przykłady. |
|
Rashmistrz |
» 2016-10-26 17:04:54 Z mojego doświadczenia rekurencja jest bardziej zasobożerna od iteracji. W jaki sposób użycie wskaźników ma cokolwiek przyśpieszyć? Przecież wskaźniki to tylko sposób odwołania się do danych w pamięci.
Ale niech jeszcze ktoś inny się wypowie. |
|
j23 |
» 2016-10-26 19:05:39 @Rashmistrz, wskaźniki mogą być szybsze przy sekwencyjnym odczycie/zapisie elementów tablicy, których wielkość jest różna od 1, 2, 4 lub 8 (scaling factor).
W przypadku tego algorytmu zamiana na wskaźniki niewiele zmieni. |
|
polepszacz |
» 2016-10-28 08:14:11 To bardzo, bardzo zły pomysł, by używać zmiennych jednoliterowych, raz notowanych jako małe, innym jako duże litery !!! int s = - 1; double a; for( int S = 0; S <= 19; S++ ) { do { ++s; a =( B1[ s ] - B2[ S ] ) / B2[ S ];
|
|
karambaHZP |
» 2016-10-28 23:53:43 Proszę nadal o pomysł na alternatywne ciała voida, a w szczególności rekurencyjne |
Rekurencja tutaj może być nietrafionym pomysłem. Poszukaj jak zliczać przy pomocy std::map lub std::unordered_map. Czas wykonywania jest zbyt długi i wynosi dla wszystkich ciał voida +/- 20.5 sek. |
Nie możliwe. Dla tablic o rozmiarze 20? |
|
Elaine |
» 2016-10-29 03:38:21 Zacznijmy od sprawy najważniejszej: jaki problem ma ta funkcja rozwiązywać? |
|
carlosmay |
» 2016-10-29 22:19:44 Ludzie radzą by korzystać z
std::unordered_map < int, int > occurences; |
Twoja funkcja przyjmuje tablice typu double więc key też powinien być tego typu std::unordered_map < double, int > occurences; , a dla value typ dla liczb dodatnich std::unordered_map < double, std::size_t > occurences; bo masz zamiar zliczać, więc licznik raczej będzie dodatni. |
|
« 1 » |