Мене цікавить питання, як найкраще навчати NP-повноті спеціальностей з інформатики. Зокрема, чи слід вчити цього за допомогою скорочення Карпа чи використання скорочень Тьюрінга?
Я відчуваю, що поняття завершеності NP і скорочення - це те, чого повинен вивчити кожен основний інформатик. Однак, навчаючи NP-повноти, я помітив, що використання скорочення Карпа має деякі недоліки.
Перш за все, скорочення Карпа, здається, непотрібно бентежить деяких студентів. Інтуїтивне поняття скорочення - "якщо у мене є алгоритм для вирішення проблеми X, то я можу використовувати його і для вирішення проблеми Y". Це дуже інтуїтивно - але це набагато краще відображає скорочення Тьюрінга, ніж скорочення Карпа. Як результат, я бачу, що студенти, які намагаються довести повноту NP, збиваються своєю інтуїцією та формують неправильне підтвердження. Намагаючись навчити обидва види скорочень і підкреслюючи цей аспект скорочення Карпа, іноді трохи схоже на непотрібний формалізм і займає зайвий час у класі та увагу учнів на те, що відчуваєш себе несуттєвою технічною деталлю; не очевидно, чому ми використовуємо це більш обмежене поняття скорочення.
Я розумію різницю між скороченнями Карпа та скороченням Тюрінга (Кука), і як вони призводять до різних уявлень про повноту NP. Я розумію, що скорочення Карпа дають нам більш точну деталізацію відмінностей між класами складності. Отже, для серйозного вивчення теорії складності скорочення Карпа, очевидно, є правильним інструментом. Але для студентів з інформатики, які тільки цього вчаться і ніколи не будуть вступати в теорію складності, я не впевнений, чи є ця більш чітка відмінність критично важливою для них.
Нарешті, як студент, я пам’ятаю, що я був спантеличений, коли зіткнувся з такою проблемою, як «тавтологія» - наприклад, задавши булеву формулу, перевірте, чи це тавтологія. Заплутаним було те, що ця проблема очевидно складна: будь-який поліномальний алгоритм для неї означатиме, що; і вирішити цю проблему, очевидно, так само важко, як і розв’язати проблему тавтології. Однак, хоча інтуїтивно тавтологія є такою ж важкою, як і задоволеність, тавтологія не є важкою для NP. Так, я сьогодні розумію, чому це так, але я пам’ятаю, що мене це спантеличило. (Що пройшло через мою голову, коли я, нарешті, зрозумів: «Чому ми все-таки робимо цю різницю між NP-Hard і Co-NP-Hard? Це здається штучним і не дуже добре мотивованим практикою. Чому ми орієнтуємось саме на NP ніж спів-NP? Вони здаються однаково природними. З практичної точки зору твердість co-NP має, по суті, такі ж практичні наслідки, як і твердість NP, тому чому ми всі зависаємо від цього розрізнення? Так, я знаю відповіді, але, будучи студентом, я пам’ятаю, що це просто змусило тему відчути себе більш затаємниченою і погано мотивованою.
Отже, моє запитання таке. Коли ми навчаємо студентів незавершеності NP, чи краще вчити використовувати скорочення Карпа чи скорочення Тьюрінга? Хтось намагався викладати концепцію повноти NP з використанням скорочень Тьюрінга? Якщо так, як це пішло? Чи були б якісь неочевидні підводні камені чи недоліки, якби ми навчали концепцій із використанням скорочень Тьюрінга та пропускали концептуальні проблеми, пов’язані зі скороченням Карпа?
Пов'язане: дивіться тут і тут , де згадується, що причина, чому ми використовуємо скорочення Карпа в літературі, полягає в тому, що це дозволяє нам розрізняти NP-твердість і твердість co-NP. Однак, схоже, це не дає жодної відповіді, зосередженої на педагогічній перспективі того, чи є ця здатність критичною для навчальних цілей класу алгоритмів, які повинні бути прийняті кожним спеціалістом CS. Дивіться також тут, на cstheory.SE , який має подібну дискусію.