Optymalizacja kodu
Ostatnio zmodyfikowano 2017-09-24 13:46
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. 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 ); }
|
|
pekfos |
» 2017-09-24 11:54:39 'Najpierw niech działa', a ten kod jest błędny. |
|
Saran Temat założony przez niniejszego użytkownika |
» 2017-09-24 11:58:16 Ale... ale... z jakiego powodu? U mnie działa. |
|
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. |
|
j23 |
» 2017-09-24 13:20:53 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. |
|
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? |
|
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. |
|
« 1 » |