moltiplicazione di matrici usando l'approccio iterativo standard è O (n), perché si deve iterare n righe ed n colonne, e per ciascun elemento esegue una moltiplicazione vettore di una delle righe e una delle colonne , che richiede n moltiplicazioni e n-1 aggiunte.
codice Psuedo moltiplicare matrice a per b matrice e memorizza nella matrice 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;
}
}
Per una matrice booleana, come specificato nel problema, ed è utilizzato in luogo di moltiplicazione e OR al posto di Inoltre, in modo che diventi questo:
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;
}
}
la cosa da notare qui è che una volta che il nostro booleano "somma" è vero, siamo in grado di fermare il calcolo e l'inizio fuori dal ciclo più interno, perché ORing i valori successivi con tru Produrrà vero, quindi possiamo immediatamente sapere che il risultato finale sarà vero.
Per qualsiasi costante k
, il numero di operazioni prima che possiamo eseguire questa operazione anticipatamente (supponendo che i valori siano casuali) dipenderà da k e non aumenterà con n. Ad ogni iterazione ci sarà una (1/k) possibilità che il ciclo terminerà, perché abbiamo bisogno di due 1 per che ciò accada e la possibilità che ogni voce sia 1 è 1/k. Il numero di iterazioni prima di terminare seguirà un Geometric distribution dove p è (1/k) e il numero previsto di "prove" (iterazioni) prima del "successo" (interruzione del ciclo) non dipende da n (eccetto come limite superiore per il numero di prove) in modo che il ciclo più interno funzioni in tempo costante (in media) per un dato k, rendendo l'algoritmo complessivo O (n). La formula di distribuzione geometrica dovrebbe darti un'idea di cosa succede se k = n. Si noti che nella formula fornita su Wikipedia k è il numero di prove.
Quando k è grande, non uscirai quasi mai presto e il tuo algoritmo sarà O (n^3). –
@ La notazione O grande anonima definisce il comportamento * limitativo * della funzione. Non importa quanto sia grande k, poiché n tende all'infinito il tempo di esecuzione tenderà verso un O (n^2), per un dato k. – samgak
Hai ragione ... la domanda è confusa poiché parla di k essere costante e anche k = n. –