Di recente, ho vissuto la dolorosa esperienza divertente di spiegare in modo informale il concetto di complessità computazionale a un giovane programmatore autodidatta di talento, che non aveva mai seguito un corso formale di algoritmi o complessità. Non sorprende che molte nozioni all'inizio sembrassero strane ma avevano senso con alcuni esempi (PTIME, intrattabilità, incomputabilità) , mentre altre sembrano diventare più naturali (classificazione dei problemi tramite riduzioni, tempo e spazio come risorse, analisi asintotica) . Tutto stava andando per il meglio finché non ho ammesso per sbaglio quel SATpuò essere risolto efficacemente * in pratica ... E proprio così, li ho persi. Non importava quanto convincentemente stavo cercando di discutere per la teoria, il ragazzo era convinto che fosse tutta una matematica di merda artificiale che non gli sarebbe importato. Bene...
¯ \ _ (ツ) _ / ¯
No, non avevo il cuore spezzato, né mi importava davvero di quello che pensava, non è questo il punto di questa domanda. La nostra conversazione mi ha fatto pensare a una domanda diversa,
Quanto ne so davvero di problemi teoricamente irrisolvibili (complessità del tempo superpolinomiale) ma praticamente risolvibili (tramite euristica, approssimazioni, solutori SAT, ecc.)?
Ho capito, non molto. So che ci sono alcuni solutori SAT molto efficienti che risolvono in modo efficiente casi enormi, che Simplex funziona alla grande in pratica e forse qualche altro problema o algoritmo. Potete aiutarmi a dipingere un quadro più completo? Quali problemi noti o addirittura classi di problemi rientrano in questa categoria?
TL; DR: Quali sono i problemi che sono risolvibili in pratica controintuitivamente? Esiste una risorsa (aggiornata) per saperne di più? Abbiamo una caratterizzazione per loro? E, infine, come domanda di discussione generale, non dovremmo?
EDIT # 1: Nel tentativo di rispondere alla mia ultima domanda di discussione su una simile caratterizzazione , sono stato introdotto all'analisi semplificata degli algoritmi, un concetto introdotto da Daniel Spielman e Shang-Hua Teng in [1] che si interpola continuamente tra il caso peggiore e analisi di casi medi di algoritmi. Non è esattamente la caratterizzazione discussa sopra, ma cattura lo stesso concetto e l'ho trovato interessante.
[1] Spielman, Daniel A. e Shang-Hua Teng. "Analisi uniforme degli algoritmi: perché l'algoritmo simplex richiede solitamente tempo polinomiale." Journal of the ACM (JACM) 51, n. 3 (2004): 385-463.