Sloitost algoritm optimalizace problm pro een problmu potebujeme
Složitost algoritmů optimalizace problémů
• pro řešení problému potřebujeme T(n)= 5 n 2+4 n+50 kroků • konstanty a nižší složitost jsou zanedbatelné – výsledná složitost T(n)= n 2
Příklad 1 – varianta 1 Prohledáváme pole a hledáme minimum a maximum #include <stdio. h> int main() { int a[]={ 10, 28, 21, 13, 29, 3, 8, 88, 92, 32 }; int min, max, i; min=a[0]; max=a[0]; for (i=1; i< 10; i++) { if (a[i]>max) max=a[i]; if (a[i]<min) min=a[i]; } printf(" min = %d n max = %d n", min, max); return (0); }
Příklad 1 – varianta 2 #include <stdio. h> int main() { int a[]={ 10, 28, 21, 13, 29, 3, 8, 88, 92, 32 }; int min, max, i; min=a[0]; max=a[0]; for (i=1; i< 10; i=i+2) { if (a[i] < a[i+1] ) { if (a[i]<min) min=a[i]; if (a[i+1]>max) max=a[i+1]; } else { if (a[i]>max) max=a[i]; if (a[i+1]<min) min=a[i+1]; } } printf(" min = %d n max = %d n", min, max); return (0); }
- Počítáme vše 1 1 min=a[0]; max=a[0]; 1 N N-1 for (i=1; i< 10; i++) { N-1 0. . N-1 if (a[i]>max) max=a[i]; N-1 0. . N-1 if (a[i]<min) min=a[i]; }
- Počítáme pouze operace nad daty 1 1 min=a[0]; max=a[0]; … … … for (i=1; i< 10; i++) { N-1 0. . N-1 if (a[i]>max) max=a[i]; N-1 0. . N-1 if (a[i]<min) min=a[i]; }
- Počítáme pouze porovnání v datech … … min=a[0]; max=a[0]; … … … for (i=1; i< 10; i++) { N-1 … if (a[i]>max) max=a[i]; N-1 … if (a[i]<min) min=a[i]; }
Příklad 2 – varianta 1 #include <stdio. h> int sum(int a[], int n) { int i, suma=0; for (i=0; i<n ; i++ ) suma=suma+a[i]; return(suma); } int main() { int a[] = { 14, 22, 36, 8, 36, 42, 36 }; int b[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; int pocet=0, n=8, i; for (i=0; i<n; i++) { if (a[i]==sum(b, n)) pocet++; } printf("Pocet = %dn", pocet); return (0); }
Příklad 2 – varianta 2 #include <stdio. h> int sum(int a[], int n) { int i, suma=0; for (i=0; i<n ; i++ ) suma=suma+a[i]; return(suma); } int main() { int a[] = { 14, 22, 36, 8, 36, 42, 36 }; int b[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; int pocet=0, n=8, i; int pom=sum(b, n); for (i=0; i<n; i++) { if (a[i]==pom) pocet++; } printf("Pocet = %dn", pocet); return (0); }
q Matematicky: funkce f(n) patří do množiny O(g(n)) právě tehdy, když existuje n 0 a c > 0 pro které platí : f(n) < c g(n) pro n > n 0
q Matematicky: funkce f(n) patří do množiny O(g(n)) právě tehdy, když existuje n 0 a c > 0 pro které platí : f(n) > c g(n) pro n > n 0
q Matematicky: funkce f(n) patří do množiny O(g(n)) právě tehdy, když existuje n 0 a c 1 > 0 a c 2 > 0 pro které platí : c 1 g(n) < f(n) < c 2 g(n) pro n > n 0
• O(1) - indexování prvku v poli • O(log 2 N) - vyhledání prvku v poli metodou půlení intervalů • O(N) - vyhledání prvku v neseřazeném poli lineárním vyhledáváním • O(N log N) - seřazení pole reálných čísel podle velikosti (např. algoritmem Merge sort), rychlá Fourierova transformace FFT • O(n 2) - diskrétní Fourierova transformace • O(n 3) - Floyd-Warshalův algoritmus • O(2 N) - přesné řešení problému obchodního cestujícího
- Slides: 39