0
votes

Pourquoi cet algorithme de recherche factorielle n'est-il pas une complexité de temps d'exécution?


1 commentaires

O (n!) Ne pas vouloir dire n! lui-même. Cela signifie qu'il est proportionnel à n !. Les facteurs factoriels se développent rapidement, il n'est donc pas pratique d'aller très haut, mais peut-être que vous souhaitez table n contre les opérations versus n! et voir si cela rend la relation crédible.


3 Réponses :


-1
votes

La fonction factorielle doit être: xxx

et c'est O (n). L'exemple concerne O (n!), Qui est une complexité temporelle dépend de n !, Not N! lui-même.


2 commentaires

Cela calculille simplement la factorielle, sa complexité d'exécution n'est pas O (n!)


@Haysstanford Je pensais que vous êtes déroutant si la fonction factorielle est O (n!). J'ai édité la réponse. La fonction dans votre exemple n'est pas nommée factorielle.



0
votes

Vous comptez des opérations de boucle sur chaque niveau de récursivité (c'est-à-dire des appels de fonction de comptage, à l'exception de la la plus externe), au lieu de compter les appels de fonction les plus profonds. Par conséquent, vous obtenez un nombre beaucoup plus élevé que celui des facteurs simples que vous attendiez: xxx pré>

Les expansions d'arbitraire n code> peuvent être trouvées dans https://oeis.org/a007526 . Celles-ci sont toujours limitées par o (n!) Code> strong> mais - voir les formules fermées dans le lien, par exemple. étage (e * n! - 1) code> ou n! * Sum_ {k = 0..n-1} 1 / k! Code>, qui sont clairement dominés par le terme n! Code> terme. (Comptage de toutes les invocations vous donne https://oeis.org/a000522 , n! * Sum_ { k = 0..n} 1 / k! code>). P>

Pour obtenir exactement un factoriel, vous auriez besoin de compter uniquement les appels de fonction les plus internes: P>

var operations = 0;

function factorial(n) {
    if (n == 0) operations++;
    for (let i = 0; i < n; i++) {
        factorial(n - 1);
    }
}

console.log(factorial(4))
console.log('operations: ', operations) // prints 64 operations


2 commentaires

Cela compte juste le nombre de factorielle (n) appels lorsque n == 0 . Cela ne se produit qu'à la fin de la boucle, une fois que plusieurs opérations ont été complétées.


@Haysstanford Oui. Et comme ces appels les plus intérieurs sont les plus nombreux, ils dominent la complexité d'exécution. Je voulais juste montrer cela parce qu'il y a exactement n! d'entre eux, car cela semble avoir été le numéro que vous recherchiez.



2
votes

Il y a probablement une bonne analyse théorique, mais voici un empirique. foiré dans des feuilles J'ai exécuté le programme pour les numéros 0 à 12 et les opérations suivies. Notez que très rapidement les opérations ont tendance à être vraiment proches de n fois l'entrée précédente. Et le ratio d'opérations à n! semble avoir tendance à e. Ainsi, si la limite d'opérations est E (ou une certaine constante) Times N!, Nous sommes O (n!). Nous n'avons pas besoin de = n! faire cela donc.


1 commentaires

Cela fait un peu plus de sens, considérant que le Big O a tendance à être une gamme plutôt que le temps d'exécution réel dans tous les cas pour un algorithme.