Tutti i problemi di programmazione sono algoritmi? [chiuso]


13

Mi piace come "Introduzione agli algoritmi" di Cormen et al. trasmette conoscenza. Uno dei motivi è che tutto ha a che fare con i problemi di programmazione e il libro non è implementato in nessun particolare linguaggio di programmazione. Questa indipendenza linguistica mette a fuoco le idee in generale.

Quindi la mia domanda è, come si dice nel titolo. Ogni problema di programmazione risolvibile è risolvibile pensando in questo modo algoritmico. Non importa quale lingua, campo, ecc.? Se sì, dai argomenti, altrimenti dai argomenti!

Non ho implementato molti programmi complessi con GUI, AI, Grafica, ecc ... Ma questi tipi di problemi sono anche una questione di pensare a buoni algoritmi?


6
Il problema più comune per un programmatore, imho, è: "oh, quello era quello che volevi dire? Ora capisco. Non è quello che ho implementato, scusa". È un problema di programmazione?
keppla,

1
Questa domanda è molto simile.
back2dos,

Devi fare un rapporto con il cliente, descriverne i requisiti e basarti su quello che devi progettare, testare, implementare, refactorizzare, ottimizzare e mantenere il software. Sono necessari ambienti per testare, sviluppare, distribuire, eseguire e misurare il software. In questo sistema un singolo algoritmo è solo un dettaglio di implementazione.
inf3rno,

@Keppla (plus one) ope, è un problema di requisiti, la causa principale di tutti i problemi del software
Mawg dice di ripristinare Monica il

Risposte:


29

Dipende da come si definisce "Problema di programmazione".

Nei progetti del mondo reale, la risposta è sicuramente un chiaro NO. La maggior parte dei problemi non sono nemmeno problemi tecnici, ma problemi di comunicazione, requisiti non chiari, ecc.

Quindi hai interi soggetti di classi di problemi che richiedono quasi nessun algoritmo. Ad esempio, le GUI sono spesso semplici da "programmare", ma il vero problema è avere un buon design (dal punto di vista dell'usabilità, non solo dell'aspetto grafico).

Ci sono alcuni campi, in cui i problemi tendono ad essere molto più algoritmici per la natura di quel campo. Ad esempio, l'IA è un argomento fondamentale, in cui gli algoritmi sono al centro. La grafica può richiedere un algoritmo, ma dipende da cosa si intende esattamente con "Programmazione grafica".

In generale, se il problema che si sta risolvendo a livello di codice è adatto per una rappresentazione matematica, allora si entra nell'area algoritmica. Naturalmente, questo è solo un indicatore approssimativo, in quanto è possibile creare modelli matematici per praticamente tutto. Ma per la maggior parte delle cose normalmente non considereresti di farlo.

Esempio finale: se il problema è creare una GUI che consenta di inserire dati per oggetti business, non penseresti molto alle formulazioni matematiche. Se, tuttavia, il problema è creare una GUI che cambia in modo dinamico e trasferisce gli elementi in base a un valore di importanza, è molto più probabile che si finisca con un modello matematico e un'implementazione algoritmica.


2
Apparentemente, dipende anche da come si definisce "algoritmo". Direi che pochissimi problemi richiedono nuovi algoritmi, ma che poiché un programma per computer ha solo due parti - algoritmi e strutture dati - tutti i problemi richiedono alcuni algoritmi, anche se quegli algoritmi sono banali. Un algoritmo non è un modello matematico, è una sequenza di istruzioni.
philosodad,

Questo è vero nel suo senso più stretto, ma io, per uno, non accetto i++il nostro nuovo algoritmo overlord .. erm ...
Frank,

E se non avessimo saputo di aggiunta. Quindi l'introduzione dell'aggiunta sarebbe una grande innovazione nei nostri studi sugli algoritmi! E così via fino a quando incontriamo algoritmi sempre più complessi.
CMCDragonkai,

8

Cosa intendi con problema di programmazione?

Secondo Wikipedia:

La programmazione informatica (spesso abbreviata in programmazione o codifica) è il processo di progettazione, scrittura, test, debug e mantenimento del codice sorgente dei programmi per computer.

il che significa che la programmazione in generale è intrinsecamente più grande della traduzione degli algoritmi tramite il codice.

Per fare un esempio, un problema di programmazione che ho in questo momento è che devo fare i conti con un codice sorgente di spaghetti legacy aggiungendo test unitari, quindi riformattandolo . Implica anche l'aggiunta di commenti nei posti giusti, la normalizzazione della capitalizzazione dei nomi, ecc. Non ha nulla o poco a che fare con gli algoritmi.

Allo stesso modo, molte attività dello sviluppatore non sono correlate agli algoritmi. Esempio: internazionalizzazione. Allo stesso modo, molte applicazioni (CRUD, ad esempio) non usano troppo gli algoritmi nel loro codice sorgente (senza parlare del codice sottostante del framework).

Ora, se stai assumendo che in "problema di programmazione", "programmazione" sia sinonimo di traduzione di algoritmi tramite codice, allora sì, logicamente qualsiasi problema sarebbe un problema di algoritmo: A × n = B × nif A = B.


C'è una differenza tra un'attività e un problema . Il tuo problema non è quello di aggiungere unit test o mantenere il codice legacy, è la soluzione al problema che risiede all'interno della base di codice, non il comportamento del programma stesso che il codice rappresenta tramite algoritmi.
zxcdw,

Il tuo compito, come descritto, non altera il comportamento del programma. Presumibilmente è un lavoro preparatorio per alcune altre modifiche, che potrebbero o meno coinvolgere algoritmi. Non penso che nessuno sia pagato da nessuna parte solo per refactoring il codice di lavoro tutto il giorno.
MarkJ,

6

Penso che la risposta sia decisamente no . Gli algoritmi sono solo elementi costitutivi di un set di abilità molto più ampio.

Mi sono laureato in CS, specializzandomi in AI

Lì il problema fondamentale, almeno per come lo vedevo, era trovare buone rappresentazioni per l'informazione. Queste rappresentazioni dovrebbero cercare di essere una buona corrispondenza per le strutture della conoscenza che sono nella testa delle persone e dovrebbero facilitare il tipo di manipolazioni e alterazioni che vengono fatte su di esse.

In termini di programmazione quotidiana, ciò significa che il problema di base è identificare il giusto linguaggio specifico del dominio (DSL) per la situazione attuale. Esistono molti modi per creare DSL. La programmazione ordinaria, in cui sono definite classi, variabili e metodi, sta di fatto creando un DSL perché ti permette di dire cose (mappare le tue strutture mentali al codice) che non potresti dire senza di esse.

Anche gli algoritmi sono importanti, ma sono solo una parte della storia.


5

Suppongo che potresti dire che tutti i programmi per computer sono algoritmi, perché stai prescrivendo una sequenza di istruzioni per ottenere il risultato desiderato. Tuttavia, alcuni dei problemi più difficili non sono nel comunicare un programma a un computer, ma nel comunicare un programma agli umani che testeranno e modificheranno il software.

In altre parole, ai computer non importa se il tuo codice è completamente incomprensibile per l'uomo. Lo faranno bene comunque. La sfida sta nel rendere il codice abbastanza chiaro che qualsiasi bug si distingua come un pollice dolente.

È interessante notare che le cose tecniche che ho imparato al college sugli algoritmi sono state a lungo eclissate da ciò che ho imparato da solo da allora. A questo punto, se volessi ottenere un terzo diploma universitario per aiutarmi nel mio lavoro, sarebbe nella composizione inglese.


2

La maggior parte dei problemi di programmazione sono in realtà problemi di amministrazione del sistema.

È una specie di risposta irriverente, ma ho scoperto che ciò è vero più spesso di quanto ci si potrebbe aspettare. Non so quante volte ho riscontrato errori perché il DNS non era configurato correttamente sulla macchina di prova, è ancora in esecuzione un processo obsoleto che sta eseguendo il hogging CPU / memoria / porte, il programma è in esecuzione con l'ID utente errato e quindi ha l'errore autorizzazioni, il disco è stato partizionato in modo errato e quindi lo spazio si è esaurito, è stata installata la versione errata del file di configurazione, ecc.

Ottenere gli algoritmi giusti di solito è solo una piccola parte del problema. Il resto del problema sta mettendo il programma al lavoro risolvendo problemi reali nel mondo reale.


"Ottenere gli algoritmi corretti di solito è solo una piccola parte del problema" I problemi su kaggle.com NON [TM] si adattano a tale descrizione.
Gandalf,

Sono d'accordo, li ho appena inseriti nella categoria "idraulica". Lavorare con i servizi di altri programmatori, API e talvolta framework significa semplicemente collegare le cose come qualcun altro pensava che avrebbero dovuto funzionare.
JeffO,

2

Penserei che sì, tutti i problemi di programmazione sono risolvibili pensando in modo algoritmico. Dopotutto un algoritmo è solo un insieme di istruzioni che dice al computer cosa fare.

Prendendo alcuni degli esempi dall'alto

Ad esempio, le GUI sono spesso semplici da "programmare", ma il vero problema è avere un buon design (dal punto di vista dell'usabilità, non solo dell'aspetto grafico).

In termini di programmazione e persino progettazione che conosceranno schemi / regole che portano a progetti di GUI efficaci che siano user friendly ed efficienti. Queste regole si riducono a un algoritmo che, se seguito, dovrebbe aiutare a produrre una GUI user friendly. In effetti, i passaggi effettivi per posizionare i controlli sulla GUI possono anche essere ridotti a un algoritmo

Per fare un esempio, un problema di programmazione che ho in questo momento è che devo fare i conti con un codice sorgente di spaghetti legacy aggiungendo test unitari, quindi riformattandolo. Implica anche l'aggiunta di commenti nei posti giusti, la normalizzazione della capitalizzazione dei nomi, ecc. Non ha nulla o poco a che fare con gli algoritmi.

Ma il modo in cui approcci l'aggiunta di unit test può essere descritto da un algoritmo come

  1. Identificare il nuovo test unitario
  2. Scrivi unit test
  3. Applica algoritmo di normalizzazione della capitalizzazione
  4. Applica algoritmo commenti

Esempio: internazionalizzazione Questo è un perfetto esempio di soluzione algoritmica. Essendo il più semplice, stai cercando una parola nota in un dizionario e la stai sostituendo con la diversa lingua. (Naturalmente la vita reale implica frasi e contesto e l'algoritmo può comportare passaggi da verificare con madrelingua ma le basi sono vere)

Il problema con la maggior parte delle risposte Sì è che le persone stanno pensando ad algoritmi in termini di QuickSort, ordinamento Bubble invece di un insieme di istruzioni che riduce una descrizione vaga dettagliata di un problema a un insieme di logiche / regole chiaramente definite.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.