Avons-nous des classes de complexité concernant, disons, la complexité moyenne des cas? Par exemple, existe-t-il une classe de complexité (nommée) pour les problèmes qui prennent le temps polynomial attendu pour se décider?
Une autre question considère la meilleure complexité de cas , illustrée ci-dessous:
Existe-t-il une classe de problèmes (naturels) dont la décision nécessite au moins un temps exponentiel?
Pour clarifier, considérons un langage complet pour EXP . De toute évidence, toutes les instances de nécessitent pas de temps exponentiel: il existe des instances qui peuvent être décidées même en temps polynomial. Donc, la meilleure complexité des cas de n'est pas le temps exponentiel.L
EDIT: Depuis que plusieurs ambiguïtés sont apparues, je veux essayer de le clarifier encore plus. Par complexité du «meilleur cas», j'entends une classe de complexité dont la complexité des problèmes est limitée par une fonction. Par exemple, définissez BestE comme la classe de langages qui ne peut pas être décidée en temps inférieur à une certaine exponentielle linéaire. Symboliquement, notons une machine de Turing arbitraire, et , et des nombres naturels:c n 0 n
où indique le temps qu'il faut avant que s'arrête sur l'entrée .M x
J'accepte que définir une telle classe de problèmes est très étrange, car nous exigeons que chaque machine Turing , quelle que soit sa puissance, ne puisse pas décider du langage en temps moins qu'une exponentielle linéaire.
Remarquez cependant que la contrepartie polynomiale-temps ( BestP ) est naturelle, car chaque machine de Turing nécessite du tempspour au moins lire son entrée.
PS: Peut-être, au lieu de quantifier comme "pour toutes les machines de Turing ", nous devons le limiter à certaines classes de machines de Turing prédéfinies, telles que les machines de Turing à temps polynomial. De cette façon, nous pouvons définir des classes comme , qui est la classe de langages nécessitant au moins un temps quadratique pour être décidé sur des machines de Turing à temps polynomial.B e s t ( n 2 )
PS2: On peut également considérer l'équivalent de la complexité du circuit, dans lequel nous considérons la taille / profondeur du circuit le moins pour décider d'une langue.
la source
Réponses:
Bien que je ne puisse pas vraiment analyser vos définitions, vous devez savoir que des hiérarchies temporelles beaucoup plus fortes sont connues, en particulier des hiérarchies temporelles "presque partout".
Voici l'énoncé formel: pour chaque temps lié , il existe un langage L ∈ T I M E [ T ( n ) ] avec la propriété que tout algorithme déterministe qui reconnaît correctement L doit s'exécuter dans le temps asymptotiquement supérieur à t ( n ) sur toutes les entrées, mais en nombre fini, pendant un temps suffisamment petit t ( n ) .T( n ) L ∈ TjeME[ T( n ) ] L t ( n ) t ( n )
"Suffisamment petit" signifie .t ( n ) logt ( n ) ≤ o ( T( n ) )
Supposons que nous choisissons pour un exemple, et d' obtenir une langue inintelligible L . Ensuite, tout algorithme qui reconnaît correctement L doit prendre au moins 2 n / n 2 de temps sur toutes les entrées au-delà d'une certaine longueur. Cela semble être ce que vous recherchez dans votre classe BestE.T( n ) = 2n L L 2n/ n2
Référence:
la source
Il existe un certain nombre de classes qui tentent d'aborder diverses notions de complexité de cas moyen. Au Complexity Zoo, certaines classes qui pourraient vous intéresser sont:
AvgP
HeurP
DistNP
(NP, échantillonnable P)
Arora / Barak couvre de nombreuses classes similaires (dans Ch 18), définissant distP, distNP et sampNP.
La relation exacte entre toutes ces classes est caractérisée par Five Worlds d'Impagliazzo, qui a déjà été posée dans une autre question .
En ce qui concerne la question de la complexité du «meilleur cas», je ne suis pas sûr de bien comprendre ce que vous voulez dire. Vous recherchez de l' EXP ?
Si vous voulez dire des classes de complexité définies en termes de meilleur temps d'exécution de cas sur toutes les instances, ce n'est pas une très bonne mesure de complexité a priori, car vous ne regarderiez que les cas triviaux d'un problème donné.
la source
(Mise à part historique: la notion d'immunité a été développée pour la première fois par Post en 1944 dans la théorie de la calculabilité, bien avant que P ne soit même défini. le mot «immunisé» signifie généralement «immunisé contre les ensembles calculables». Dans ce cadre, l'immunité équivaut à «immunisé contre les ensembles ce», car chaque ensemble infini ce contient un infini calculable. Je crois que l'article de Post a également été le premier à introduire le notion de réduction de plusieurs, mais je ne pouvais pas le jurer.)
la source
Différents cas ont plus de sens lorsque l'on parle d'algorithmes, pas de problèmes. D'un autre côté, les classes de complexité concernent les problèmes, pas les algorithmes. Par conséquent, la classe de complexité étant toujours le pire des cas pour tout algorithme est due à la définition.
Dans la complexité, votre objectif est de connaître le nombre de ressources nécessaires pour résoudre n'importe quelle instance d'un problème donné. Par conséquent, vous savez que pour une instance et un algorithme donnés, vous allez avoir besoin de ces ressources et rien de plus.
Dans l'analyse d'algorithmes, votre objectif est de vous assurer que votre algorithme a une limite supérieure pour une ressource, dans n'importe quel cas du problème. Une limite triviale est la classe de complexité du problème, car aucun algorithme utile (celui qui fait des étapes inutiles) ne prend plus de temps que cela. Cependant, vous pouvez améliorer cette limite compte tenu des spécificités de l'algorithme.
Quant au meilleur des cas, il est trivial pour chaque problème de trouver le moins de ressources nécessaires. Supposons que l'entrée est de longueur O (n) et la sortie de longueur O (m). Ensuite, le TM M suivant s'exécute toujours en O (n) + O (m) dans le meilleur des cas:
M {entrée, instance, solution}
la source
la source