Algoritmi core distribuiti


307

Per dimostrare l'importanza degli algoritmi (ad esempio per studenti e professori che non fanno la teoria o provengono anche da campi completamente diversi), a volte è utile avere a portata di mano un elenco di esempi in cui gli algoritmi di base sono stati distribuiti in ambito commerciale, governativo, o software / hardware ampiamente utilizzati.

Sto cercando tali esempi che soddisfino i seguenti criteri:

  1. Il software / hardware che utilizza l'algoritmo dovrebbe essere ampiamente utilizzato in questo momento.

  2. L'esempio dovrebbe essere specifico. Fornire un riferimento a un sistema specifico e un algoritmo specifico.
    Ad esempio, in "l'algoritmo X è utile per l'elaborazione delle immagini" il termine "elaborazione delle immagini" non è abbastanza specifico; in "Ricerca Google utilizza algoritmi grafici" il termine "algoritmi grafici" non è abbastanza specifico.

  3. L'algoritmo dovrebbe essere insegnato in tipico corso di laurea o dottorato. classi in algoritmi o strutture dati. Idealmente, l'algoritmo è coperto da manuali di algoritmi tipici. Ad esempio, "il noto sistema X utilizza un algoritmo Y poco noto" non è buono.


Aggiornare:

Grazie ancora per le grandi risposte e collegamenti! Alcune persone commentano che è difficile soddisfare i criteri perché gli algoritmi core sono così pervasivi che è difficile indicare un uso specifico. Vedo la difficoltà. Ma penso che valga la pena di fornire esempi specifici perché nella mia esperienza raccontando alla gente: "Guarda, gli algoritmi sono importanti perché sono praticamente ovunque !" non funziona.


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Bjørn Kjos-Hanssen

Risposte:


473

Gli algoritmi che sono il driver principale dietro un sistema sono, secondo me, più facili da trovare nei corsi non algoritmici per lo stesso motivo per cui i teoremi con applicazioni immediate sono più facili da trovare nella matematica applicata piuttosto che nei corsi di matematica pura. È raro che un problema pratico abbia la struttura esatta del problema astratto in una lezione. Per essere polemici, non vedo alcun motivo per cui gli algoritmi alla moda del materiale didattico come la moltiplicazione di Strassen, il test di primalità AKS o l'algoritmo Moser-Tardos sono rilevanti per problemi pratici di basso livello nell'implementazione di un database video, un compilatore ottimizzante, un sistema operativo , un sistema di controllo della congestione della rete o qualsiasi altro sistema. Il valore di questi corsi sta nell'apprendere che esistono modi intricati per sfruttare la struttura di un problema per trovare soluzioni efficienti. Gli algoritmi avanzati sono anche quelli in cui si incontrano algoritmi semplici la cui analisi non è banale. Per questo motivo, non escluderei semplici algoritmi randomizzati o PageRank.

Penso che puoi scegliere qualsiasi grande software e trovare algoritmi di base e avanzati implementati in esso. Come caso di studio, l'ho fatto per il kernel Linux e ho mostrato alcuni esempi di Chromium.

Strutture di dati e algoritmi di base nel kernel Linux

I collegamenti sono al codice sorgente su github .

  1. Elenco collegato , elenco doppiamente collegato , elenco collegato senza blocco .
  2. B + Alberi con commenti che ti dicono cosa non riesci a trovare nei libri di testo.

    Un'implementazione relativamente semplice di B + Tree. L'ho scritto come un esercizio di apprendimento per capire come funzionano B + Trees. Si è rivelato utile.

    ...

    È stato utilizzato un trucco che non si trova comunemente nei libri di testo. I valori più bassi sono a destra, non a sinistra. Tutti gli slot utilizzati all'interno di un nodo sono a sinistra, tutti gli slot non utilizzati contengono valori NUL. La maggior parte delle operazioni esegue semplicemente il ciclo una volta su tutti gli slot e termina con il primo NUL.

  3. Elenchi ordinati per priorità utilizzati per mutex , driver , ecc.

  4. Gli alberi rosso-nero vengono utilizzati per la pianificazione, la gestione della memoria virtuale, per tenere traccia dei descrittori di file e delle voci di directory, ecc.
  5. Alberi a intervalli
  6. Gli alberi Radix vengono utilizzati per la gestione della memoria , le ricerche relative a NFS e le funzionalità relative alla rete.

    Un uso comune dell'albero radix è di memorizzare i puntatori per strutturare le pagine;

  7. Heap prioritario , che è letteralmente un'implementazione di un libro di testo, utilizzato nel sistema del gruppo di controllo .

    Heap di priorità di dimensioni statiche di solo inserimento statico contenente puntatori, basato su CLR, capitolo 7

  8. Funzioni di hash , con riferimento a Knuth e ad un documento.

    Knuth raccomanda numeri primi approssimativamente in rapporto aureo al numero intero massimo rappresentabile da una parola macchina per hashing moltiplicativo. Chuck Lever ha verificato l'efficacia di questa tecnica:

    http://www.citi.umich.edu/techreports/reports/citi-tr-00-1.pdf

    Questi numeri primi sono scelti per essere bit-sparse, ovvero le operazioni su di essi possono usare turni e aggiunte invece di moltiplicazioni per macchine in cui le moltiplicazioni sono lente.

  9. Alcune parti del codice, come questo driver , implementano la propria funzione hash.

    funzione hash usando un algoritmo Hash rotante

    Knuth, D. The Art of Computer Programming, Volume 3: Sorting and Searching, Capitolo 6.4. Addison Wesley, 1973

  10. Tabelle di hash utilizzate per implementare inode , controlli di integrità del file system ecc.
  11. Matrici di bit , che vengono utilizzate per gestire flag, interrupt, ecc. E sono presenti in Knuth Vol. 4.

  12. Semafori e spin lock

  13. La ricerca binaria viene utilizzata per la gestione degli interrupt , la ricerca nella cache dei registri , ecc.

  14. Ricerca binaria con B-alberi

  15. Profondità prima ricerca e variante utilizzate nella configurazione della directory .

    Esegue una camminata in profondità modificata prima della struttura dello spazio dei nomi, iniziando (e terminando) nel nodo specificato da start_handle. La funzione di callback viene chiamata ogni volta che viene trovato un nodo che corrisponde al parametro type. Se la funzione di richiamata restituisce un valore diverso da zero, la ricerca viene terminata immediatamente e questo valore viene restituito al chiamante.

  16. La prima ricerca di larghezza viene utilizzata per verificare la correttezza del blocco in fase di esecuzione.

  17. Unisci ordinamento su elenchi collegati viene utilizzato per la garbage collection , la gestione del file system , ecc.

  18. Bubble sort è anche incredibilmente implementato, in una libreria di driver.

  19. Knuth-Morris-Pratt abbinamento di stringhe ,

    Implementa un algoritmo di corrispondenza delle stringhe a tempo lineare dovuto a Knuth, Morris e Pratt [1]. Il loro algoritmo evita del tutto il calcolo esplicito della funzione di transizione DELTA. Il suo tempo di corrispondenza è O (n), per n che è lunghezza (testo), usando solo una funzione ausiliaria PI [1..m], per m che è lunghezza (modello), precompilato dal modello nel tempo O (m). L'array PI consente di calcolare la funzione di transizione DELTA in modo efficiente "al volo" secondo necessità. In parole povere, per qualsiasi stato "q" = 0,1, ..., m e qualsiasi carattere "a" in SIGMA, il valore PI ["q"] contiene le informazioni indipendenti da "a" ed è necessario per calcola DELTA ("q", "a") 2. Poiché l'array PI ha solo m voci, mentre DELTA ha voci O (m | SIGMA |), salviamo un fattore di | SIGMA | nel tempo di preelaborazione calcolando PI anziché DELTA.

    [1] Cormen, Leiserson, Rivest, Stein Introdcution to Algorithms, 2nd Edition, MIT Press

    [2] Vedi teoria dell'automazione finita

  20. Corrispondenza del modello di Boyer-Moore con riferimenti e raccomandazioni su quando preferire l'alternativa.

    Implementa l'algoritmo di corrispondenza delle stringhe Boyer-Moore:

    [1] A Fast String Searching Algorithm, RS Boyer e Moore. Comunicazioni della Association for Computing Machinery, 20 (10), 1977, pagg. 762-772. http://www.cs.utexas.edu/users/moore/publications/fstrpos.pdf

    [2] Manuale degli algoritmi di corrispondenza delle stringhe esatte, Thierry Lecroq, 2004 http://www-igm.univ-mlv.fr/~lecroq/string/string.pdf

    Nota: poiché Boyer-Moore (BM) esegue ricerche di corrispondenze da destra a sinistra, è ancora possibile che una corrispondenza possa essere suddivisa su più blocchi, in tal caso questo algoritmo non troverà alcuna coincidenza.

    Se sei disposto a garantire che ciò non accadrà mai, utilizza invece l'implementazione di Knuth-Pratt-Morris (KMP). In conclusione, scegli l'algoritmo di ricerca delle stringhe appropriato in base alle tue impostazioni.

    Supponiamo che tu stia utilizzando l'infrastruttura di ricerca di testo per filtrare, NIDS o
    altri scopi simili focalizzati sulla sicurezza, quindi vai su KMP. Altrimenti, se ti preoccupi davvero delle prestazioni, supponi che stai classificando i pacchetti per applicare i criteri di qualità del servizio (QoS) e non ti preoccupi dei possibili abbinamenti distribuiti su più frammenti, quindi vai su BM.

Strutture dati e algoritmi nel browser web Chromium

I collegamenti sono al codice sorgente sul codice di Google . Ne elencherò solo alcuni. Suggerirei di utilizzare la funzione di ricerca per cercare il tuo algoritmo o struttura di dati preferito.

  1. Splay alberi .

    L'albero è inoltre parametrizzato da una politica di allocazione (allocatore). La politica viene utilizzata per allocare gli elenchi nel negozio libero C o nella zona; vedi zona.h.

  2. I diagrammi di Voronoi sono usati in una demo.
  3. Tabulazione basata sull'algoritmo di Bresenham .
Esistono anche tali strutture di dati e algoritmi nel codice di terze parti incluso nel codice Chromium.

  1. Alberi binari
  2. Alberi rosso-neri

    Conclusione di Julian Walker

    Gli alberi neri rossi sono bestie interessanti. Si ritiene che siano più semplici degli alberi AVL (il loro diretto concorrente), e a prima vista questo sembra essere il caso perché l'inserimento è un gioco da ragazzi. Tuttavia, quando si inizia a giocare con l'algoritmo di eliminazione, gli alberi neri rossi diventano molto difficili. Tuttavia, il contrappeso a questa complessità aggiunta è che sia l'inserimento che la cancellazione possono essere implementati usando un algoritmo top-down a singolo passaggio. Questo non è il caso degli alberi AVL, in cui solo l'algoritmo di inserimento può essere scritto dall'alto verso il basso. La cancellazione da un albero AVL richiede un algoritmo bottom-up.

    ...

    Gli alberi neri rossi sono popolari, poiché la maggior parte delle strutture dati con un nome stravagante. Ad esempio, in Java e C ++, le strutture della mappa della libreria sono in genere implementate con un albero nero rosso. Anche gli alberi neri rossi sono paragonabili in velocità agli alberi AVL. Mentre l'equilibrio non è altrettanto buono, il lavoro che serve per mantenere l'equilibrio è di solito migliore in un albero nero rosso. Ci sono alcune idee sbagliate che galleggiano intorno, ma per la maggior parte l'hype sugli alberi neri rossi è accurato.

  3. Alberi AVL
  4. La corrispondenza delle stringhe di Rabin-Karp viene utilizzata per la compressione.
  5. Calcola i suffissi di un automa .
  6. Filtro Bloom implementato da Apple Inc.
  7. L'algoritmo di Bresenham .

Librerie di linguaggi di programmazione

Penso che valga la pena considerarli. I progettisti dei linguaggi di programmazione hanno ritenuto che valesse la pena il tempo e lo sforzo di alcuni ingegneri per implementare queste strutture di dati e algoritmi, così che altri non avrebbero dovuto. L'esistenza di librerie è parte del motivo per cui possiamo trovare strutture di dati di base reimplementate in software scritto in C ma meno per le applicazioni Java.

  1. Il C ++ STL include elenchi, pile, code, mappe, vettori e algoritmi per l' ordinamento, la ricerca e la manipolazione dell'heap .
  2. L'API Java è molto estesa e copre molto di più.
  3. La libreria Boost C ++ include algoritmi come gli algoritmi di corrispondenza delle stringhe Boyer-Moore e Knuth-Morris-Pratt.

Algoritmi di allocazione e pianificazione

Trovo questi interessanti perché, anche se sono chiamati euristica, la politica che usi determina il tipo di algoritmo e la struttura dei dati richiesti, quindi è necessario conoscere stack e code.

  1. Gli ultimi usati di recente possono essere implementati in più modi. Un'implementazione di lista nel kernel di Linux.
  2. Altre possibilità sono First In First Out, Almeno frequentemente utilizzate e Round Robin.
  3. Una variante di FIFO è stata utilizzata dal sistema VAX / VMS.
  4. L'algoritmo Clock di Richard Carr viene utilizzato per la sostituzione della cornice di pagina in Linux.
  5. Il processore Intel i860 ha utilizzato una politica di sostituzione casuale.
  6. La cache di sostituzione adattiva viene utilizzata in alcuni controller di archiviazione IBM ed è stata utilizzata in PostgreSQL anche se solo brevemente a causa di problemi di brevetto .
  7. L' algoritmo di allocazione della memoria Buddy , che è discusso da Knuth in TAOCP Vol. 1 è usato nel kernel Linux e l'allocatore simultaneo jemalloc usato da FreeBSD e in Facebook .

Utilità principali nei sistemi * nix

  1. grep e awk implementano entrambi la costruzione Thompson-McNaughton-Yamada di NFA da espressioni regolari, che apparentemente batte persino l'implementazione del Perl .
  2. tsort implementa l'ordinamento topologico.
  3. fgrep implementa l' algoritmo di corrispondenza delle stringhe Aho-Corasick.
  4. GNU grep , implementa l'algoritmo Boyer-Moore secondo l'autore Mike Haertel.
  5. crypt (1) su Unix ha implementato una variante dell'algoritmo di crittografia nella macchina Enigma.
  6. Il diff Unix implementato da Doug McIllroy, basato su un prototipo scritto con James Hunt, ha prestazioni migliori dell'algoritmo di programmazione dinamica standard utilizzato per calcolare le distanze di Levenshtein. La versione Linux calcola la distanza di modifica più breve.

Algoritmi crittografici

Questa potrebbe essere una lista molto lunga. Gli algoritmi crittografici sono implementati in tutti i software in grado di eseguire comunicazioni o transazioni sicure.

  1. Gli alberi di merkle , in particolare la variante Tiger Tree Hash, sono stati utilizzati in applicazioni peer-to-peer come GTK Gnutella e LimeWire .
  2. MD5 viene utilizzato per fornire un checksum per i pacchetti software e viene utilizzato per i controlli di integrità sui sistemi * nix ( implementazione Linux ) ed è supportato anche su Windows e OS X.
  3. OpenSSL implementa molti algoritmi crittografici tra cui AES, Blowfish, DES, SHA-1, SHA-2, RSA, DES, ecc.

I compilatori

  1. L'analisi LALR è implementata da yacc e bison.
  2. Gli algoritmi di Dominator sono utilizzati nella maggior parte dei compilatori di ottimizzazione basati sul modulo SSA.
  3. lex e flex compilano espressioni regolari in NFA.

Compressione ed elaborazione delle immagini

  1. Gli algoritmi Lempel-Ziv per il formato immagine GIF sono implementati nei programmi di manipolazione delle immagini, a partire dall'utilità * nix convertita in programmi complessi.
  2. La codifica della lunghezza di esecuzione viene utilizzata per generare file PCX (utilizzati dal programma Paintbrush originale), file BMP compressi e file TIFF.
  3. La compressione wavelet è la base di JPEG 2000, quindi tutte le fotocamere digitali che producono file JPEG 2000 implementeranno questo algoritmo.
  4. La correzione degli errori Reed-Solomon è implementata nel kernel Linux , nelle unità CD, nei lettori di codici a barre ed è stata combinata con la convoluzione per la trasmissione di immagini da Voyager.

Apprendimento delle clausole basate sui conflitti

Dal 2000, il tempo di esecuzione dei solutori SAT su parametri di riferimento industriali (di solito del settore hardware, sebbene vengano utilizzate anche altre fonti) è diminuito quasi in modo esponenziale ogni anno. Una parte molto importante di questo sviluppo è l' algoritmo di apprendimento basato sulla clausola di conflitto che combina l' algoritmo di propagazione del vincolo booleano nel documento originale di Davis Logemann e Loveland con la tecnica dell'apprendimento delle clausole che ha avuto origine nella programmazione dei vincoli e nella ricerca dell'intelligenza artificiale. Per la modellazione industriale specifica, SAT è considerato un problema facile ( vedi questa discussione). Per me, questa è una delle più grandi storie di successo degli ultimi tempi perché combina progressi algoritmici distribuiti su diversi anni, idee ingegnose intelligenti, valutazione sperimentale e uno sforzo comune concertato per risolvere il problema. L' articolo del CACM di Malik e Zhang è una buona lettura. Questo algoritmo viene insegnato in molte università (ne ho frequentate quattro dove era il caso) ma in genere in una classe di metodi logici o formali.

Le applicazioni dei solutori SAT sono numerose. IBM, Intel e molte altre aziende hanno le proprie implementazioni di solutori SAT. Il gestore di pacchetti in OpenSUSE utilizza anche un solutore SAT.


5
@HuckBennett, CDCL è un algoritmo parametrizzato dall'euristica ma non è esso stesso un'euristica. Ha un comportamento esponenziale nel peggiore dei casi, ma non è banale dimostrarlo. Inoltre, non possiamo fare molto meglio ed è il meglio che possiamo fare in pratica, quindi penso che tutti gli informatici dovrebbero saperlo! Per quanto riguarda LRU, FIFO, ecc. Sono euristiche, ma, come con ARC, potrebbero essere necessari algoritmi o strutture dati intelligenti da implementare.
Vijay D,

9
Un simile commento non si sarebbe applicato a Simplex: inizialmente non ben compreso e successivamente dimostrato di essere esponenziale ma funziona in pratica e molto più tardi ha dimostrato di avere una complessità levigata polinomiale? Il CDCL è interessante per l'analisi dell'algoritmo perché è necessario passare attraverso la complessità della prova per derivare famiglie di formule che presentano comportamenti del caso peggiore e anche per mostrare che può essere esponenzialmente più succinta di alcune varianti di risoluzione. Esistono varie estensioni, come la rottura della simmetria e le tecniche di autarchia per le quali tale analisi è ancora aperta.
Vijay D,

28
Questo è un tesoro per uno studente
neo1691,

2
@EmanueleViola, ho aggiunto alcuni altri esempi. Il post è lungo ormai, quindi non voglio estenderlo. Forse dovresti porre una nuova domanda in particolare sulle implementazioni dei filtri Dijkstra, Simplex, Bloom come parte di un sistema reale come Linux, Chrome, un server web ecc. Penso che tu abbia maggiori probabilità di ottenere buone risposte se sei specifico.
Vijay D,

4
Notizie sugli hacker e r / programmazione.
Vijay D,

40

PageRank è uno dei più noti algoritmi del genere. Sviluppato dal co-fondatore di Google Larry Page e co-autori, ha costituito la base del motore di ricerca originale di Google ed è ampiamente riconosciuto come aiutante a raggiungere risultati di ricerca migliori rispetto ai suoi concorrenti in quel momento.

Immaginiamo un "surfista casuale" che parte da una pagina Web e fa clic ripetutamente su un collegamento casuale per portarlo su una nuova pagina. La domanda è: "Quale frazione del tempo trascorrerà il surfista in ogni pagina?" Più tempo il surfista trascorre su una pagina, più importante è la pagina considerata.

Più formalmente, vediamo Internet come un grafico in cui le pagine sono nodi e i collegamenti sono bordi diretti. Possiamo quindi modellare azione del navigatore come una passeggiata casuale su un grafico o equivalentemente come una catena di Markov con matrice di transizione . Dopo aver affrontato alcuni problemi per garantire che la catena di Markov sia ergodica (dove va il surfista se una pagina non ha collegamenti in uscita?), Calcoliamo il tempo che il surfista impiega in ciascuna pagina come distribuzione statica costante della catena di Markov .M

L'algoritmo stesso è in un certo senso banale: calcoliamo semplicemente per grande e distribuzione iniziale arbitraria . Ciò equivale solo a ripetute ripetizioni matrice-matrice o matrice-vettore. Il contenuto degli algoritmi è principalmente nell'assetto (garantendo ergodicità, dimostrando che una catena di Markov ergodica ha una distribuzione unica allo stato stazionario) e analisi di convergenza (dipendenza dal gap spettrale di ). k π 0 MMkπ0kπ0M


7
Non penso che questo sia il materiale tipico degli algoritmi.
Manu,

14
Per inciso, ho imparato a conoscere PageRank in una classe di algoritmi. In effetti, penso che il professore l'abbia scelto perché era un bell'esempio di "algoritmi usati nella pratica". Se limiti gli esempi al materiale di "prima metà del CLRS", l'elenco degli esempi sarà troppo lungo o troppo banale: quicksort, alberi B e l'algoritmo di Dijkstra sono onnipresenti.
Huck Bennett,

2
Insegniamo a PageRank agli studenti universitari.
Aaron Roth,

6
Lo insegno anche agli studenti universitari (sia nella classe di algoritmi richiesti sia in un algoritmo di grafi più specializzato facoltativo).
David Eppstein,

2
Ho imparato PageRank come studente universitario in un elettivo.
Vijay D,

33

Vorrei menzionare l'implementazione ampiamente utilizzata del software CPLEX (o simile) del metodo / algoritmo Simplex per risolvere problemi di programmazione lineare. È l'algoritmo (?) Più utilizzato nella ricerca economica e operativa.

"Se si prendessero le statistiche su quale problema matematico sta consumando la maggior parte del tempo del computer nel mondo, allora (senza contare i problemi di gestione del database come l'ordinamento e la ricerca) la risposta sarebbe probabilmente una programmazione lineare. " (L. Lovász, Una nuova algoritmo di programmazione lineare migliore o peggiore del metodo simplex? Math. Intelligencer 2 (3) (1979/80) 141-146.)

L'algoritmo Simplex ha anche una grande influenza in teoria; vedi, ad esempio, la congettura di Hirsch (polinomiale) .

Immagino un tipico studente universitario o dottorato di ricerca. la classe in algoritmi si occupa dell'algoritmo Simplex (inclusi algoritmi di base dall'algebra lineare come il metodo di eliminazione di Gauss).

(Altri algoritmi di successo, incluso Quicksort per l'ordinamento, sono elencati in Algoritmi dal libro .)


la "ricerca economica e operativa" non è abbastanza specifica. CPLEX non è nemmeno il tipo di esempio che stavo cercando, in quanto è solo un'implementazione dell'algoritmo; sarebbe diverso se, per esempio, il compilatore gcc usasse il metodo simplex.
Manu,

12
Penso che i "problemi di programmazione lineare" siano abbastanza specifici quando parliamo di economia e OR. Inoltre, per CPLEX intendevo l'algoritmo dietro l'implementazione.
vb, il

16
"Oggi, la maggior parte delle grandi aziende utilizza la programmazione lineare per valutare i prodotti e gestire le catene di approvvigionamento. Le aziende di trasporto lo usano per scegliere il modo più economico per consolidare, coordinare e indirizzare le spedizioni di molti prodotti da fornitori distribuiti a livello globale verso mercati distanti soggetti a vincoli di capacità. l'industria lo utilizza per l'esplorazione, la miscelazione, la programmazione e la distribuzione della produzione. L'industria siderurgica lo utilizza per valutare i minerali di ferro, esplorare l'aggiunta di forni da coke e selezionare i prodotti ... " news.stanford.edu/news/2005/may25/ dantzigobit-052505.html
Nikolov,

Grazie. Ma trovo la citazione tremendamente vaga. Penso che se dicessi che di fronte a una classe di studenti, metà di essa si addormenterebbe ;-) Sarebbe diverso se dicessimo qualcosa del genere: UPS usa LP per spedire i pacchi come segue ... Non sto dicendo tali esempi sono banali da trovare, ma dato che "la maggior parte delle grandi aziende usa LP", spero che possiamo almeno indicarne uno .
Manu,

10
Al di fuori della mia testa, dal 2007 LAX (l'aeroporto) ha utilizzato software per risolvere i giochi Stackelberg per programmare il personale di sicurezza. Risolvere grandi LP è parte del tutto, vedi ad esempio teamcore.usc.edu/ARMOR-LAX . Inoltre, chiederei a qualcuno del tuo dipartimento di ricerca operativa: di solito avrebbero molte storie di guerra sull'uso di LP nella vita reale
Sasho Nikolov,

30

A quanto ho capito, il National Resident Matching Program è stato per lungo tempo solo una semplice applicazione dell'algoritmo Gale-Shapley per il problema del matrimonio stabile. Da allora è stato leggermente aggiornato per gestire alcuni dettagli extra come incarichi sponsali (ovvero il "problema dei due corpi"), ecc ...


Non sono sicuro che il matrimonio stabile sia il tipico materiale degli algoritmi.
Manu,

16
È nel libro di Algorithms Design di Tardos e Kleinberg, e anche nel algoritmo randomizzato di Motwani, ed entrambi i libri sono ampiamente utilizzati. Il matrimonio stabile non può essere universalmente insegnato nei corsi di algoritmi, ma certamente è insegnato in molti di essi.
Sasho Nikolov,

10
Una rapida ricerca rivela che ha dimostrato in CS70 di Berkeley , MIT di 6,042 , di UMD CMSC451 , ecc ...
mhum

1
È interessante notare che quando si aggiungono incarichi coniugali, il problema diventa NP-completo: arxiv.org/abs/1308.4534 . Tuttavia, in pratica, questo non sembra causare troppi problemi: en.wikipedia.org/wiki/…
Joshua Grochow,

2
@EmanueleViola mentre potrebbe non essere coperto tradizionalmente, la sua inclusione nel libro Kleinberg / Tardos lo ha reso più popolare (e se non dovrebbe esserlo!)
Suresh Venkat,

24

Se stai includendo anche argomenti di livello di dottorato, molti programmi di laurea specialistica (la maggior parte?) Includono alcuni corsi di teoria dei codici. Se hai un corso di teoria dei codici, tratterai sicuramente il codice Reed-Solomon che è parte integrante del funzionamento dei compact disc e della codifica Huffman che viene utilizzata nei formati di file JPEG, MP3 e ZIP. A seconda dell'orientamento del corso, puoi anche coprire Lempel-Ziv che viene utilizzato nel formato GIF. Personalmente, ho preso Lempel-Ziv in un corso di algoritmi per studenti universitari, ma penso che potrebbe essere atipico.


1
E ho avuto una lezione sulla codifica di Huffman come studente universitario, necessaria per un progetto.
Brian S,

Huffman è in uno dei primi capitoli del CLRS, quindi dovrebbe sicuramente qualificarsi
Sasho Nikolov

21

GNU grep è uno strumento da riga di comando per la ricerca di uno o più file di input per le linee che contengono una corrispondenza con un modello specificato. È noto che grep è molto veloce! Ecco una citazione del suo autore Mike Haertel (presa da qui ):

GNU grep uses the well-known Boyer-Moore algorithm, which looks first for the
final letter of the target string, and uses a lookup table to tell it how far
ahead it can skip in the input whenever it finds a non-matching character.

19

Più in generale, il premio Kanellakis viene assegnato dall'ACM proprio per tali scoperte teoriche che hanno avuto un impatto notevole nella pratica.

il premio 2012 è per l' hashing sensibile alla località , che è diventato un metodo di riferimento per la riduzione della dimensionalità nel data mining per problemi vicini (ed è relativamente facile da insegnare - almeno l'algoritmo stesso)


Penso che questo sia insegnabile ma non ampiamente insegnato.
Manu,

3
Sfortunato, ma vero. Tuttavia, le varianti di LSH (come lo schizzo Count-min e i parenti) stanno iniziando ad apparire in corsi di "dati di grandi dimensioni" o "data mining". Insegno filtri di fioritura nella mia classe di algoritmi, per esempio.
Suresh Venkat,

Come esperienza personale, LSH non si è adattato a noi su un'istanza di "big data" (articoli da 100 mln).
lynxoid

1
@lynxoid è una discussione / domanda separata :). Ci sono abbastanza esempi di dove si fa il lavoro che penso che sia relative a questa particolare domanda.
Suresh Venkat,

18

ε

Alcuni esempi di usi industriali di queste strutture di dati sono:

  • Il sistema Sawzall di Google per l'analisi dei dati non strutturati utilizza il Count Sketch per implementare una funzione di "articoli più popolari"
  • Il sistema "stream database" Gigascope di AT&T per il monitoraggio del traffico di rete implementa lo sketch CountMin.
  • Il sistema di monitoraggio continuo (CMON) di Sprint implementa CountMin.

Ecco anche un sito che raccoglie informazioni sulle applicazioni di CountMin.

Per quanto riguarda l'insegnamento, so che le tecniche di sketch di base sono insegnate a Princeton in corsi di matematica discreti. Mi è stato insegnato lo schizzo CountMin nel mio primo corso di algoritmi. In ogni caso, l'analisi di CountMin è più semplice dell'analisi per quasi tutti gli altri algoritmi randomizzati: è un'applicazione diretta dell'indipendenza a coppie e della disuguaglianza di Markov. Se questo non è materiale standard nella maggior parte dei corsi di algoritmi, penso che sia per ragioni storiche.


1
Grandi esempi (anche se non proprio algo core in questo momento).
Manu,

16

Nell'ultimo decennio sono stati utilizzati algoritmi per aumentare il numero (e la qualità, penso?) Dei trapianti di rene attraverso vari programmi di abbinamento dei donatori di rene. Ho avuto problemi a trovare le ultime notizie su questo, ma qui ci sono almeno alcuni suggerimenti:

  • Nel 2007 l'Alleanza per la donazione accoppiata utilizzava un algoritmo di Abraham, Blum e Sandholm . Potrebbero ancora usarlo, ma non sono riuscito a cercarlo online. Sebbene questo algoritmo non sia quasi certamente coperto in corsi "standard", combina diverse idee fondamentali che sicuramente vengono insegnate in tali corsi per fornire un algoritmo abbastanza buono per un problema che è, in generale, NP-completo (una variante di Cycle Cover ).

  • Il National Kidney Registry utilizza anche alcuni algoritmi standard, tra cui (ad un certo punto) CPLEX. Ciò ha portato a una catena di trapianti effettivamente eseguita che collega 60 persone .

Questo è uno dei miei esempi preferiti non solo del successo degli algoritmi, ma dell'importanza di studiare algoritmi per problemi NP-completi. Possono letteralmente salvare vite e l'hanno già fatto!


Inoltre, per scambiare i giochi da tavolo viene utilizzata una versione più semplice di questi algoritmi: okasaki.blogspot.co.uk/2008/03/what-heck-is-math-trade.html
Radu GRIGore

15

L'algoritmo di Viterbi, che è ancora ampiamente utilizzato nel riconoscimento vocale e in molte altre applicazioni: http://en.wikipedia.org/wiki/Viterbi_algorithm L'algoritmo stesso è una programmazione dinamica di base.

Da Wikipedia: "L'algoritmo di Viterbi è stato proposto da Andrew Viterbi nel 1967 come algoritmo di decodifica per codici convoluzionali su collegamenti di comunicazione digitale rumorosi. [1] L'algoritmo ha trovato un'applicazione universale nella decodifica dei codici convoluzionali utilizzati in entrambi i cellulari digitali CDMA e GSM, modem dial-up, satellite, comunicazioni nello spazio profondo e LAN wireless 802.11. Ora è anche comunemente usato nel riconoscimento vocale, nella sintesi vocale, nell'individuazione delle parole chiave, nella linguistica computazionale e nella bioinformatica. Ad esempio, nel discorso-testo riconoscimento), il segnale acustico viene trattato come la sequenza di eventi osservata e una stringa di testo è considerata la "causa nascosta" del segnale acustico. L'algoritmo di Viterbi trova la stringa di testo più probabile dato il segnale acustico. "


13
  1. Un * è utilizzato in molti dispositivi di navigazione personali (ovvero unità GPS)
  2. A * è molto ben definito ed è stato implementato in modo abbastanza semplice.
  3. Un * non è del tutto banale, ma non richiede un dottorato. per capirlo.

A * viene anche spesso insegnato nella progettazione del gioco. Non penso che i moderni giochi 3D generalmente utilizzino A * per la navigazione NPC, ma i giochi 2D / isometrici, così come i giochi più vecchi, fanno uso dell'algoritmo.
Brian S,

@BrianS Conosci esempi di algoritmi di pathfinding utilizzati nei giochi 3D, in particolare NPC nemici nei giochi (come uno sparatutto npc) Ricordo di aver letto qualcosa come ... dividere una mappa in settori esagonali e usarla come nodo, invece di quadrati e ciò ha permesso un movimento più fluido.
Goodwine,

@ Goodood, mi dispiace, non ho esempi reali di algoritmi di pathfinding nei giochi 3D. La mia esperienza personale è stata con ambienti simili a "cubi" (mappa fatta di cubi, su cui si trovano i personaggi - fondamentalmente 2D, nonostante il rendering 3D) e IA fittizi utilizzati per testare i personaggi dei giocatori contro.
Brian S,

12

Dai un'occhiata al progetto BonnTools per Chip Design di Jens Vygen. http://www.or.uni-bonn.de/~vygen/projects.html Ho sentito alcuni discorsi su questo e ho anche guardato alcuni dei loro articoli. Usano l'arrotondamento randomizzato in stile Raghavan-Thompson e il metodo di aggiornamento del peso moltiplicativo per risolvere LP su larga scala a flusso multiplo. Tuttavia, come ogni grande progetto, devono anche fare un po 'di ingegneria, ma la metodologia si basa molto su algoritmi ben noti.


Darò un'occhiata ma non sembra il tipico materiale di algoritmi.
Manu,

8
Hmm, l'arrotondamento randomizzato viene in genere insegnato nei corsi di algoritmi a livello di dottorato, no?
Chandra Chekuri,

2
Perché solo arrotondamenti randomizzati? Sanjeev Arora, Elad Hazan e Satyen Kale pensano che anche il metodo di aggiornamento dei pesi mulplicativi sia abbastanza semplice da insegnare a livello UG :) "Riteniamo che il nostro meta algoritmo e la sua analisi siano abbastanza semplici e utili da poter essere visti come uno strumento di base ha insegnato a tutti gli studenti di algoritmi insieme a divide-and-conquer, programmazione dinamica, campionamento casuale e simili. " (cfr. cs.princeton.edu/~arora/pubs/MWsurvey.pdf ).
Jagadish,


10

Sono piuttosto sorpreso che con tutti gli algoritmi di fantasia sopra menzionati, nessuno abbia menzionato la venerabile famiglia di algoritmi di compressione Lempel-Ziv (inventata nel 1977/78).

  1. Questi sono usati ovunque: testo per immagine per l'elaborazione in streaming. È del tutto possibile che LZ * sia una singola famiglia di algoritmi più utilizzata al mondo.
  2. La compressione del dizionario è stata un notevole passo avanti nella teoria della compressione e una netta partenza dall'approccio in stile Shannon-Fano.
  3. Gli algoritmi della famiglia sono piuttosto semplici e facili da comprendere.

Aggiornare

Apparentemente è già stato menzionato brevemente.


10

la decomposizione del valore singolare (SVD) ha una forte connessione con l' analisi dei fattori statistici o l' analisi delle componenti principali ed è comprensibile all'interno di una classe di algebra lineare o statistica universitaria e ha molte proprietà teoriche importanti. gioca anche un ruolo negli algoritmi di compressione delle immagini. ha giocato un ruolo chiave nelle voci vincitrici del concorso a premi Netflix da $ 1M (uno dei più grandi concorsi di datamining nella storia della storia) ed è ora implementato sul loro sito per prevedere le valutazioni degli utenti. è anche noto per essere altamente correlato alle reti neurali auto-organizzanti hebbiane che hanno origine nella teoria biologica.

c'è qualche connessione anche con la discesa del gradiente che è ampiamente usata nell'apprendimento automatico e nelle reti neurali artificiali e come una tecnica di ottimizzazione applicata universalmente, nel qual caso il metodo di Newton è una forma di base 2d. esiste un algoritmo di discesa gradiente per ottenere l'SVD.


10

Trovare un percorso euleriano è alla base dell'assemblea del genoma - un compito comunemente svolto quando si lavora con genomi completi (in bioinformatica, medicina, medicina legale, ecologia).

AGGIORNAMENTO Dimenticato questo ovvio: UPS, FedEx, USPS devono risolvere tutti i grandi casi di Problema del commesso viaggiatore ogni notte. Risparmia molto tempo e denaro per inviare i conducenti su un percorso ottimale.

UPDATE2 Il problema relativo al set di vertici di feedback minimo viene utilizzato per la risoluzione di deadlock in molti sistemi operativi.


Sei sicuro che TSP sia il problema che le società di consegna pacchi stanno cercando di risolvere? Ho pensato che una sfida pratica più grande fosse lo zaino e altri tipi di problemi di imballaggio.
András Salamon,

Le assegnazioni per i conducenti cambiano ogni giorno (ad esempio, il ragazzo UPS non ha bisogno di visitare la stessa casa ogni giorno), quindi i percorsi devono essere aggiornati su base giornaliera. Non è un puro TSP - ci sono ulteriori vincoli come strade a senso unico, nessuna inversione a U, consegna di pacchi da un lato della strada, ma non dall'altro.
lynxoid

Sono sicuro che anche l'imballaggio è importante.
lynxoid

9

Mi piace questo sistema per salvare il numero massimo di vite nel Regno Unito con i trapianti di rene, basato su algoritmi di corrispondenza massimi: Donazione renale accoppiata e altruistica . Abbinano le persone che hanno bisogno di reni che hanno un amico / parente non corrispondente disposto a donare, con altre persone nella stessa situazione, in modo massimo. Quindi, il giorno della donazione, tutti i donatori donano contemporaneamente, seguito da un rapido trasporto di reni in tutto il paese ai destinatari.


8

questo libro relativamente nuovo merita di essere considerato come una risposta completa / dettagliata alla domanda in forma conveniente, estesa / raccolta e che potrebbe essere usata come materiale supplementare per una classe di algoritmi. [alcuni di questi sono già stati menzionati; la forte sovrapposizione stessa è notevole.]


La seconda referenza è originaria del numero di gennaio / febbraio 2000 di Computing in Science & Engineering, una pubblicazione congiunta dell'American Institute of Physics e dell'IEEE Computer Society. compilato dai redattori ospiti Jack Dongarra dell'Università del Tennessee e Oak Ridge National Laboratory e Francis Sullivan del Center for Computing Sciences presso l'Institute for Defense Analyses
vzn


6

Pensando ad algoritmi molto basilari

  1. I generatori di numeri casuali si trovano ovunque e in particolare in tutti i giochi.
  2. I database sono composti da molti algoritmi, tra cui B +, hash, code di priorità, espressione regolare, crittografia, ordinamento, ecc ... Un mio amico afferma che gli SGBD sono in cima alla catena alimentare informatica.
  3. L'ordinamento viene utilizzato ovunque, ad esempio in Excel. In realtà è usato tutto il tempo nella vita reale, ma di solito gli umani usano algoritmi ad hoc
  4. I bit di parità sono utilizzati tutt'intorno
  5. La codifica Huffman è nel software di compressione e trasmissione
  6. Le pile (LIFO) sono utilizzate ovunque. All'interno dei linguaggi di programmazione, nelle CPU, ecc ...

Bello mostrare che appaiono nella vita reale:

A. Molti gruppi usano una sorta di algoritmo di copertura dell'albero per comunicare, dividendo le liste telefoniche in modo gerarchico tra le persone B. Le auto in un incrocio di solito usano un algoritmo round robin (in modo volontario) C. La maggior parte dei luoghi, come banche e ospedale, organizza i suoi clienti in un algoritmo FIFO


4
L'ordinamento non è un algoritmo. È un compito, cioè qualcosa che desideri eseguire, per il quale devi progettare (o, in pratica, scegliere) un algoritmo.
David Richerby,

Questi non sembrano essere esempi specifici come richiesto nella domanda.
Kaveh,

SGBD == RDBMS FYI per coloro che non lo sapevano.
Autodidatta,

6

Un affascinante problema algoritmico sorge nell'applicazione medica della TAC. Nella tomografia computerizzata (CT), il corpo è esposto ai raggi X da diverse angolazioni. A un'estremità dello scanner si trovano i trasmettitori di raggi X e all'altra estremità i sensori. Da una tale serie di scansioni, un'immagine viene ricostruita per essere esaminata dal medico!

L' algoritmo di retroproiezione filtrata è la base per la ricostruzione di un'immagine da una serie di scansioni. Questo algoritmo è in realtà una forma di problema di approssimazione in cui il "segnale" viene campionato al di sotto della velocità di Nyquist. Questo algoritmo è in uso "dietro le quinte" in tutti gli ospedali e la retroproiezione di base filtrata utilizza la matematica universitaria come le trasformate di Fourier per ottenere il Teorema della fetta di Fourier .


6

Un esempio di FFT

Una volta ho aiutato a portare un algoritmo FFT in una lingua di sistema diversa.

L'algoritmo veniva utilizzato per determinare le interruzioni di linea nella consegna coassiale di tv via cavo / internet / telefono. Fondamentalmente un tecnico richiederebbe un segnale da inviare al box del cliente, allo stesso tempo tirerebbe su una visualizzazione in tempo reale delle statistiche per il cliente specifico, come QoS, dB, .... Il tecnico potrebbe usare i dati e un grafico per determinare a pochi metri tra la casa e il palo dove esisteva una rottura parziale (o più rotture come mi era stato detto).

Come accennato in precedenza, FFT è ampiamente utilizzato, ma questo è stato uno dei più palesi ed evidenti (in termini di perché e come) che ho visto in pratica.

Mi dispiace, ho dovuto mantenerlo ad alto livello.


5

L'algoritmo di linea di Bresenham è il singolo algoritmo più utile che abbia mai incontrato. Facile da capire Ive lo ha usato per molte applicazioni, dal disegno a tratteggio a una spliner complessa per il motore di casting 3d a un renderizzatore di poligoni complesso, nonché per usi complessi di animazione e ridimensionamento.



2

Wikipedia ha una discreta raccolta di algoritmi / applicazioni classificati più o meno in un elenco . Microsoft fornisce i documenti più citati, ma senza alcuna spiegazione esplicita dell'area dell'informatica né dell'applicazione. C'è anche un elenco cronologico di diverse conferenze CS _http: //jeffhuang.com/best_paper_awards.html_ compilato dal Prof. Huang.

Il clustering spettrale è un elegante algoritmo di clustering, noto come algoritmo di taglio normalizzato introdotto da Jianbo Shi e Jitendra Malik per la segmentazione delle immagini. È stato anche ben sviluppato nelle applicazioni di clustering dei dati, essendo un buon punto di intersezione tra le due comunità.


-2

altri due esempi preferiti personali saldamente radicati nell'informatica, ma forse facilmente trascurati dai teorici astrattisti, che hanno subito enormi / trasformativi progressi e hanno avuto un impatto pratico / massiccio enorme nella vita quotidiana negli ultimi decenni. già un'intera generazione è cresciuta senza conoscere il mondo senza di loro. fondamentalmente la categoria di modellazione e simulazione .

  • algoritmi di simulazione fisica . principalmente usando le leggi di Newton ma usando altre leggi (come la fluidodinamica). utilizzato in una vasta gamma di applicazioni che vanno da applicazioni di ingegneria, videogiochi e talvolta film. questo è anche responsabile del miglioramento significativo della sicurezza, dell'efficienza o dell'affidabilità, ad esempio di automobili e aerei, sottoponendo i progetti virtuali / di prova a sollecitazioni simulate. un'importante area di ricerca in corso correlata dalla bioinformatica con enormi implicazioni in biologia, ad es. progettazione di farmaci, prevenzione delle malattie, ecc.: ripiegamento delle proteine ​​/ previsione della struttura . anche notare che quest'anno il Premio Nobel per la chimica è stato assegnato per la simulazione chimica a Karplus, Levitt, Warshel. Gli algoritmi di simulazione fisica sono fortemente coinvolti nella sicurezza / test delle armi nucleari ad es. nei laboratori di Los Alamos.

  • algoritmi raytracing / CGI . questo è iniziato come argomento di ricerca solo qualche decennio fa [un amico ha conseguito il master in CS scrivendo algoritmi di raytracing] ma è diventato molto applicato ad esempio nei giochi e nell'industria cinematografica, raggiungendo livelli straordinari di verosimiglianza che è responsabile di grandi quantità di effetti speciali nei film. queste industrie hanno letteralmente investito miliardi di dollari e cavalcando questi algoritmi e intere grandi società si basano sul loro sfruttamento, ad esempio Pixar . principalmente utilizzato inizialmente nei film scifi, la tecnica è ora così diffusa che viene abitualmente utilizzata anche nei film "tipici". per esempio di recente The Great Gatsby ha fatto molto affidamento sugli effetti CGI per disegnare ambienti convincenti o stilizzati, ritoccare il film / i personaggi, ecc.


-3

Il codice Rosetta elenca gli algoritmi applicati per Attività di programmazione (692) e Linguaggio di programmazione (518) con Semantic MediaWiki.


Come è questo un esempio di "algoritmi core ... distribuiti in software / hardware commerciale, governativo o ampiamente utilizzato"?
David Richerby,

Sarebbe utile fare un riferimento incrociato alle implementazioni di ciascuno degli eccellenti algoritmi elencati in altre risposte qui agli URI Wikipedia / DBpedia. Non ci sono URI Wikipedia / DBpedia per tutti questi algoritmi; ma ci sono pagine di codice Rosetta.
Wes Turner,

bigocheatsheet.com elenca anche la complessità di Big-O e link ad articoli di Wikipedia per alcuni algoritmi.
Wes Turner,

La domanda richiede esempi di algoritmi core utilizzati in software significativi. "Ecco un sito Web con algoritmi implementati in un milione di lingue" non risponde affatto a questa domanda. In realtà, è l'esatto contrario di ciò che la domanda sta cercando.
David Richerby,

Un riferimento utile e contestualmente rilevante.
Wes Turner,

-5

forse tutti gli algoritmi principali / preferiti di interesse per questo pubblico sono stati citati a questo punto. tuttavia, alcuni altri meritano menzione per completezza. e alcune analisi di ciò che è considerato un algoritmo significativo sono rilevanti qui.

nei settori CS e IT sembra esserci un fenomeno notato molto tempo fa nell'intelligenza artificiale chiamato "spostare i pali della porta" . questo è un fenomeno psicologico in cui il campo avanza relativamente rapidamente ma le persone si adattano rapidamente mentalmente alla "nuova normalità" e intraprendono progressi reali o addirittura rivoluzionari come banali o irrilevanti in retrospettiva, dopo averlo compiuto, cioè minimizzato o minimizzato. questo è fortemente catturato in questa domanda dal modo in cui gli algoritmi passano dalla R&S alla "distribuzione". citando l'autore della domanda nei commenti successivi:

In effetti, una frazione trascurabile di tutto il codice che viene scritto sta implementando tutto ciò che è interessante da un punto di vista algoritmico.

ma questo è problematico e sostanzialmente una ridefinizione incentrata sul TCS della parola "algoritmo". presumibilmente gli algoritmi interessanti sono avanzati. significa che se un problema si riduce a un algoritmo avanzato, non è più "interessante"? e "avanzato" è chiaramente un obiettivo mobile. quindi esiste un modo per definire "algoritmi" in modo restrittivo o ampio . sembra che la definizione di TCS cambi in base al contesto, ma nota anche in TCS, c'è una tendenza verso l' ampia definizione, ad esempio nella cosiddetta "lente algoritmica" .

a volte gli algoritmi più onnipresenti sono anche i più trascurati! Internet e il WWW sono un grande ambiente / quasi ecologia per gli algoritmi. ancora relativamente giovane a soli circa 2 decenni (inventato ~ 1991) è cresciuto in modo massiccio ed esponenziale in un breve lasso di tempo. La crescita del sito del WWW ha probabilmente persino superato la famosa legge esponenziale di Moores.

Internet / WWW sono supportati da molti sofisticati algoritmi. Internet ha algoritmi di routing complessi integrati nei router (che alimentano di nuovo aziende multimiliardarie come Cisco). qualche teoria avanzata è applicabile lì, ad esempio negli algoritmi di routing . questi algoritmi sono stati oggetto di ricerche emergenti, avanzate / all'avanguardia decenni fa, tuttavia ora sono così precisi e ben compresi che sono in qualche modo invisibili.

non dovremmo dimenticare così presto che decenni fa, i principali ricercatori non erano nemmeno sicuri che il mondo di Internet funzionasse o fosse possibile (visto nella prima ricerca sulla commutazione di pacchetti, un nuovo modello di progettazione radicale all'epoca in partenza rispetto alla precedente commutazione di circuito), e anche qualche anno fa si temeva che non sarebbe riuscito a ridimensionarsi a un certo punto e avrebbe iniziato a fallire a causa di picchi di volume travolgenti.

utilizza inoltre un sofisticato rilevamento / correzione degli errori . Internet è probabilmente il sistema più grande e più tollerante ai guasti mai costruito dagli umani, ancora in crescita.

poi, c'è un caso valido per far avanzare gli algoritmi che alimentano il WWW. I server HTTP e Web sono altamente ottimizzati / ottimizzati e utilizzano anche protocolli avanzati di sicurezza / crittografia (HTTPS). la logica di rendering di una pagina Web è diventata estremamente avanzata in HTML5 e CSS3 , insieme al linguaggio di programmazione Javascript .

il CSS relativamente nuovo ha vari principi simili alla programmazione OOP come la riusabilità e l'ereditarietà. parlando di composizione tipografica, TeX è un importante sistema di composizione scientifica internamente complesso (non così diverso da un linguaggio di programmazione) inventato da Knuth che ora può essere reso su pagine web (ed è usato forse in centinaia di migliaia di articoli scientifici o più).

un'altra area relativamente nuova di algoritmi che si sviluppa su Internet, ancora emergente, quella basata sull'intelligenza collettiva . Il software stackexchange stesso è un esempio di un sofisticato sistema di intelligenza collettiva. il social network mostra anche le caratteristiche chiave dell'intelligenza collettiva e le funzioni vengono continuamente aggiunte per aumentare tale intelligenza (ad esempio i "Mi piace" di Facebook hanno solo pochi anni). il campo dei sistemi di classificazione si basa su algoritmi di filtraggio collaborativo e si sta ancora evolvendo sulla base di nuove ricerche e applicazioni.

quindi in breve, tutti i successi rivoluzionari che trasformano l'esperienza umana quotidiana in realtà piuttosto al di là dei semplici "obiettivi sul campo". come afferma il titolo della domanda, tutti gli algoritmi core distribuiti . ora così onnipresente e invisibile da essere qualcosa di simile all'espressione IT, "parte dell'impianto idraulico".


molte citazioni potrebbero essere aggiunte a questo. eccone uno da iniziare: DARPA e la rivoluzione di Internet di Waldrop
vzn

un altro riferimento all'ottimizzazione di Internet, biografia di Danny Lewin , cofondatore di Akamai, "il genio che ha trasformato Internet"
vzn

-8

Un algoritmo (hardware) di grande successo è il reset all'accensione.

Senza un sistema in base al quale un computer si trova in uno stato noto quando viene applicata l'alimentazione, non succede altro .

Il ripristino all'accensione è il motivo per cui tutto funziona in modo completo con una CPU, sia essa incorporata o meno.

La prossima volta che sei alla buca per programmatori e informatici, porta il tuo bicchiere di soda alla reimpostazione all'accensione.


5
Il ripristino all'accensione non è un algoritmo. È un compito, cioè qualcosa che desideri eseguire, per il quale devi progettare un algoritmo.
David Richerby,
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.