La multiplication matricielle utilisant l'approche itérative standard est O (n), car vous devez parcourir sur n lignes et n colonnes et pour chaque élément multiplier une des lignes et une des colonnes , qui prend n multiplies et n-1 additions.
code Psuedo pour multiplier la matrice A par la matrice b et stocker dans une 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;
}
}
Pour une matrice booléenne, comme spécifié dans le problème, et est utilisé dans lieu de multiplication et ou à la place de de plus, il devient ceci:
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 chose à remarquer ici est qu'une fois que notre booléen « somme » est vrai, nous pouvons arrêter le calcul et le début de la boucle la plus interne, car ORing toutes les valeurs ultérieures avec tru e va produire vrai, donc nous pouvons immédiatement savoir que le résultat final sera vrai.
Pour toute constante k
, le nombre d'opérations avant que nous puissions le faire plus tôt (en supposant que les valeurs soient aléatoires) va dépendre de k et n'augmentera pas avec n. A chaque itération, il y aura une chance (1/k) que la boucle se termine, parce que nous avons besoin de deux 1 pour que cela se produise et que la chance de chaque entrée soit de 1/k. Le nombre d'itérations avant de se terminer suivra un Geometric distribution où p est (1/k) , et le nombre attendu d '"essais" (itérations) avant "succès" (rupture de la boucle) ne dépend pas de n (sauf en tant que limite supérieure pour le nombre d'essais), de sorte que la boucle la plus interne s'exécute en temps constant (en moyenne) pour un k donné, rendant l'algorithme global O (n). La formule de distribution géométrique devrait vous donner un aperçu de ce qui se passe si k = n. Notez que dans la formule donnée sur Wikipedia k est le nombre d'essais.
Lorsque k est grand, vous ne quitterez presque jamais tôt et votre algorithme sera O (n^3). –
@Anonyme La notation Big O définit le comportement * limitant * de la fonction. Quelle que soit la taille de k, lorsque n tend vers l'infini, le temps d'exécution tendra vers O (n^2), pour un k donné. – samgak
Vous avez raison ... la question est confuse car elle parle de k étant constant et aussi de k = n. –