Algoritmo: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Claudio P. (discussione | contributi)
Nessun oggetto della modifica
m Annullata la modifica di 93.47.41.229 (discussione), riportata alla versione precedente di Elwood
Etichetta: Rollback
 
(244 versioni intermedie di oltre 100 utenti non mostrate)
Riga 1:
{{Nota disambigua}}
Un '''algoritmo''' è un procedimento che risolve un determinato [[problema]] attraverso un numero finito di passi elementari. Il termine deriva dalla trascrizione latina del nome del [[matematico]] persiano [[al-Khwarizmi]]<ref>[[Luca Serianni]], ''Grammatica italiana'', ed. UTET-De Agostini, Torino, 2010, ISBN 978-88-6008-057-8, p. 104.</ref>, che è considerato uno dei primi autori ad aver fatto riferimento a questo concetto. L'algoritmo è un concetto fondamentale dell'[[informatica]], anzitutto perché è alla base della nozione teorica di [[calcolabilità]]: un problema è calcolabile quando è risolvibile mediante un algoritmo. Inoltre, l'algoritmo è un concetto cardine anche della fase di [[Programmazione (informatica)|programmazione]] dello [[ciclo di vita del software|sviluppo di un software]]: preso un problema da automatizzare, la programmazione costituisce essenzialmente la traduzione o [[codifica]] di un algoritmo per tale problema in [[programma (informatica)|programma]], scritto in un certo [[linguaggio]], che può essere quindi effettivamente [[esecuzione (informatica)|eseguito]] da un [[calcolatore]] rappresentandone la logica di [[Elaborazione dati|elaborazione]].
 
In [[matematica]] e [[informatica]] un '''algoritmo''' è la specificazione di una [[Istruzione (informatica)|sequenza finita di operazioni]] (dette anche ''istruzioni'') che consente di risolvere tutti i quesiti di una stessa classe o di calcolare il risultato di un'espressione matematica.
 
Un algoritmo deve essere
* ''finito'': è costituito da un numero finito di istruzioni e deve sempre terminare;
* ''deterministico'': partendo dagli stessi dati in [[Input/output|ingresso]], si devono ottenere i medesimi risultati;
* ''non ambiguo'': le operazioni non devono poter essere interpretate in modi differenti;
* ''generale'': deve essere applicabile a tutti i problemi della classe a cui si riferisce, o ai casi dell'espressione matematica.
 
Il termine deriva dalla trascrizione [[lingua latina|latina]] del nome del [[matematico]] persiano [[al-Khwarizmi]],<ref>[[Luca Serianni]], ''Grammatica italiana'', ed. UTET-De Agostini, Torino, 2010, ISBN 978-88-6008-057-8, p. 104.</ref> vissuto nel [[IX secolo d.C.]], che è considerato uno dei primi autori ad aver fatto riferimento a questo concetto scrivendo il libro: ‘''Regole di ripristino e riduzione’''.<ref>{{Cita web|url=https://www.corrieretneo.it/2018/11/25/algoritmo-la-teologia-della-complessita-capire-ed-emulare-dio/|titolo=Algoritmo, la teologia della complessità: capire ed emulare Dio - ?s=32, #038;d=mm, #038;r=g" width="32" height="32" alt="Avatar" class="avatar avatar-32wp-user-avatar wp-user-avatar-32 alignnone photo avatar-default" /> Giacomo Paternò ha detto|data=25 novembre 2018|lingua=it|accesso=13 giugno 2022}}</ref>
 
Le prime nozioni di algoritmo si trovano in documenti risalenti al [[XVII secolo a.C.]], conosciuti come i papiri di [[Ahmes]], noti anche come [[Papiro di Rhind|papiri di Rhind]],<ref>{{Cita web|url=https://www.britishmuseum.org/collection/object/Y_EA10058|titolo=papyrus {{!}} British Museum|sito=The British Museum|lingua=en|accesso=13 giugno 2022}}</ref> che contengono una collezione di problemi con relativa soluzione comprendendo un problema di moltiplicazione che lo scrittore dichiara di aver copiato da altri papiri anteriori di due secoli.
 
Un '''algoritmo''' è un procedimento che risolve un determinato [[problema]] attraverso un numero finito di passi elementari. Il termine deriva dalla trascrizione latina del nome del [[matematico]] persiano [[al-Khwarizmi]]<ref>[[Luca Serianni]], ''Grammatica italiana'', ed. UTET-De Agostini, Torino, 2010, ISBN 978-88-6008-057-8, p. 104.</ref>, che è considerato uno dei primi autori ad aver fatto riferimento a questo concetto. L'algoritmo è un concetto fondamentale dell'[[informatica]], anzitutto perché è alla base della nozione teorica di [[Teoria della calcolabilità|calcolabilità]]: un problema è calcolabile quando è risolvibile mediante un algoritmo. Inoltre, l'algoritmo è un concetto cardine anche dellanella fase di [[Programmazione (informatica)|programmazione]] dello [[ciclo di vita del software|sviluppo di un software]]: preso un problema da [[automatica|automatizzare]], la programmazione costituisce essenzialmente la traduzione o [[codifica]] di un algoritmo per tale problema in [[programma (informatica)|programma]], scritto in un certo [[linguaggio]], che può essere quindi effettivamente [[esecuzione (informatica)|eseguito]] da un [[calcolatore]] rappresentandone la logica di [[Elaborazione dati|elaborazione]].
 
== Definizione ==
Nel [[XX secolo]], il concetto di algoritmo venne formalizzato per risolvere il problema matematico della "decisione" (''[[Entscheidungsproblem]]''), posto da [[David Hilbert]] nel 1928, e altre successive formalizzazioni giunsero con lo sviluppo dei concetti di "[[effective calculability|calcolabilità effettiva]]"<ref>Kleene 1943 in Davis 1965:274</ref> e di "metodo effettivo"<ref>Rosser 1939 in Davis 1965:225</ref>. Le formalizzazioni matematiche più famose sono le [[funzioni ricorsive]] di [[Kurt Gödel|Gödel]]–[[Jacques Herbrand|Herbrand]]–[[Stephen Cole Kleene|Kleene]] del 1930, 1934 e 1935; il [[lambda calcolo]] di [[Alonzo Church]] e la [[Formulation 1]] di [[Emil Leon Post]] del 1936; e, infine, la [[macchina di Turing]] del 1936–37 e 1939. Nonostante ciò, una definizione del concetto di algoritmo che sia formale e non tecnica manca tuttora<ref>
{{Cita libro|nome=Yiannis N.|cognome=Moschovakis|capitolo=What is an algorithm?|titolo=Mathematics Unlimited — 2001 and beyond|curatore-nome=B.|curatore-cognome=Engquist|curatore-nome2=W.|curatore-cognome2=Schmid|editore=Springer|anno=2001|pp=919–936 (Part II)|url=http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.32.8093}}</ref> e si è pertanto costretti ad accontentarsi dell'idea intuitiva di algoritmo come "una sequenza ordinata e finita di passi (operazioni o istruzioni) elementari che conduce a un ben determinato risultato in un tempo finito".
Le formalizzazioni matematiche più famose sono le [[funzioni ricorsive]] di [[Kurt Gödel|Gödel]]–[[Jacques Herbrand|Herbrand]]–[[Stephen Cole Kleene|Kleene]] del 1930, 1934 e 1935; il [[lambda calcolo]] di [[Alonzo Church]] e la [[Formulation 1]] di [[Emil Post]] del 1936; e, infine, la [[Macchina di Turing|Macchina di Alan Turing]] del 1936–37 e 1939. Nonostante ciò, una definizione del concetto di algoritmo che sia formale e non tecnica manca tuttora<ref>
{{Cita libro
|nome=Yiannis N.
|cognome=Moschovakis
|capitolo=What is an algorithm?
|titolo=Mathematics Unlimited — 2001 and beyond
|curatore-nome=B.
|curatore-cognome=Engquist
|curatore-nome2=W.
|curatore-cognome2=Schmid
|editore=Springer
|anno=2001
|pagine=919–936 (Part II)
|url=http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.32.8093
}}</ref> e si è pertanto costretti ad accontentarsi dell'idea intuitiva di algoritmo come:
:"''una sequenza ordinata e finita di passi (operazioni o istruzioni) elementari che conduce a un ben determinato risultato in un tempo finito''".
 
=== Modelli formali ===
[[File:Quicksort example small.png|thumb|right|Rappresentazione grafica dell'algoritmo [[Quicksort]]]]
{{vedi anche|Teoria della calcolabilità#Che cos'è un algoritmo}}
[[File:Quicksort example small.png|thumb|right|Rappresentazione grafica dell'algoritmo [[Quicksort]]]]
La definizione di algoritmo appena riportata è piuttosto informale, mentre era necessario disporre di una definizione più rigorosa per trattare il concetto di algoritmo con strumenti matematici. Al tal fine sono stati definiti alcuni [[Modello matematico|modelli matematici]] di algoritmo, fra i quali uno dei più celebri è la [[macchina di Turing]]. Essa rappresenta una sorta di ''computer'' ideale corredato di un [[Programma (informatica)|programma]] da eseguire, ma, rispetto a un computer ideale, la macchina di Turing ha un funzionamento estremamente più semplice cosicché il suo funzionamento possa essere facilmente descritto in termini matematici, facendo uso di concetti come [[insieme]], [[relazione (matematica)|relazione]] e [[funzione (matematica)|funzione]].
 
La definizione di algoritmo appena riportata è piuttosto informale, mentre era necessario disporre di una definizione più rigorosa per trattare il concetto di algoritmo con strumenti matematici. Al tal fine sono stati definiti alcuni [[Modello matematico|modelli matematici]] di algoritmo, fra i quali uno dei più celebri è la [[macchina di Turing]]. Essa rappresenta una sorta di ''computer'' ideale corredato di un [[Programma (informatica)|programma]] da eseguire, ma, rispetto a un computer idealereale, la macchina di Turing ha un funzionamento estremamente più semplice cosicché il suo funzionamentoche possa essere facilmente descritto incon termini matematici, facendo uso di concetti come [[insieme]], [[relazione (matematica)|relazione]] e [[funzione (matematica)|funzione]].
La [[architettura di von Neumann|macchina di Von Neumann]], che è il modello di architettura sottostante a tutti i computer attuali, è equivalente, in termini di potere di calcolo, alla macchina di Turing. In altre parole, è stato dimostrato che un certo problema può essere risolto da un computer (opportunamente programmato) se e solo se esso può essere risolto anche da una macchina di Turing. Oltre alla macchina di Turing, proposta da [[Alan Turing]] nel [[1936]], nello stesso periodo altri matematici hanno elaborato diverse rappresentazioni formali del concetto di algoritmo, fra i quali ricordiamo, per esempio, il [[lambda calcolo]]. Dopo alcuni anni, emerse che tutti questi modelli erano equivalenti: {{cn|i problemi che una macchina di Turing poteva risolvere erano gli stessi che poteva risolvere una macchina di von Neumann e anche gli stessi che poteva risolvere una funzione costruita col lambda calcolo
 
inserire riferimento o citare risultato}}.
La [[architettura di von Neumann|macchina di Von Neumann]], che è il modello di architettura sottostanteprimigenio adi tutti i computer attuali, è equivalente, in termini di potere di calcolo, alla macchina di Turing. In altre parole, è stato dimostrato che un certo problema può essere risolto da un computer (opportunamente programmato) [[se e solo se]] esso può essere risolto anche da una macchina di Turing. Oltre alla macchina di Turing, proposta da [[Alan Turing]] nel [[1936]], nello stesso periodo altri matematici hanno elaborato diverse rappresentazioni formali del concetto di algoritmo, fra i quali ricordiamo, per esempio, il [[lambda calcolo]]. Dopo alcuni anni, emerse che tutti questi modelli erano equivalenti: {{cnSenza fonte|i problemi che una macchina di Turing poteva risolvere erano gli stessi che poteva risolvere una macchina di von Neumann e anche gli stessi che poteva risolvere una funzione costruita col lambda calcolo}}.
 
Da questi risultati, tra l'altro, scaturì la [[tesi di Church-Turing]], che afferma che qualsiasi algoritmo sia modellabile con una macchina di Turing. In altri termini, questa tesi sostiene che è sostanzialmente impossibile cercare di immaginare un modello di algoritmo più potente e, di conseguenza, che nessuna macchina potrà mai risolvere problemi che una macchina di Turing non possa risolvere in linea di principio. Non si tratta di un [[teorema]] dimostrato matematicamente, poiché la tesi stabilisce l'eguaglianza di due concetti, l'algoritmo e la macchina di Turing, ma il primo non possiede una definizione formale. La tesi è oggi generalmente condivisa, sebbene i progressi nelle ricerche nel settore dell'[[ipercomputazione]] sembrino talvolta metterla in discussione.
 
Vi è anche l'[[algoritmo di Hirschberg]], dal nome del suo creatore, Dan Hirschberg, di [[programmazione dinamica]] che trova l'[[Allineamento di sequenze|allineamento]] ottimale della sequenza tra due [[Stringa (informatica)|stringhe]].
 
=== Proprietà fondamentali degli algoritmi ===
[[File:Algoritmo para Procesar y Organizar en GTD.png|thumb|Esempio di [[diagramma di flusso]] di un algoritmo del metodo [[Detto, fatto!]]]]
Dalla precedente definizione di algoritmo si evincono alcune proprietà necessarie, senza le quali un algoritmo non può essere definito tale:
 
Dalla precedente definizione di algoritmo si evincono alcune proprietà necessarie, senza le quali un algoritmo non può essere definito tale:
* i passi costituenti devono essere "elementari", ovvero non ulteriormente scomponibili (''atomicità'');
* i passi costituenti devono essere interpretabili in modo diretto e univoco dall'''esecutore'', sia esso umano o artificiale (''non ambiguità'');
Riga 40 ⟶ 42:
 
Così, ad esempio, "rompere le uova" può essere considerato legittimamente un passo elementare di un "algoritmo per la cucina" (ricetta), ma non potrebbe esserlo anche "aggiungere sale quanto basta" dato che l'espressione "quanto basta" è ambigua, e non indica con precisione quali passaggi servano per determinare la quantità necessaria.
Un passo come "preparare un pentolino di crema pasticcera" non può considerarsi legittimo perché ulteriormente scomponibile in sotto-operazioni (accendere il fuoco, regolare la fiamma, mettere il pentolino sul fornello, ecc.) e anche perché contenente ambiguità (non specifica quanto grande deve essere il pentolino, quanto deve essere riempito di crema e così via). Al contrario, "continuare a mescolare a fuoco vivo fino a quando il composto non assume colore bruno" è un'istruzione accettabile di tipo ''iterativo'', che comporta un numero finito di operazioni (le rimestate) sebbene tale numero non sia conoscibile a priori, perché dipendente da ciò che è chiamato ''input'' (il grado di umidità della farina nel composto, il vigore della fiamma, ecc.). All'istruzione non elementare di preparazione della crema potrebbe, però, essere associato a un opportuno rimando a un'altra sezione del ricettario, che fornisca un sotto-algoritmo apposito per questa specifica operazione. Questo suggerisce che, per comodità d'implementazione, gli algoritmi possano essere ''modulari'', ovvero orientati a risolvere specifici sotto-problemi, e ''gerarchicamente organizzati''. Inoltre, una ricetta che preveda la cottura a [[microonde]] non può essere preparata da un esecutore sprovvisto dell'apposito elettrodomestico; questo rimanda al problema della ''realizzabilità'' degli algoritmi, ovvero della loro compatibilità con le risorse materiali e temporali a disposizione. Infine, possono darsi più algoritmi validi per risolvere uno stesso problema, ma ognuno con un diverso grado di ''efficienza''.
 
Un passo come "preparare un pentolino di crema pasticcera" non può considerarsi legittimo perché ulteriormente scomponibile in sotto-operazioni (accendere il fuoco, regolare la fiamma, mettere il pentolino sul fornello, ecc.) e anche perché contenente ambiguità (non specifica quanto grande deve essere il pentolino, quanto deve essere riempito di crema e così via). Al contrario, "continuare a mescolare a fuoco vivo fino a quando il composto non assume colore bruno" è un'istruzione accettabile di tipo ''iterativo'', che comporta un numero finito di operazioni (le rimestate) sebbene tale numero non sia conoscibile a priori, perché dipendente da ciò che è chiamato ''input'' (il grado di umidità della farina nel composto, il vigore della fiamma, ecc.). All'istruzione non elementare di preparazione della crema potrebbe, però, essere associato a un opportuno rimando a un'altra sezione del ricettario, che fornisca un sotto-algoritmo apposito per questa specifica operazione. Questo suggerisce che, per comodità d'implementazione, gli algoritmi possano essere ''modulari'', ovvero orientati a risolvere specifici sotto-problemi, e ''gerarchicamente organizzati''. Inoltre, una ricetta che preveda la cottura a [[microonde]] non può essere preparata da un esecutore sprovvisto dell'apposito elettrodomestico; questo rimanda al problema della ''realizzabilità'' degli algoritmi, ovvero della loro compatibilità con le risorse materiali e temporali a disposizione. Infine, possono darsi più algoritmi validi per risolvere uno stesso problema, ma ognuno con un diverso grado di ''efficienza''.
L'algoritmo viene generalmente descritto come "procedimento di risoluzione di un problema". In questo contesto, i "problemi" che si considerano sono quasi sempre caratterizzati da ''dati di ingresso'' ([[input]]) variabili, su cui l'algoritmo stesso opererà per giungere fino alla soluzione. Per esempio, il calcolo del massimo comune divisore fra due numeri è un esempio di "problema", e i suoi ''dati di ingresso'', variabili di volta in volta, sono i due numeri in questione. A un non matematico questa potrebbe apparire come una "famiglia di problemi" (il problema di calcolare il massimo comune divisore fra 10 e 15, il problema di calcolarlo fra 40 e 60, fra 35 e 95, e così via). Il matematico e l'informatico identificano con la parola "problema" l'intera famiglia e con "istanza" o "x" ciascuno dei quesiti specifici ottenuti fissando due particolari valori. Data questa premessa, un algoritmo risolve un problema se per qualunque istanza del problema esso produce in un tempo finito la soluzione desiderata, ovvero un certo risultato o dato in uscita ([[output]]) a partire da dei dati in ingresso ([[input]]).
 
L'algoritmo viene generalmente descritto come "procedimento di risoluzione di un problema". In questo contesto, i "problemi" che si considerano sono quasi sempre caratterizzati da ''dati di ingresso'' ([[input]]) variabili, su cui l'algoritmo stesso opererà per giungere fino alla soluzione. Per esempio, il calcolo del [[Massimo comun divisore|massimo comune divisore]] fra due numeri è un esempio di "problema", e i suoi ''dati di ingresso'', variabili di volta in volta, sono i due numeri in questione. A un non matematico questa potrebbe apparire come una "famiglia di problemi" (il problema di calcolare il massimo comune divisore fra 10 e 15, il problema di calcolarlo fra 40 e 60, fra 35 e 95, e così via). Il matematico e l'informatico identificano con la parola "problema" l'intera famiglia e con "istanza" o "x" ciascuno dei quesiti specifici ottenuti fissando due particolari valori. Data questa premessa, un algoritmo risolve un problema se per qualunque istanza del problema esso produce in un tempo finito la soluzione desiderata, ovvero un certo risultato o dato in uscita ([[Input/output|output]]) a partire da dei dati in ingresso ([[input]]).
 
Se questa idea aveva già una certa importanza per il calcolo matematico, l'avvento dell'informatica l'ha arricchita di una nuova importanza, ed è infatti con l'informatica che il termine "algoritmo" ha iniziato a diffondersi. Difatti, se per ottenere un certo risultato (risolvere un certo problema) esiste un procedimento infallibile, che può essere descritto in modo non ambiguo fino ai dettagli, e conduce sempre all'obiettivo desiderato in un tempo finito, allora esistono le condizioni per affidare questo compito a un [[computer]], semplicemente introducendo l'algoritmo in questione in un [[Programma (informatica)|programma]] scritto in un opportuno [[linguaggio di programmazione|linguaggio]] comprensibile alla macchina.
Riga 49 ⟶ 52:
 
== Approccio matematico ==
Esistono numerosi modelli matematici di algoritmo. In generale, un algoritmo riceve un insieme di valori (dati) in [[input]] e ne genera uno in [[output]] (chiamato soluzione). Dato dunque un algoritmo A si denota con f<sub>A</sub> la funzione che associa a ogni ingresso x di A la corrispondente uscita.
 
Questa corrispondenza tra input e output non rappresenta il problema risolto dall'algoritmo. Formalmente, un problema è una funzione <math>f (D_i) \to D_s</math> definita su insieme D<sub>i</sub> di elementi che chiameremo restanze, a valori su un insieme D<sub>s</sub> di risoluzioni.
Riga 72 ⟶ 75:
* metodo dell'albero
* [[metodo dell'esperto]]
 
Si definisce asintotica per due motivi:
* poiché ogni calcolatore può implementare algoritmi in modo differente, non si può stimare il tempo preciso
* si vuole dare un'idea quantitativa di come l'algoritmo possa crescere in consumo di tempo all'aumentare dell'input, per valori sempre maggiori.
Riga 85 ⟶ 89:
 
che esprime la dimensione dei dati in ingresso, ossia il numero di bit che servono per codificare i dati in input all'algoritmo.
Ad esempio su un vettore la lunghezza dello stesso determinerà il numero di bit necessari a codificarlo e sulle matrici il numero dell'ordine, ossia presa ad esempio una [[matrice quadrata]] l'ordine della stessa è determinata da una delle due dimensioni (orizzontale oppure verticale).
{{chiarire}}.
 
La complessità di un algoritmo si definisce come:
Riga 98 ⟶ 101:
Due misure per sistemi di calcolo sequenziali sono i valori <math>T_a (x)</math> e <math>S_a (x)</math> che rappresentano rispettivamente il tempo e lo spazio di memoria richiesti da un algoritmo <math>a</math> su input <math>x \in X</math>. Per la sopra citata proprietà il dominio <math>X</math> deve dunque coincidere con l'insieme <math>\mathbb{N}</math>. Possiamo pertanto considerare <math>T_a (n)</math> e <math>S_a (n)</math> come funzioni intere positive che rappresentano il ''numero di operazioni'' (non il tempo di esecuzione effettivo) elementari eseguite e dal numero di celle di memoria utilizzate durante l'esecuzione di <math>a</math> sull'istante <math>x</math>.
 
Descrivere le funzioni <math>T_a (n)</math> e <math>S_a (n)</math> può essere molto complicato poiché la variabile <math>n</math> assume valori sull'insieme di tutti gli input. Una soluzione che fornisce buone informazioni su <math>T_a (n)</math> e <math>S_a (n)</math> consiste nell'introdurre il concetto di dimensione di un'istanza, raggruppando in tal modo gli input che hanno la stessa dimensione: la funzione dimensione associa a ogni ingresso un [[numero naturale]] che rappresenta intuitivamente la quantità di informazione contenuta nel dato considerato. Per esempio la dimensione naturale di un intero positivo <math>k</math> è <math>[1 + log_2{k}]</math>, cioè il numero di cifre necessario per rappresentare <math>k</math> in notazione binaria. Analogamente la dimensione di un vettore di elementi è solitamente costituita dal numero delle sue componenti, mentre la dimensione di un grafo è data congiuntamente dal numero dei suoi nodi e dei suoi archi. La dimensione di <math>n</math> si denota con <math>|n|</math>.
 
Dato un algoritmo <math>a</math> su un insieme di input <math>I</math>, può accadere che due istanze <math>i</math>, <math>i'</math> di ugual dimensione cioè <math>|i|</math>. = <math>|i'|</math>. diano luogo a tempi diversi di esecuzione per uno stesso algoritmo. Si parla dunque di complessità dell'input e se ne distinguono tre casi:
 
# complessità nel caso peggiore
# complessità nel caso medio
Riga 116 ⟶ 118:
Ad esempio, in un algoritmo di [[ricerca lineare]], se l'elemento cercato è il primo della lista ci troviamo nel caso migliore, <math>T_{migliore}(n)=1</math>. La complessità nel caso medio è <math>T_{medio}(n)=\frac{1}{n} \sum_{i=1}^n i = (n+1)/2</math>. Nel caso peggiore l'elemento cercato è l'ultimo della lista: in questo caso <math>T_{peggiore}(n)=n</math>, ossia sono richiesti tutti gli <math>n</math> passi per trovare la soluzione.
 
Il caso peggiore è quello che viene solitamente considerato per descrivere la complessità di un algoritmo. In alcuni casi (ad esempio il [[quicksort]]) viene considerato il caso medio, poiché il caso peggiore avviene molto raramente o addirittura con [[probabilità zero]].
 
=== Complessità e stabilità ===
Riga 123 ⟶ 125:
=== Esempio: studio della complessità di risoluzione dei sistemi lineari ===
{{vedi anche|Sistema di equazioni lineari}}
 
Vogliamo trovare un algoritmo ''efficiente'' per risolvere un sistema lineare di <math>n</math> equazioni in <math>n</math> incognite (anche 100, 1000...). Dobbiamo cioè valutare, tra tutti gli algoritmi risolutivi disponibili, quello che impiega meno tempo e consuma meno spazio degli altri. L'Algebra ci offre due importanti metodi risolutivi di enorme interesse ai fini dello studio della complessità degli algoritmi.
 
Riga 128 ⟶ 131:
 
{{vedi anche|Regola di Cramer}}
 
La [[Regola di Cramer]] permette la risoluzione di un sistema lineare nel modo più semplice grazie a una singola definizione:
:<math>x_i = { \det(A_i) \over \det(A)}</math>
dove <math>A_i</math> è la matrice formata sostituendo la ''i-''esima colonna di <math>A</math> con il vettore delledei incognitetermini noti.
Il [[Determinante (algebra)|determinante]] della matrice può essere calcolato a priori, dunque serve ''solo'' il calcolo di <math>n+1</math> determinanti per risolvere il sistema.
Il determinante è solitamente definito tramite lo [[sviluppo di Laplace]], che fornisce direttamente un [[algoritmo ricorsivo]]:
:<math>\det(A_k) = \sum_{i = 1}^n(-1)^{i+k} a_{i,k} \det(A_{i,k})</math>
Riga 143 ⟶ 147:
sono uguali se <math>\operatorname U</math> si ottiene sostituendo le righe e le colonne di <math>\operatorname A</math> con loro combinazioni lineari e gli elementi di <math>\operatorname c</math> sono combinazioni lineari degli elementi di <math>\operatorname b</math> in base ai coefficienti di <math>\operatorname U</math>.
 
Il secondo è che per risolvere un sistema triangolare (dove cioè la matrice dei coefficienti gode della proprietà di triangolarità) è sufficiente utilizzare l'algoritmo di sostituzione in avanti o all'indietro (la [[Teoria della complessità computazionale|complessità computazionale]] è <math>O(n)</math>).
 
Si dimostra che per trasformare il sistema in triangolare occorre un algoritmo la cui complessità è <math>O(n^3)</math>. Applicando a questo sistema l'algoritmo di sostituzione diretta si trovano le soluzioni esatte del sistema, e si dimostra che la complessità totale dell'algoritmo di Gauss è sempre <math>O(n^3)</math>.
Riga 160 ⟶ 164:
 
== Catalogazione degli algoritmi ==
Gli algoritmi vengono raggruppati e catalogati a seconda della loro funzione o delle tecniche utilizzate per realizzarli, tuttavia una catalogazione rigorosa e completa è ormai diventata impossibile.
 
In [[informatica]] è possibile catalogare gli algoritmi in:
Riga 205 ⟶ 209:
 
=== Altri algoritmi ===
{{div col|cols=3}}
* [[informatica quantistica|Algoritmi quantistici]], che implementati su di un [[computer quantistico]] darebbero prestazioni superiori ai classici
* [[informatica quantistica|Algoritmi quantistici]]
* [[Algoritmo apriori]]
* [[Algoritmo di Berger]]
Riga 211 ⟶ 216:
* [[Algoritmo online]]
* [[Algoritmo di pitch detection]]
* [[Algoritmo di sommatoria di Kahan]]
* [[Algoritmo di Euclide]]
* [[Algoritmo di prostaferesi]]
* [[Algoritmo di pattern matching su stringhe]]
* [[Algoritmo Doomsday]]
* [[Algoritmo di Dijkstra]]
* [[Algoritmo di Boyer-Moore]]
* [[Algoritmo di Knuth-Morris-Pratt]]
* [[Algoritmo di Prim]]
* [[Algoritmo di Gauss-Newton]]
* [[Algoritmo della linea di Bresenham]]
* [[Algoritmo del simplesso]]
* [[Algoritmo delle colonie di formiche]]
* [[Algoritmo del banchiere]]
* [[Algoritmo del fornaio]]
* [[Algoritmo dell'ascensore]]
* [[Algoritmo del puzzle]]
* [[Algoritmo del biglietto]]
* [[Algoritmo dello spaccone]]
{{div col end}}
 
== Note ==
Riga 221 ⟶ 246:
* [[Fabrizio Luccio]], ''La struttura degli Algoritmi'', Boringhieri, ISBN 88-339-5265-7
* [[Thomas H. Cormen]], Charles E. Leiserson, [[Ronald Rivest]], ''[[Introduzione agli algoritmi]]''
* [[Paolo Zellini]], ''La dittatura del calcolo'', Adelphi, 2018, ISBN 978-8845932403
 
== Voci correlate ==
Riga 229 ⟶ 255:
* [[Tensor voting]]
* [[Programmazione (informatica)]]
* [[Algoritmo anytime]]
* [[Algoritmo euristico]]
* [[Problema del commesso viaggiatore]]
 
== Altri progetti ==
{{interprogetto|etichetta=algoritmo|wikt=algoritmo|commons=Category:Algorithms|commons_etichetta=algoritmi|commons_preposizione=sugli}}
 
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* [http://www.dizionarioinformatico.com/IMAGES/alk.jpg Dizionario Informatico] Francobollo di Al Khwarizmi.
* {{TreccaniFOLDOC|algoritmoalgorithm|algorithm}}
* {{Garzanti}}
* {{es}} [http://www.mis-algoritmos.com Mis algoritmos] Procedure di base in parecchi linguaggi di programmazione.
* {{cita web|url=https://www.wehardware.it/algoritmo|titolo=Algoritmo|urlarchivio=https://web.archive.org/web/20210113140346/https://www.wehardware.it/algoritmo }}
* {{cita web|http://www.nist.gov/dads/|Dizionario degli algoritmi e delle strutture dati|lingua=en}}
* {{Cita testo|lingua=es|url=http://mis-algoritmos.com/|titolo=Mis algoritmos|accesso=2 dicembre 2019|dataarchivio=28 maggio 2019|urlarchivio=https://web.archive.org/web/20190528102413/http://mis-algoritmos.com/|urlmorto=sì}} Procedure di base in parecchi linguaggi di programmazione.
* {{Thesaurus BNCF}}
* {{cita web|url=http://www.nist.gov/dads/|titolo=Dizionario degli algoritmi e delle strutture dati|lingua=en}}
 
{{Controllo di autorità}}