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

Optymalizacja kodu

Ostatnio zmodyfikowano 2017-09-24 13:46
Autor Wiadomość
Saran
Temat założony przez niniejszego użytkownika
Optymalizacja kodu
» 2017-09-24 09:43:21
Cześć, przybywam i o radę pytam. Da się napisać poniższy kawałek kodu wydajniej? lista_otwarta jest to std::set, dlatego dane są posortowane. Z tego powodu nie sądzę, by konieczne było iterowanie po wszystkich elementach.

C/C++
for( auto item: lista_otwarta )
if( item.x == j && item.y == i ) {
    if( item.wartosc_sciezki < wartosc_sciezki ) br = true;
    else lista_otwarta.erase( item ); }
P-165163
pekfos
» 2017-09-24 11:54:39
'Najpierw niech działa', a ten kod jest błędny.
P-165165
Saran
Temat założony przez niniejszego użytkownika
» 2017-09-24 11:58:16
Ale... ale... z jakiego powodu? U mnie działa.
P-165166
pekfos
» 2017-09-24 12:07:30
Nie możesz użyć iteratora, na którym użyłeś erase. Ten iterator jest tu tworzony i używany niejawnie. Rozwiązanie bardziej optymalne przyjdzie wraz z naprawieniem tego błędu.
P-165168
j23
» 2017-09-24 13:20:53
C/C++
auto it = lista_otwarta.begin();

while( it != lista_otwarta.end() )
{
    if( it->x == j && it->y == i )
    {
        if( it->wartosc_sciezki < wartosc_sciezki ) br = true;
        else
        {
            it = lista_otwarta.erase( it );
            continue;
        }
    }
   
    ++it;
}
Nie napisałeś względem czego posortowana jest lista_otwarta.
P-165171
Saran
Temat założony przez niniejszego użytkownika
» 2017-09-24 13:36:16
Względem zmiennej składowej "wartosc", niewidocznej w przykładzie. Ale powyższy kod nadal używa pętli, wydajność jest chyba podobna?
P-165172
pekfos
» 2017-09-24 13:46:36
Względem zmiennej składowej "wartosc", niewidocznej w przykładzie.
Więc nie podałeś żadnych informacji, pozwalających wykorzystać jakoś fakt posortowania danych. Tak jak problem jest określony teraz, nie da się inaczej niż sprawdzić wszystkie elementy.

Ale powyższy kod nadal używa pętli, wydajność jest chyba podobna?
Wydajność jest lepsza. Jak chcesz poprawiać wydajność, skoro sam nie wiesz co piszesz? Ta pętla jawnie używa iteratorów i usuwa elementy po iteratorach. Ty operujesz na kopiach elementów, korzystając z wygodnego skróconego for, i elementy usuwasz po kluczu, co pogarsza czas usuwania o logarytmiczne wyszukiwanie.
P-165175
« 1 »
  Strona 1 z 1