Je m'intéresse à la meilleure façon d'enseigner la complétude NP aux majors en informatique. En particulier, devrions-nous l'enseigner en utilisant des réductions Karp ou en utilisant des réductions Turing?
Je pense que les concepts de complétude et de réduction de NP sont quelque chose que chaque étudiant en informatique devrait apprendre. Cependant, lorsque j'enseigne l'exhaustivité de NP, j'ai remarqué que l'utilisation des réductions de Karp a des inconvénients.
Tout d'abord, les réductions de Karp semblent être inutilement déroutantes pour certains étudiants. La notion intuitive d'une réduction est «si j'ai un algorithme pour résoudre le problème X, je peux aussi l'utiliser pour résoudre le problème Y». C'est très intuitif - mais cela correspond beaucoup mieux aux réductions de Turing qu'aux réductions de Karp. En conséquence, je vois des étudiants qui tentent de prouver l'exhaustivité de NP se laisser égarer par leur intuition et former une preuve incorrecte. Essayer d'enseigner les deux types de réductions et mettre l'accent sur cet aspect des réductions Karp ressemble parfois un peu à un formalisme inutile et prend du temps de classe inutile et l'attention des étudiants sur ce qui ressemble à un détail technique inessentiel; il n'est pas évident pourquoi nous utilisons cette notion plus restreinte de réduction.
Je comprends la différence entre les réductions de Karp et les réductions de Turing (Cook), et comment elles conduisent à différentes notions de complétude NP. Je me rends compte que les réductions de Karp nous donnent une granularité plus fine des distinctions entre les classes de complexité. Ainsi, pour une étude sérieuse de la théorie de la complexité, les réductions de Karp sont évidemment le bon outil. Mais pour les étudiants en informatique qui ne font qu'apprendre cela et ne vont jamais entrer dans la théorie de la complexité, je ne suis pas certain que cette distinction plus fine soit critique soit critique pour eux.
Enfin, en tant qu'étudiant, je me souviens m'être senti perplexe lorsque j'ai rencontré un problème comme la "tautologie" - par exemple, étant donné une formule booléenne, vérifiez s'il s'agit d'une tautologie. Ce qui était déroutant, c'est que ce problème est clairement difficile: tout algorithme polynomial pour le temps impliquerait que ; et résoudre ce problème est évidemment aussi difficile que de résoudre le problème de la tautologie. Cependant, même si intuitivement la tautologie est aussi difficile que la satisfiabilité, la tautologie n'est pas NP-difficile. Oui, je comprends aujourd'hui pourquoi c'est le cas, mais à l'époque je me souviens avoir été perplexe. (Ce qui m'est venu à l'esprit une fois que j'ai finalement compris était: pourquoi faisons-nous cette distinction entre NP-dur et co-NP-dur, de toute façon? Cela semble artificiel et peu motivé par la pratique. Pourquoi nous concentrons-nous plutôt sur le NP que la co-NP? Ils semblent tout aussi naturels. D'un point de vue pratique, la co-NP-dureté semble avoir essentiellement les mêmes conséquences pratiques que la NP-dureté, alors pourquoi sommes-nous tous accrochés à cette distinction? Oui, je connais la réponses, mais en tant qu'étudiant, je me souviens que cela rendait le sujet plus obscur et moins motivé.)
Voici donc ma question. Lorsque nous enseignons la complétude NP aux étudiants, est-il préférable d'enseigner en utilisant des réductions de Karp ou des réductions de Turing? Quelqu'un a-t-il essayé d'enseigner le concept de complétude NP en utilisant des réductions de Turing? Si oui, comment est-il allé? Y aurait-il des pièges ou des inconvénients non évidents si nous enseignions les concepts en utilisant les réductions de Turing et si nous sautions les problèmes conceptuels associés aux réductions de Karp?
En relation: voir ici et ici , qui mentionne que la raison pour laquelle nous utilisons des réductions de Karp dans la littérature est parce qu'elle nous permet de distinguer entre la dureté NP et la dureté co-NP. Cependant, il ne semble pas donner de réponse centrée sur une perspective pédagogique de savoir si cette capacité est critique pour les objectifs d'apprentissage d'une classe d'algorithmes qui devraient être suivis par chaque CS majeur. Voir également ici sur cstheory.SE , qui a une discussion similaire.