Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Optymalizacja iteracji

Ostatnio zmodyfikowano 2016-10-29 22:19
Autor Wiadomość
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.

C/C++
void Zliczanie( double B1[], double B2[], int B3[] )
/*{
    q=0;
    for(int S=0;S<=19;S++)
    {
    for(int s=q; s<=18423;s++)

    {   double a=(B1[s]-B2[S])/B2[S];
if(a<0){a*=-1;};
        if(a<0.000000001){B3[s]+=1;q=s;break;};}
    }
}*/
{
    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;
}

/*{
q=0;
int s=0;
int S = 0;
while(true)
{
    double a=(B1[s]-B2[S])/B2[S];
    if(a<0){a*=-1;};
    if(a>0.000000001)
{
++s;
}
else
{
++S;
++B3[s];
}

if(S==20)
break;
}
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
C/C++
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.
P-152946
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.
P-152951
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.
P-152954
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 !!!


C/C++
int s = - 1;
double a;
for( int S = 0; S <= 19; S++ )
{
    do
    {
        ++s;
        a =( B1[ s ] - B2[ S ] ) / B2[ S ];

P-153008
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?
P-153021
Elaine
» 2016-10-29 03:38:21
Zacznijmy od sprawy najważniejszej: jaki problem ma ta funkcja rozwiązywać?
P-153022
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.
P-153032
« 1 »
  Strona 1 z 1