Mnożenie macierzy przy użyciu standardowego podejścia iteracyjnego to O (n), ponieważ trzeba wykonać iterację po n wierszach i n kolumnach, a dla każdego elementu wykonać wektor mnożąc jeden z wierszy i jedną z kolumn , która przyjmuje n mnożeń i n-1 dodatków.
kod Psuedo do mnożenia macierzy przez macierzy B i przechowywać w macierzy C:
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
int sum = 0;
for(m = 0; m < n; m++)
{
sum += a[i][m] * b[m][j];
}
c[i][j] = sum;
}
}
przypadku logicznej matrycy, jak określono w problemu, i jest stosowany w miejsce mnożenie i lub w miejscu Ponadto, dzięki czemu staje się to:
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
boolean value = false;
for(m = 0; m < n; m++)
{
value ||= a[i][m] && b[m][j];
if(value)
break; // early out
}
c[i][j] = value;
}
}
rzeczą godną uwagi jest to, że gdy nasza logiczna „suma” jest prawdziwe, możemy zatrzymać obliczanie i wcześnie z najbardziej wewnętrznej pętli, ponieważ Oring żadnych kolejnych wartości z TRU e będzie produkować prawdziwe, więc możemy od razu wiedzieć, że ostateczny wynik będzie prawdziwy.
Dla każdej stałej k
, liczba operacji, zanim będziemy mogli to zrobić wcześnie (zakładając, że wartości są losowe) będzie zależeć od k i nie wzrośnie za pomocą n. Przy każdej iteracji będzie szansa, że pętla się zakończy, ponieważ potrzebujemy dwóch 1s, aby to się stało, a szansa na to, że każda pozycja jest równa 1 to 1/k. Liczba iteracji przed zakończeniem będzie następować po Geometric distribution, gdzie p jest (1/k) , a spodziewana liczba "prób" (iteracji) przed "sukcesem" (wyjściem z pętli) nie zależy od n (z wyjątkiem górnego ograniczenia dla liczby prób), tak że najgłębsza pętla działa w stałym czasie (średnio) dla danego k, tworząc ogólny algorytm O (n). Formuła rozkładu geometrycznego powinna dać ci pewien wgląd w to, co się dzieje, gdy k = n. Zauważ, że we wzorze podanym na Wikipedii k jest liczbą prób.
Gdy k jest duże, prawie nigdy nie wyjdziesz wcześniej, a Twój algorytm będzie równy O (n^3). –
@Anonimowy zapis Big O definiuje zachowanie * ograniczające * funkcji. Bez względu na to, jak duże jest k, ponieważ n dąży do nieskończoności, czas wykonania będzie dążył do O (n^2), dla danego k. – samgak
Masz rację ... pytanie jest mylące, ponieważ mówi o tym, że k jest stała, a także k = n. –