Zmniejszenie rozmiaru i przyspieszenie programu

Zmniejszenie rozmiaru i przyspieszenie programu
gswidwa
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 839
0

Witam.
Mam program obliczający najkrótszą ścieżkę pomiędzy 2 punktami w labiryncie zbudowanego z tablicy 20x20. Wszystko działa sprawnie, lecz mi zależy na tablicy dużo większych rozmiarów. Każda komórka w tablicy ma własną strukturę, więc dla tablicy np. 200x200 wychodzi 40000 struktur. To chyba dużo ;). Poza tym znacznie spada czas po jakim widać ścieżkę.

miałem dodać kod źródłowy programu, ale występują mi błędy w dodaniu... czy to znaczy, że kod jest za długi? [ok. 200 linii]
Kod jest w pliku tekstowym.

P.S. Drogę znajduję dzięki algorytmowi BFS

vpiotr
  • Rejestracja: dni
  • Ostatnio: dni
0

Na dobry początek proponuję:

  • popraw ustawianie_punktu_startu, stworz_punkt_w_prawo, stworz_punkt_w_lewo, stworz_punkt_w_dol, stworz_punkt_w_gore w taki sposób, żeby zawsze był wykonywany return

  • w instrukcjach for wykorzystuj stałe, np.

Kopiuj
for(int id=0; id<399; id++)

zastosuj stałą zamiast 399

  • tak samo w deklaracjach tablic:
Kopiuj
char map[20][20] = {
Kopiuj
struct punkt p[400];
  • udowodnij, że wyznaczenie_trasy nie może się zawiesić. Jeśli formalny dowód nie istnieje dodaj odpowiednie warunki.

  • dlaczego stworz_punkt_w_gore wykorzystuje 399 a stworz_punkt_w_dol wartość 400 w pętli for?

  • 666 też powinno być stałą > od stałej w deklaracji p[400]

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0

Nie jest źle jak na początek.
Poza dobrymi radami powyżej, zwróć uwagę, że stworz_punkt_w_x wyglądają w zasadzie tak samo.
Na dodatek nie zauważyłeś, że struct punkt p[400]; to w zasadzie stos, więc spokojnie można było dodać zmienną wskazująca na szczyt stosu i wtedy przeszukiwanie wolnego miejsca jest zbędne i jedno pole struktury też jest zbędne
Ja bym to napisał raczej tak:

Kopiuj
int stworz_punkt(int naPodstawie, ind dx, int dy)
{
    assert(dx!=0 || dy !=0);
    if (cos_co_wymyslisz)
          return 0;
    p[p_count].x = p[naPodstawie].x+dx;
    p[p_count].y = p[naPodstawie].y+dy;
    p[p_count].poprzedni = naPodstawie;
    p[p_count].dlugosc = p[naPodstawie].dlugosc+1;
    map[p[p_count].y][p[p_count].x] = '2';
    return ++p_count;
}
gswidwa
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 839
0

dzięki wielkie :)
jak wrócę do domu ogarnę to.

Aaaa...
"- udowodnij, że wyznaczenie_trasy nie może się zawiesić. Jeśli formalny dowód nie istnieje dodaj odpowiednie warunki."
wyznaczanie trasy się nie zawiesi, gdyż:

  • jest odpowiednia ilość struktur;
  • gdy żaden punkt nie ma drogi dezaktywuje się, a gdy wszystkie są dezaktywowane wtedy return zwraca "nie ma wyjścia".

I czym się różni stała=123 niż zwykłe 123? Przecież w gruncie rzeczy to też jest stała :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.