2017-08-06 3 views
-6

j'ai donc cette fonction récursive: T (n) = T (log (n)) + T (n log (n)) + nComment prouver ou infirmer que cette fonction est Ω (n^1.5)?

J'ai essayé plusieurs fois le résoudre, mais je n'a pas réussi. (trouver le Thêta) Fondamentalement, il me suffit de prouver ou de réfuter si c'est Omega de n^1,5 (Ω (n^1.5))

Aide sera appréciée, merci d'avance!

tl; dr:

donné T (n) = T (log (n)) + T (n-log (n)) + n

prouver ou à réfuter: T (n) = Ω (n^1,5)

+0

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. –

+0

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

+0

On dirait un meilleur ajustement pour cs.SE. –

Répondre

2

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:

enter image description here

Nous définissons une nouvelle fonction S(n) telle que:

enter image description here

On peut voir immédiatement qu'il a enter image description here termes (en ignorant hors par une etc.). Ainsi, si nous continuons à élargir:

enter image description here

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):

enter image description here

Nous pouvons également ignorer le second terme de manière réaliste. En appliquant cette approximation à chaque appel S(n):

enter image description here

Maintenant, nous savons que:

enter image description here

b peut évidemment être 1.5; donc:

enter image description here


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):

enter image description here

La relation est linéaire, ce qui signifie que

enter image description here

... confirmant le résultat donné.

+1

Note de mise en forme très mineure: '\ text {LHS}' (ou '\ mathit' si vous voulez l'italique) évite les problèmes d'espacement, car le mode LHS en mode mathématique est formaté comme une expression multiplicative (donnant l'espacement bizarre) entre 'LH' et' S'). Sinon, félicitations pour faire des maths sur StackOverflow en insérant des images, cela ne peut pas être pratique. (Une autre raison pour laquelle c'est une meilleure question pour cs.SE.) –

+0

@JeroenMostert ah merci pour le conseil; cette question déclenchait vraiment mon trouble obsessionnel-compulsif. – meowgoesthedog

+0

@JeroenMostert Merci beaucoup pour votre aide! – Elie