Disons que nous voulons analyser le temps d'exécution des algorithmes. Parfois, nous disons que nous voulons trouver le temps d'exécution d'un algorithme lorsque la taille d'entrée est n et dans le pire des cas, il est noté O (n). Parfois, même si je vois des livres / articles disant que nous devons trouver l' heure prévue d'un algorithme. Parfois aussi, le temps de fonctionnement moyen est utilisé.
Qu'est-ce que le «temps prévu»? Dans quels cas est-il utile de trouver l' heure prévue au lieu de l'heure la plus défavorable?
Edit : je pense qu'il y a une différence subtile entre le temps d'exécution prévu et le temps de fonctionnement moyen, mais je ne suis pas sûr. Grâce à ce post, je veux connaître la différence exacte, le cas échéant.
Réponses:
Le temps attendu est simplement le temps d'exécution moyen, attendu , de l'algorithme utilisant l' entrée prévue .
Supposons que vous ayez quelques millions d'enregistrements d'utilisateurs et que vous vouliez les trier, vous voudrez peut-être utiliser un algorithme qui est le plus approprié pour votre entrée, et en tant que tel donne le meilleur temps d' exécution attendu , par opposition à un algorithme qui a mieux pire temps de fonctionnement mais pire temps de fonctionnement prévu .
Parfois, par exemple, les facteurs constants de la complexité temporelle d'un algorithme sont si élevés qu'il est logique d'utiliser des algorithmes avec une complexité temporelle pire mais des facteurs constants plus petits, car cela vous donne un meilleur temps d' exécution attendu avec une petite entrée, même si cela obtenir horriblement surperformé avec une plus grande entrée.
Un meilleur exemple serait peut-être l'algorithme de tri rapide classique, qui a le pire temps de fonctionnement de O (n²) mais le temps de fonctionnement moyen prévu de O (n log n), quelle que soit l'entrée . En effet, l'algorithme utilise (ou plutôt peut utiliser , selon l'implémentation) la randomisation. C'est donc un soi-disant algorithme aléatoire . Il fonctionne un peu différemment à chaque appel même avec la même entrée. En tant que tel, il n'y a pas d'entrée universelle la plus défavorable pour la mise en œuvre, car l'entrée la plus défavorable dépend de la façon dont l'algorithme choisit le pivot pour diviser l'entrée donnée. Et en tant que tel, on ne peut pas simplement fournir une entrée prédéfinie provoquant le pire temps de fonctionnement. C'est souvent le cas avec des algorithmes randomisés, qui visent un meilleur temps de fonctionnement moyen, quelle que soit l'entrée.
Il s'agit d'utiliser le bon algorithme pour l'entrée à portée de main.
la source
Le temps d'exécution prévu d'un algorithme randomisé est un concept bien défini, tout comme le pire temps d'exécution. Si un algorithme est randomisé, son temps d'exécution est également aléatoire, ce qui signifie que nous pouvons définir la valeur attendue de son temps d'exécution.
Un exemple bien connu est Quicksort: si nous choisissons les pivots au hasard, nous pouvons prouver que son temps d'exécution prévu devient O (n log n), même si son pire temps d'exécution reste O (n ^ 2). Un exemple où la randomisation est très puissante est le plus petit problème de cercle englobant: il existe un algorithme simple dont le pire temps de fonctionnement est O (n ^ 3), mais en attendant, son temps de fonctionnement n'est que O (n).
Le temps de fonctionnement moyen est généralement utilisé pour parler du comportement d'un algorithme «pour la plupart des entrées». Nous définissons un moyen de générer aléatoirement une entrée, par exemple, nous remplissons un tableau avec des nombres aléatoires, ou nous permutons au hasard les nombres de 1 à n (donc pas de doublons), ou nous retournons une pièce et obtenons soit un ensemble décroissant ou croissant de Nombres. Le temps d'exécution moyen d'un algorithme pour cette distribution aléatoire d'entrées est alors le temps d'exécution attendu de l'algorithme (auquel cas l'algorithme peut ne pas être randomisé, mais l'entrée l'est).
À titre d'exemple: il existe des problèmes géométriques pour lesquels il existe des algorithmes qui semblent bien fonctionner à première vue, jusqu'à ce que vous découvriez une façon très étrange de distribuer, disons, les lignes d'entrée. Si vous supposez que les lignes sont distribuées de manière aléatoire, alors il se peut que ces scénarios étranges se produisent extrêmement peu, donc votre algorithme finit par être bon.
Contraste: le temps d'exécution prévu concerne la façon dont un algorithme fonctionne `` à moins que vous n'ayez pas de chance '' - réessayer le même algorithme sur la même entrée mais avec des choix aléatoires différents peut entraîner sa résolution beaucoup plus rapide. Le temps d'exécution moyen parle de la performance d'un algorithme «pour la plupart des entrées» - réessayer le même algorithme sur la même entrée ne vous aidera pas (sauf peut-être si l'algorithme est également randomisé).
la source