3) Avendoli implementati in c++, ho preso dimestichezza con il paradigma OOP e migliorato le mie conoscenze e capacità riguardo ad un linguaggio considerato tremendo, opinione che sinceramente non condivido
Quindi non ti viene il mal di testa quando un template non compila, o quando implementi l'ereditarieta' multipla, oppure sai perfettamente quando usare "auto_ptr", "unique_ptr", "shared_ptr", quando usare un puntatore, o un reference, o quando devi decidere se usare dynamic_cast, static_cast, const_cast, reinterpret_cast o cast alla C?
O non hai trovato difficolta quando devi allocare/deallocare struttre dati complesse in cui non c'e' un'evidente struttura gerarchica, e quindi non puoi usare gli smart pointer, ma devi gestire la memoria ""a mano""?
Ci genuflettiamo al tuo cospetto
Per quanto riguarda la parte ""formale"" degli algorimi, questa si usa SOLO quando inventi un NUOVO algoritmo per risolvere una certa categoria di problemi ""astratti"" e per il quale devi DIMOSTRARE che il tuo algoritmo ha proprieta' MIGLIORI degli algoritmi gia' esistenti.
Ad esempio, ti inventi un NUOVO algortmo per ""il problema del commesso viaggiatore"": poic'e esistono gia' n-mila algoritmi, devi DIMOSTRARE che il tuo e' migliore o si comporta MEGLIO di altri almeno in certe situazioni.
Queste attivita' le fai in ambito ""ricerca"", NON in ambito ""commerciale"" in cui non frega niente di trovare l'algoritmo migliore, ma basta uno che funzioni in modo non eccessivamente ""schifido"".