Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: złożoność obliczeniowa  (Przeczytany 2173 razy)

Edzio123

  • Gość
złożoność obliczeniowa
« dnia: 2014-02-08, 10:41:12 »
Chciłbym zapytać jak wyznacza się zlożoność obliczeniowa i czasową algorytmów.

Np. mamy 3 sposoby mnozenia macierzy:

algorytm ijk:
/* ijk */
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
for (k = 0; k < N; k++)
C[i*N+j] += A[i*N+k]*B[k*N+j];
algorytm ikj
for (i = 0; i < N; i++)
for (k = 0; k < N; k++)
for (j = 0; j < N; j++)
C[i*N+j] += A[i*N+k]*B[k*N+j];
algorytm bikj
for (i = 0; i < N; i+=16)
  for (k = 0; k < N; k+=16)
  for (j = 0; j < N; j+=16)
  for (ii = i; ii < i+15; ii++)
  for (kk = k; kk < k+15; kk++)
for (jj = j; jj < j+15; jj++)
C[ii*N+jj] += A[ii*N+kk]*B[kk*N+jj];
Wiemy, że mamy algorytmy takie jak np. O(N^2), itd. ale jak to się wyznacza?

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3056
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
złożoność obliczeniowa
« Odpowiedź #1 dnia: 2014-02-08, 15:13:23 »
Wyznaczasz liczbę właściwych operacji arytmetycznych (ostatnia linijka w każdym przykładzie) w funkcji N. Jeżeli wychodzi coś bardziej złożonego, to pozostawiasz składnik najszybciej rosnący w nieskończoności i opuszczasz stałe i mnożniki. Na przykład jak wychodzi ci 5N^3 + 2N -7 to jako finalne O przyjmujesz O(N^3).

Pierwsze przykłady są zatem O(N^3), trzeci jest dokładnie O( (N/16 )^3 * 16^3 ), co w sumie daje też O(N^3).

To po co te zabawy? Jest duże prawdopodobieństwo, że trzy wewnętrzne pętle wersji bikj zmieszczą się w cache'u procesora  i to da dodatkowe przyspieszenie. ALE nie ma to związku z notacją O - w tej notacji te algorytmy są całkowicie równoważne.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Edzio123

  • Gość
złożoność obliczeniowa
« Odpowiedź #2 dnia: 2014-02-08, 19:15:07 »
Paweł, wielkie dzięki za odpowiedź.
Jednakże czy mógłbyś mi dokładniej wyjaśnić skąd bierze się postać tych funkcji? Mam namysli:
5N^3 + 2N -7  oraz (N/16 )^3 * 16^3. NIe moge tego rozkminic. :(

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3056
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
złożoność obliczeniowa
« Odpowiedź #3 dnia: 2014-02-09, 09:08:35 »
Pierwszy wzór wziąłem "z czapy", żeby pokazać, że liczy się tylko najszybciej rosnący wyraz.

Drugi wzór (zakładem, że N jest wielokrotnością 16):
* W zewnętrznych 3 pętlach skaczesz co 16 wyraz z N. Dlatego jest (N/16)^3 obiegów.
* Dla każdego obiegu pętli zewnętrznych robisz stałe 16^3 obiegów 3 pętli wewnętrznych.
* Łącznie robisz iloczyn obu powyższych obiegów. Po wymnożeniu się pięknie redukuje do N^3
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy