Sono interessato alla domanda sul modo migliore per insegnare la completezza NP alle major dell'informatica. In particolare, dovremmo insegnarlo usando le riduzioni di Karp o le riduzioni di Turing?
Sento che i concetti di completezza e riduzioni di NP sono qualcosa che ogni grande informatico dovrebbe imparare. Tuttavia, quando ho insegnato la completezza NP, ho notato che l'uso delle riduzioni di Karp ha alcuni aspetti negativi.
Prima di tutto, le riduzioni del Karp sembrano confondere inutilmente alcuni studenti. L'idea intuitiva di una riduzione è "se ho un algoritmo per risolvere il problema X, allora posso usarlo anche per risolvere il problema Y". È molto intuitivo, ma si associa molto meglio alle riduzioni di Turing che alle riduzioni di Karp. Di conseguenza, vedo gli studenti che stanno provando a dimostrare la completezza NP essere fuorviati dalla loro intuizione e formare una prova errata. Cercare di insegnare entrambi i tipi di riduzioni e enfatizzare questo aspetto delle riduzioni del Karp a volte sembra un po 'inutile formalismo e occupa inutili ore di lezione e l'attenzione degli studenti su ciò che sembra un dettaglio tecnico inessenziale; non è evidente il motivo per cui usiamo questa nozione più ristretta di riduzione.
Comprendo la differenza tra le riduzioni di Karp e le riduzioni di Turing (Cook) e il modo in cui portano a diverse nozioni di completezza NP. Mi rendo conto che le riduzioni del Karp ci danno una granularità più fine delle distinzioni tra le classi di complessità. Quindi, per uno studio serio della teoria della complessità, le riduzioni di Karp sono ovviamente lo strumento giusto. Ma per gli studenti di informatica che stanno solo imparando questo e non entreranno mai nella teoria della complessità, non sono sicuro che questa raffinata distinzione sia fondamentale per cui essere esposti.
Infine, da studente, ricordo di essermi sentito perplesso quando mi sono imbattuto in un problema come "tautologia" - ad esempio, data una formula booleana, controlla se si tratta di una tautologia. Ciò che confondeva era che questo problema era chiaramente difficile: qualsiasi algoritmo del tempo polinomiale avrebbe implicato che ; e risolvere questo problema è ovviamente difficile come risolvere il problema della tautologia. Tuttavia, anche se intuitivamente la tautologia è tanto dura quanto soddisfacente, la tautologia non è NP-dura. Sì, capisco oggi perché questo è il caso, ma al momento ricordo di esserne rimasto perplesso. (Ciò che mi è passato per la testa una volta che ho finalmente capito era: perché tracciamo questa distinzione tra NP-hard e co-NP-hard, comunque? Ciò sembra artificiale e non molto motivato dalla pratica. Perché ci concentriamo piuttosto su NP rispetto alla co-NP? Sembrano ugualmente naturali. Dal punto di vista pratico, la durezza NP-Co sembra avere essenzialmente le stesse conseguenze pratiche della durezza NP, quindi perché siamo tutti bloccati da questa distinzione? Sì, conosco il risposte, ma da studente, ricordo che questo ha reso la materia più arcana e scarsamente motivata.)
Quindi, la mia domanda è questa. Quando insegniamo la completezza NP agli studenti, è meglio insegnare usando le riduzioni Karp o le riduzioni di Turing? Qualcuno ha provato a insegnare il concetto di completezza NP usando le riduzioni di Turing? Se è così, come è andata? Ci sarebbero insidie o svantaggi non ovvi se insegnassimo i concetti usando le riduzioni di Turing e saltassimo le questioni concettuali associate alle riduzioni di Karp?
Correlati: vedi qui e qui , che menziona che il motivo per cui usiamo le riduzioni di Karp in letteratura è perché ci consente di distinguere tra durezza NP e durezza NP-co. Tuttavia, non sembra dare alcuna risposta incentrata su una prospettiva pedagogica se questa capacità sia critica per gli obiettivi di apprendimento di una classe di algoritmi che dovrebbe essere presa da ogni CS maggiore. Vedi anche qui su cstheory.SE , che ha una discussione simile.