Le 4 on s'en fout, Theta est défini à une constante près:
Theta(4*n) = Theta(n) = 4 * Theta(n) ...
Mais je ne suis pas sûr de te suivre dans ton raisonnement. Comment P disparait de l'équation ? Cela voudrait dire que la complexité asymptotique est indépendante de P ?
(j'utilise 'O' au lieu de 'Theta' car c'est plus lisible, mais il s'agit vraiment de Theta)
T(n,p) = 2 T(n/2,p/2) + O(n)
--> T(n/2,p/2) = 2 T(n/4,p/4) + O(n/2)
--> T(n,p) = 4 T(n/4,p/4) + 2 O(n)
--> T(n,p) = 8 T(n/8,p/8) + 3 O(n)
...
On sait que T(n,1) = O(n).
Comme p <= n, on arrivera à p=1 avant d'arriver à n=1
--> T(n,p) = p T(n/p, 1) + O(log p) * O(n)
--> T(n,p) = p O(n/p) + O(n log p)
--> T(n,p) = O(n) + O(n log p)
--> T(n,p) = O(n log p)
Mais j'ai fait l'hypothèse que la matrice est à chaque fois divisée en 2 parties égales (d'où le n/2 dans la récurrence), cette démonstration n'est donc pas générale. Elle nous donne donc tout au plus une borne inférieure de T(n,p).
Essayons un cas particulier, pour nous faire une idée:
supposons que la matrice est une matrice-ligne (un vecteur): 1 x n. Prenons le cas où, à chaque division, un seul élément est séparé du reste.
T(n,p) = T(n-1, p/2) + T(1,p/2) + O(n)
--> T(n-1,p/2) = T(n-2, p/4) + T(1, p/4) + O(n-1)
et T(1,p) = O(p/2) (il faut bien dire à tous ces processeurs sauf 1 qu'ils ne doivent rien faire)
--> T(n,p) = T(n-2, p/4) + O(p/4) + O(n-1) + O(p/2) + O(n)
...
--> T(n,p) = T(n-log p, 1) + [O(p/2) + O(p/4) + O(p/8) + ... + O(1)] + [O(n) + O(n-1) + O(n-2) + ... + O(n-log p)]
log p est négligeable par rapport à n (puisque p <= n)
--> T(n,p) = O(n) + O(p) + O(n)*log p
O(p) <= O(n)
--> T(n,p) = O(n*log p)
Même résultat...
Cela me donne une idée pour trouver une borne supérieure dans le cas général:
T(n,p) = T(n1,p/2) + T(n-n1,p/2) + O(n) ; 0 < n1 < n
En réalité, la valeur de n1 sera plus contrainte: elle sera toujours un multiple du nombre de lignes ou de colonnes de la matrice considérée.
T(n1,p/2) = T(n2,p/4) + T(n1-n2,p/4) + O(n1) ; 0 < n2 < n1
T(n-n1,p/2) = T(n3,p/4) + T(n-n1-n3,p/4) + O(n-n1) ; 0 < n3 < n-n1
-->
T(n,p) = T(n2,p/4) + T(n1-n2,p/4) + O(n1) + T(n3,p/4) + T(n-n1-n3,p/4) + O(n-n1) + O(n)
T(n,p) = T(n2,p/4) + T(n1-n2,p/4) + T(n3,p/4) + T(n-n1-n3,p/4) + 2*O(n)
Cela commence à faire bcp de paramètres, essayons de voir vers quoi nous allons
Après (log p) étapes, nous aurons
T(n,p) = S + O(n*log p)
où S est une somme de p termes de la forme T(n_i, 1) (avec n_i qui varie)
T(n_i, 1) = O(n_i).
Essayons donc de majorer cette somme...
Cela n'est pas bien compliqué... Vu que l'on divise chaque fois la matrice en sous-matrices distinctes, la somme de tous les n_i sera toujours égale à n...
Par exemple, dans le développement ci-dessus: n2 + n1-n2 + n3 + n-n1-n3 = n
Donc T(n,p) = O(n) + O(n*log p) = O(n*log p)
Ouf
Nous y voilà. La borne supérieure est égale à la borne inférieur donc T(n,p) = O(n*log p) dans le cas général.
C'est peut-être pas très rigoureux, mais si qq'un voit une faute dans le raisonnement, je serais intéressé de la connaître.
Message édité par dividee le 22-08-2005 à 00:28:15