Mon compte

connexion

inscription

   Publicité R▼


 » 
allemand anglais arabe bulgare chinois coréen croate danois espagnol espéranto estonien finnois français grec hébreu hindi hongrois islandais indonésien italien japonais letton lituanien malgache néerlandais norvégien persan polonais portugais roumain russe serbe slovaque slovène suédois tchèque thai turc vietnamien
allemand anglais arabe bulgare chinois coréen croate danois espagnol espéranto estonien finnois français grec hébreu hindi hongrois islandais indonésien italien japonais letton lituanien malgache néerlandais norvégien persan polonais portugais roumain russe serbe slovaque slovène suédois tchèque thai turc vietnamien

Significations et usages de algoritmo

Définition

⇨ voir la définition de Wikipedia

   Publicité ▼

Locutions

Algoritmo AKS • Algoritmo Buhlmann • Algoritmo Cohen-Sutherland • Algoritmo ECPP • Algoritmo Generico per la creazione di un MST • Algoritmo del biglietto • Algoritmo del fornaio • Algoritmo del pittore • Algoritmo del puzzle • Algoritmo dello spaccone • Algoritmo di Bellman-Ford • Algoritmo di Berger • Algoritmo di Borůvka • Algoritmo di Canny • Algoritmo di Davis-Putnam • Algoritmo di Dekker • Algoritmo di Dell - Elmedlaoui • Algoritmo di Dijkstra • Algoritmo di Edmonds • Algoritmo di Euclide • Algoritmo di Floyd-Warshall • Algoritmo di Goertzel • Algoritmo di Karatsuba • Algoritmo di Karmarkar • Algoritmo di Kruskal • Algoritmo di Metropolis-Hastings • Algoritmo di Nagle • Algoritmo di Peterson • Algoritmo di Prim • Algoritmo di Tison • Algoritmo di Tomasulo • Algoritmo di Ullmann • Algoritmo di Viterbi • Algoritmo di elezione • Algoritmo di prostaferesi • Algoritmo di rasterizzazione di linea • Algoritmo di ricerca • Algoritmo euristico • Algoritmo flood fill • Algoritmo genetico • Algoritmo in loco • Algoritmo iterativo • Algoritmo online • Algoritmo quantistico • Algoritmo rete • Algoritmo rho di Pollard • Algoritmo ricorsivo • Davis-Putnam (Algoritmo)

Dictionnaire analogique

   Publicité ▼

Wikipedia

Algoritmo

                   

In informatica e matematica, il termine algoritmo indica un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un problema risolvibile mediante un algoritmo si dice computabile. Il termine "algoritmo" deriva dalla trascrizione latina del nome del matematico persiano al-Khwarizmi[1], che è considerato uno dei primi autori ad aver fatto riferimento a questo concetto.

Indice

  Definizione

Nel secolo scorso il concetto di algoritmo venne formalizzato per risolvere il problema matematico della "decisione" (Entscheidungsproblem) posto da David Hilbert nel 1928. Successive formalizzazioni si ebbero nello sviluppo dei concetti di " calcolabilità effettiva"[2] e di "metodo effettivo";[3]. Queste formalizzazioni inclusero le funzioni ricorsive GödelHerbrandKleene del 1930, 1934 e 1935, il lambda calcolo di Alonzo Church del 1936, "la formulation 1" di Emil Post del 1936 e, infine, la macchina di Alan Turing del 1936–7 e 1939. Nonostante questi tentativi, la definizione formale del concetto di algoritmo è tutt'ora una sfida aperta[4]. Tuttavia, si può definire intuitivamente un algoritmo come una sequenza ordinata e finita di passi (operazioni o istruzioni) elementari che conduce ad un ben determinato risultato in un tempo finito.

  Modelli formali

  Rappresentazione grafica dell'algoritmo Quicksort
Exquisite-kfind.png Per approfondire, vedi la voce Teoria della calcolabilità.

La definizione di algoritmo riportata sopra è, evidentemente, piuttosto informale. Allo scopo di trattare il concetto di algoritmo con strumenti matematici, era necessario darne una definizione più rigorosa. Questo obiettivo è stato realizzato inventando una serie di modelli matematici di algoritmo. Uno dei più celebri è la macchina di Turing. Essa rappresenta una sorta di computer ideale corredato di un programma da eseguire. Rispetto a un computer ideale, la macchina di Turing ha un funzionamento più semplice, con il vantaggio però che il suo funzionamento è facilmente descrivibile in termini matematici, facendo uso di concetti come insieme, relazione e funzione. Inoltre, è stato dimostrato che la macchina di Turing è tanto potente quanto la macchina di von Neumann, che è il modello sottostante a tutti i computer reali. In altre parole, se un certo problema può essere risolto da un computer (opportunamente programmato), esso può certamente essere risolto anche da una macchina di Turing.

Dopo la macchina di Turing, proposta da Alan Turing nel 1936, altri matematici hanno elaborato 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. 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 è 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 anche, come corollario, che nessuna macchina potrà mai risolvere problemi che una macchina di Turing non possa risolvere in linea di principio. Ovviamente, non si tratta di un teorema, in quanto la tesi stabilisce l'eguaglianza di due concetti (algoritmo e macchina di Turing) di cui solo il secondo ha una definizione formale. La tesi è ancora oggi generalmente condivisa, sebbene nuove ricerche nel settore dell'ipercomputazione sembrino volte a metterla in discussione.

  Proprietà fondamentali degli algoritmi

Dalla precedente definizione informale si evincono alcune proprietà caratteristiche degli algoritmi:

  • i passi costituenti devono essere "elementari", ovvero non ulteriormente scomponibili (atomicità);
  • i passi costituenti devono essere interpretabili in modo univoco dall'esecutore, sia esso umano o artificiale (non ambiguità);
  • l'algoritmo deve essere composto da un numero finito di passi e richiedere una quantità finita di dati in ingresso (finitezza)
  • l'esecuzione deve avere termine dopo un tempo finito (terminazione);
  • l'esecuzione deve portare ad un risultato univoco (effettività);
  • ad ogni un passo, il successivo deve essere uno ed uno solo, ben determinato (determinismo). (fanno eccezione gli algoritmi randomizzati)

Così, ad esempio, "rompere le uova" può essere cosiderato legittimamente un passo elementare di un "algoritmo di cucina" (ricetta), e potrebbe esserlo anche "aggiungere sale quanto basta", ammesso che l'esecutore sia in grado di risolvere da solo l'ambiguità di questa frase. Al contrario, un passo come "preparare un pentolino di crema pasticciera" 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à (quanta 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 risovere 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.

  Approccio informatico

Il concetto di algoritmo ha molta più rilevanza in informatica che in matematica, in cui esso 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 variabili. 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 è costituito da una sequenza finita di passi che, applicata indifferentemente a qualunque istanza del problema, produce in un tempo finito la soluzione desiderata.

Se questa idea aveva 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). Infatti, 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 descrivendo l'algoritmo in questione in un programma scritto in un opportuno linguaggio comprensibile alla macchina.

  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 fA 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 f (D_i) \to D_s definita su insieme Di di elementi che chiameremo restanze, a valori su un insieme Ds di risoluzioni.

Lo studio di un algoritmo viene suddiviso in due fasi:

  1. sintesi (detta anche disegno o progetto): dato un problema A, costruire un algoritmo f per risolvere A, cioè tale che f=fa.
  2. analisi: dato un algoritmo f ed un problema A, dimostrare che f risolve A, cioè f=fa (correttezza) e valutare la quantità di risorse usate da f (complessità concreta).

  Formalizzazione di un problema

Ad ogni problema \Pi si ha che: f \pi: D \pi \rightarrow S \pi dove D \pi sono le istanze del problema e  S \pi sono le soluzioni e \forall x \in D \pi:f \pi (x) sia una soluzione al problema per l'istanza x.


  Studio della complessità computazionale di un algoritmo

Exquisite-kfind.png Per approfondire, vedi la voce Teoria della complessità computazionale.

Un'ampia porzione della teoria degli algoritmi è lo studio della complessità, computazionale e spaziale. Vogliamo cioè sapere, al crescere della complessità del problema, in che modo cresce il tempo necessario a eseguire l'algoritmo e lo spazio di memoria occupato in un calcolatore.

La complessità di un algoritmo si misura asintoticamente. Vi sono tre metodi per calcolare la complessità di un algoritmo:

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.

Presa una funzione associata ad un algoritmo del tipo:

\phi ALG: \mathrm{InALG} \rightarrow \mathrm{OutALG}

si può definire la funzione peso come

\mathrm{WALG}: \mathrm{InALG} \rightarrow \mathbb{N}

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 e sulle matrici il numero dell'ordine.

La complessità di un algoritmo si definisce come:

\mathrm{TALG}: \mathbb{N} \rightarrow \mathbb{N} che indica per ogni valore interno n (ossia la dimensione del problema) la quantità di tempo e/o spazio impiegata dall'algoritmo per elaborare dati di dimensione n. Un algoritmo può comportarsi in modo sensibilmente differente anche per istanze che abbiano ugual dimensione (ossia lo stesso peso).

Si dimostra che la complessità di un algoritmo è una funzione strettamente crescente, per quale vale \lim_{n\rightarrow \infty} T(x)=\infty

Infatti è banale dimostrare che S_a (x) tende all'infinito al crescere di x (cioè del numero di dati da elaborare), perché essa è minorata da x (è un o(x)) in quanto il numero minimo di spazi di memoria per memorizzare un insieme di dati è la loro cardinalità. Si noti che per le matrici sparse si deve considerare come numero di dati gli elementi non nulli.

Due misure per sistemi di calcolo sequenziali sono i valori T_a (x) e S_a (x) che rappresentano rispettivamente il tempo e lo spazio di memoria richiesti da un algoritmo a su input x \in X. Per la sopra citata proprietà il dominio X deve dunque coincidere con l'insieme \mathbb{N}. Possiamo pertanto considerare T_a (n) e S_a (n) 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 a sull'istante x.

Descrivere le funzioni T_a (n) e S_a (n) può essere molto complicato poiché la variabile n assume valori sull'insieme di tutti gli input. Una soluzione che fornisce buone informazioni su T_a (n) e S_a (n) 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 ad 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 k è [1 + log_2{k}], cioè il numero di cifre necessario per rappresentare k 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 n si denota con |n|.

Dato un algoritmo a su un insieme di input I, può accadere che due istanze i, i' di ugual dimensione cioè |i|. = |i'|. diano luogo a tempi diversi di esecuzione per uno stesso algoritmo. Si parla dunque di complessità dell'input e se ne distinguono tre casi:

  1. complessità nel caso peggiore
  2. complessità nel caso medio
  3. complessità nel caso migliore

Il caso medio permette di studiare l'algoritmo in base alla frequenza p_i con cui si verificano gli input e alla complessità c_i dell'algoritmo per ciascuno di essi:

\mathrm{TALG} = \sum_{i=1}^n p_i c_i

Quando i casi sono tutti equiprobabili, il caso medio è calcolato come media aritmetica della complessità calcolata su tutti i possibili input:

\mathrm{TALG} = \frac{1}{n} \sum_{i=1}^n c_i

Ad esempio, in un algoritmo di ricerca lineare, se l'elemento cercato è il primo della lista ci troviamo nel caso migliore, T_{migliore}(n)=1. La complessità nel caso medio è T_{medio}(n)=\frac{1}{n} \sum_{i=1}^n i = (n+1)/2. Nel caso peggiore l'elemento cercato è l'ultimo della lista: in questo caso T_{peggiore}(n)=n, ossia sono richiesti tutti gli n 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à

Controparte della complessità di un algoritmo, è la sua stabilità numerica: essa stabilisce quanto un algoritmo è "resistente" a degli insiemi di dati particolari. Ovviamente il discorso è generalmente correlato all'analisi numerica, e alle implementazioni di algoritmi su macchine specifiche, tuttavia potrebbero darsi algoritmi prettamente matematici che per alcuni dati forniscono risultati indeterminati, tipo 0 \over 0, mentre altri algoritmi equivalenti con gli stessi dati arrivano comunque a dare risposte: i primi sono meno stabili dei secondi. Un esempio sono i limiti calcolati col metodo canonico, oppure col metodo di De l'Hôpital.

  Esempio: studio della complessità di risoluzione dei sistemi lineari

Exquisite-kfind.png Per approfondire, vedi la voce Sistema di equazioni lineari.

Vogliamo trovare un algoritmo efficiente per risolvere un sistema lineare di n equazioni in n 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.

NOTA
negli esempi si tiene conto che il sistema sia univocamente determinato. In sede di approfondimento è possibile conoscere quali sono le condizioni affinché gli algoritmi che stiamo per esporre sono applicabili
Exquisite-kfind.png Per approfondire, vedi la voce Regola di Cramer.

La Regola di Cramer permette la risoluzione di un sistema lineare nel modo più semplice grazie ad una singola definizione:

x_i = { \det(A_i) \over \det(A)}

dove A_i è la matrice formata sostituendo la iesima colonna di A con il vettore delle incognite. Il determinante della matrice può essere calcolato a priori, dunque serve solo il calcolo di n+1 determinanti per risolvere il sistema. Il determinante è solitamente definito tramite lo sviluppo di Laplace, che fornisce direttamente un algoritmo ricorsivo:

\det(A_k) = \sum_{i = 1}^n(-1)^{i+k} a_{i,k} \det(A_{i,k})

dove a_{i,k} è l'elemento di coordinate i,k e A_{i,k} è il minore ottenuto sopprimendo la i-esima riga e la k-esima colonna. La complessità di questo algoritmo per il calcolo del determinante è O(n!), perché per ogni determinante di ordine m si devono calcolare m determinanti di ordine m-1.

Vengono perciò utilizzati altri algoritmi con complessità migliore. (Incidentalmente, tali algoritmi sono anche alla base di metodi più efficienti per il calcolo del determinante). Uno di questi è il metodo di eliminazione di Gauss, basato su due importanti principi.

Il primo è che due sistemi lineari

\operatorname A \operatorname x = \operatorname b e \operatorname U \operatorname x = \operatorname c

sono uguali se \operatorname U si ottiene sostituendo le righe e le colonne di \operatorname A con loro combinazioni lineari e gli elementi di \operatorname c sono combinazioni lineari degli elementi di \operatorname b in base ai coefficienti di \operatorname U.

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 complessità computazionale è O(n)).

Si dimostra che per trasformare il sistema in triangolare occorre un algoritmo la cui complessità è O(n^2). 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 è O(n^3).

Per quanto riguarda la complessità spaziale:

  • l'algoritmo basato sulla regola di Cramer richiede soltanto una variabile aggiuntiva, dove memorizzare il determinante della matrice dei coefficienti, dunque la sua complessità è minima: O(n^2) (n^2 per memorizzare la matrice dei coefficienti, 2n per memorizzare il vettore dei termini noti e le soluzioni, più uno spazio anch'esso pari ad n per il calcolo dei determinanti)
  • l'algoritmo di Gauss non richiede altro spazio oltre a quello necessario per memorizzare la matrice dei coefficienti e il vettore dei termini noti. Al termine dell'algoritmo il vettore dei termini noti conterrà la soluzione. Pertanto la sua complessità spaziale è anch'essa minima: O(n^2).

  Strutture di dati

Exquisite-kfind.png Per approfondire, vedi la voce Struttura dati.

La maggior parte degli algoritmi coinvolge metodi sofisticati per l'organizzazione dei dati utilizzati nelle elaborazioni. Gli oggetti creati con questi metodi vengono chiamati strutture dati. Algoritmi semplici possono richiedere strutture dati complesse e viceversa.

Inoltre molte tipologie di algoritmi sono nate per la gestione di strutture dati complesse e per agevolarne la gestione.

Esempi di strutture dati sono gli Array, le liste, le code, le pile, gli alberi e i grafi.

  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:

Molte categorie di algoritmi sono strettamente legate all'organizzazione dei dati in memoria (strutture dati).

  Altri algoritmi

  Note

  1. ^ Luca Serianni, Grammatica italiana, ed. UTET-De Agostini, Torino, 2010, ISBN 978-88-6008-057-8, p. 104.
  2. ^ Kleene 1943 in Davis 1965:274
  3. ^ Rosser 1939 in Davis 1965:225
  4. ^ Yiannis N. Moschovakis, What is an algorithm? in Mathematics Unlimited — 2001 and beyond, Springer, 2001, 919–936 (Part II).

  Bibliografia

  Voci correlate

  Altri progetti

  Collegamenti esterni

   
               

 

Toutes les traductions de algoritmo


Contenu de sensagent

  • définitions
  • synonymes
  • antonymes
  • encyclopédie

dictionnaire et traducteur pour sites web

Alexandria

Une fenêtre (pop-into) d'information (contenu principal de Sensagent) est invoquée un double-clic sur n'importe quel mot de votre page web. LA fenêtre fournit des explications et des traductions contextuelles, c'est-à-dire sans obliger votre visiteur à quitter votre page web !

Essayer ici, télécharger le code;

SensagentBox

Avec la boîte de recherches Sensagent, les visiteurs de votre site peuvent également accéder à une information de référence pertinente parmi plus de 5 millions de pages web indexées sur Sensagent.com. Vous pouvez Choisir la taille qui convient le mieux à votre site et adapter la charte graphique.

Solution commerce électronique

Augmenter le contenu de votre site

Ajouter de nouveaux contenus Add à votre site depuis Sensagent par XML.

Parcourir les produits et les annonces

Obtenir des informations en XML pour filtrer le meilleur contenu.

Indexer des images et définir des méta-données

Fixer la signification de chaque méta-donnée (multilingue).


Renseignements suite à un email de description de votre projet.

Jeux de lettres

Les jeux de lettre français sont :
○   Anagrammes
○   jokers, mots-croisés
○   Lettris
○   Boggle.

Lettris

Lettris est un jeu de lettres gravitationnelles proche de Tetris. Chaque lettre qui apparaît descend ; il faut placer les lettres de telle manière que des mots se forment (gauche, droit, haut et bas) et que de la place soit libérée.

boggle

Il s'agit en 3 minutes de trouver le plus grand nombre de mots possibles de trois lettres et plus dans une grille de 16 lettres. Il est aussi possible de jouer avec la grille de 25 cases. Les lettres doivent être adjacentes et les mots les plus longs sont les meilleurs. Participer au concours et enregistrer votre nom dans la liste de meilleurs joueurs ! Jouer

Dictionnaire de la langue française
Principales Références

La plupart des définitions du français sont proposées par SenseGates et comportent un approfondissement avec Littré et plusieurs auteurs techniques spécialisés.
Le dictionnaire des synonymes est surtout dérivé du dictionnaire intégral (TID).
L'encyclopédie française bénéficie de la licence Wikipedia (GNU).

Copyright

Les jeux de lettres anagramme, mot-croisé, joker, Lettris et Boggle sont proposés par Memodata.
Le service web Alexandria est motorisé par Memodata pour faciliter les recherches sur Ebay.
La SensagentBox est offerte par sensAgent.

Traduction

Changer la langue cible pour obtenir des traductions.
Astuce: parcourir les champs sémantiques du dictionnaire analogique en plusieurs langues pour mieux apprendre avec sensagent.

 

4788 visiteurs en ligne

calculé en 0,046s


Je voudrais signaler :
section :
une faute d'orthographe ou de grammaire
un contenu abusif (raciste, pornographique, diffamatoire)
une violation de copyright
une erreur
un manque
autre
merci de préciser :