Mon arrière-plan mathématique n'est pas si bon, c'est ma tentative d'écrire le code Java avec une proportion d'exécution à une entrée différente.
avec n ^ 2/3. Depuis n ^ 2/3 = racine cube n * cube root n, donc je peux écrire p>
public int fibonnaci(int n) { if (n <= 1) { return 1; } else { return fibonnaci(n - 2) + fibonnaci(n - 1); } }
avec 4 ^ n. Puis-je utiliser la méthode FIBonnaci? P>
public void test(int n){ for (int i = 0; i*i*i < n; i++) { for (int j = 0; j*j*j < n; j++) { count ++; } } }
3 Réponses :
Vous écrivez simplement n'importe quel code qui prend du temps-complexité de cette Big-O Lié? P>
que pour # 1, oui, il faudrait mais pour # 2, votre code prendrait Référence: Complexité de calcul de la séquence Fibonacci P> o (n ^ (2/3)) code>. p>
O (2 ^ n) code> et
theta (1.6 ... ^ n) code> et 1.6 .. est le Numéro de ratio doré célèbre. P>
Le premier est correct fort>, et vraiment bien pensé. Donc, vous avez: p> De cela, ce serait une supposition raisonnable que le calcul de la FIB (i) prend "environ" (en fait, un peu moins de) 2 fois le temps de calculer FIB (I-1). Par conséquent, vous pourriez "deviner" que o (#fib (i)) = O (2 ^ i). C'est la bonne réponse, que vous pouvez prouver facilement par induction. P> Juste pour terminer sur la séquence Fibonacci, il y a beaucoup d'algorithmes plus rapides pour calculer le N-ème numéro. Par exemple, un algorithme avec du temps linéaire (IE, O (N)) est de mémoiser cette fonction que vous avez écrite (c'est-à-dire que vous pouvez consulter une carte pour vérifier si elle connaît le résultat pour N, est donc ainsi de retourner immédiatement, sinon, calculez Il le stocke et le retourner). Il y a aussi un Formule fermée pour calculer la n-e fib fort>, donc un algorithme de temps constant (c'est-à-dire O (1)). P> enfin, Un exemple de O (n ^ 4) fort> algorithme est quelque chose avec 4 boucles intérieures, chaque boucle en marche "à propos de" n fois. P> Par exemple, calculez le volume de n cubes de côté N (de manière non optimale): P>
int volume = 0;
for (int cube = 0; cube < n; cube++)
for (int x = 0; x < n; x++)
for (int y = 0; y < n; y++)
for (int z = 0; z < n; z++)
volume++;
return volume;
@Louiswasserman, bien noté. Cependant, lorsque j'ai répondu à la question, on m'a posé une question sur N ^ 4, l'OP l'a changé plus tard, après avoir écrit cela. Désolé pour le dérangement.
Ce n'est pas vraiment une réponse, mais voici un croquis d'une solution "triche" au problème de la fourniture d'un exemple de programme qui prend Créez un objet de fonction Java pour évaluer transmettez-le comme paramètre sur la méthode suivante: p> li>
OL> O (f (n)) code> temps;
f (n) code> pour un
n code>: p> li>
public void computeOrderFN(int n, FunctionInt2Int fn) {
int count = fn.evaluate(n);
for (int i = 1; i < count; i++) {
// Do something O(1) that the compiler can't optimize away)
}
}
2) Fibonacci - C'est plus O (2 ^ N) ISO O (N ^ 4). Utilisez 4 personnes nichées pour des boucles (qui sont passées de 1 à N incrémentées de 1) comme exemple de O (n ^ 4) ;-) et 1) est un exemple intelligent :)