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 » |