en supposant que T(n)
ne devient pas soudainement négatif à une valeur de n
, nous pouvons donner une borne inférieure du côté gauche si l'on néglige le premier terme:
Nous définissons une nouvelle fonction S(n)
telle que:
On peut voir immédiatement qu'il a termes (en ignorant hors par une etc.). Ainsi, si nous continuons à élargir:
A ce stade, puisque nous savons que log(n) << n
pour tout grand n
, on peut appliquer une expansion Taylor au troisième terme de l'appel récursif à S(n)
:
Nous pouvons également ignorer le second terme de manière réaliste. En appliquant cette approximation à chaque appel S(n)
:
Maintenant, nous savons que:
b
peut évidemment être 1.5; donc:
EDIT: quelques tests numériques pour confirmer ce résultat -
Code:
uint64_t T(int n) {
return n <= 1 ? 0 : T(n - log(n)) + T(log(n)) + (uint64_t)n;
}
Résultats:
N T(N)
--------------------------
2 2
4 6
8 18
16 60
32 181
64 578
128 1911
256 6331
512 22011
1024 79304
2048 279719
4096 1016217
8192 3814210
16384 13902832
32768 51540129
65536 195366441
131072 732435510
262144 2744988819
524288 10457580914
1048576 39910628826
Plo t de N^2/log(N)
contre T(N)
:
La relation est linéaire, ce qui signifie que
... confirmant le résultat donné.
Il est probable que ce vote ait été rejeté parce qu'il n'y a aucun effort démontré de votre part pour résoudre le problème. –
J'ai été googling et stackoverflowing la question pendant 2 jours maintenant. Il n'y a simplement rien de semblable à celui-ci. De nombreux exemples utilisent des constantes telles que: T (n) = T (n/4) + T (3n/4) + n. Mais aucun qui utilise FUNCTIONS dans l'appel lui-même. Il est plus difficile d'analyser les fonctions qui ont finalement quelque chose à voir avec (log (n-log (n-log))) (et ainsi de suite) – Elie
On dirait un meilleur ajustement pour cs.SE. –