Quali algoritmi vengono utilizzati più spesso in pratica?


19

Quali algoritmi vengono utilizzati più spesso?

Si prega di scrivere un singolo algoritmo per risposta, provare a mantenere la risposta breve (una o due righe).


Kaveh, forse dovresti aspettare le risposte prima di fornire così tante? :)
Suresh Venkat,

1
@Suresh: mi dispiace. :)
Kaveh,

3
Molto spesso in che senso? (Numero di diversi programmi per computer che implementano l'algoritmo? Numero di software installati che utilizzano l'algoritmo? Numero di esecuzioni dell'algoritmo? Quantità di dati elaborati utilizzando l'algoritmo? Secondi CPU utilizzati dall'algoritmo?) Dove? (Accademia, industria, PC di casa?) È mai possibile stimare qualcosa del genere; possiamo mai avere dati per supportare una delle risposte?
Jukka Suomela,

1
La domanda è troppo vaga come ha sottolineato Jukka Suomela. Senza ulteriori chiarimenti, le risposte non saranno migliori del sommario di un libro di testo sugli algoritmi.
Tsuyoshi Ito,

1
C'è un libro recente: "Nove algoritmi che hanno cambiato il futuro: le idee geniali che guidano i computer di oggi" di John MacCormick. Vedi press.princeton.edu/titles/9528.html
Alessandro Jacopson

Risposte:


18

Fast Fourier Transform è il problema algoritmico risolto più volte al giorno da sistemi informatici reali? Deve essere vicino. Quindi nominerei l' algoritmo Cooley-Tukey FFT .


Mi piace questo, la FFT è trascurata nell'educazione informatica di base, ma è certamente un algoritmo con un impatto enorme nella nostra società moderna e molte cose moderne intorno a noi stanno scricchiolando continuamente FFT.
Jukka Suomela,

14

Moltiplicazione.

Forse uno dei più antichi algoritmi non del tutto banali e un problema che viene risolto più spesso di FFT.


La moltiplicazione non è un algoritmo, è un problema con molti sottoproblemi risolti da diversi algoritmi: numeri interi a virgola fissa e virgola mobile, eseguiti da hardware o software; bignum dimensione variabile (modulo o meno), matrici, ...
Gilles 'arresto SO- essere maligno'

Mi riferivo ai circuiti di moltiplicazione hardware nelle CPU moderne (per numeri interi e numeri in virgola mobile; questi due alla fine non sono così diversi). La mia comprensione è che tendono ad essere "solo" versioni ingegnosamente ingegnose dello stesso approccio di base: l'algoritmo "lunga moltiplicazione", che era già noto nel Medioevo.
Jukka Suomela,

Penso che la sottrazione (confronto) sia usata molto più spesso della moltiplicazione e non vedo alcun motivo per cui la moltiplicazione conta come un algoritmo e l'addizione / sottrazione no. Tuttavia, non so se questo si qualifica come una risposta.
Tsuyoshi Ito,

Sì, l'addizione e la sottrazione vengono utilizzate anche più spesso della moltiplicazione - in effetti, l'algoritmo di moltiplicazione lunga riduce essenzialmente una moltiplicazione ad un'aggiunta. Tuttavia, non so se esiste un singolo algoritmo di addizione / sottrazione che potremmo nominare qui?
Jukka Suomela,

@JukkaSuomela: l'aggiunta e la sottrazione del complemento di Two sarebbe un buon candidato.
John Gietzen,

13

Algoritmi del percorso più breve Dijkstra e Bellman-Ford . Ci sono almeno 35.000 sistemi autonomi (AS) attivi su Internet a partire dal 2010. Ogni AS esegue un protocollo di routing con collegamento a stato (Dijkstra) o un protocollo di routing a distanza (Bellman-Ford). I router all'interno di un AS in genere aggiornano periodicamente le loro tabelle ogni pochi minuti, ad esempio 10.

Pertanto, il numero di esecuzioni Dijkstra e Bellman-Ford al giorno ammonta ad almeno 5 milioni. E questo è solo dai router.

Non abbiamo contato i calcoli del percorso più breve da Google Maps e simili che dovrebbero facilmente rappresentare 10 volte di più. Mezzo miliardo di esecuzioni al giorno non sono inverosimili.


Mezzo miliardo di esecuzioni al giorno possono sembrare molte, ma ricordiamo che abbiamo, ad esempio, miliardi di telefoni cellulari su questo pianeta. Cosa fanno queste cose in continuazione? O cosa stanno facendo durante ogni telefonata? Non lo so, ma la mia ipotesi è che almeno stanno facendo molto più FFT rispetto ai percorsi più brevi.
Jukka Suomela,

8

14
A proposito, è davvero vero che quicksort è l'algoritmo di ordinamento che viene usato più comunemente nel mondo reale? Ho dato una rapida occhiata all'implementazione di una funzione di "ordinamento" per scopi generici in alcuni linguaggi di programmazione comunemente usati. Perl: sembra essere passato da quicksort a mergesort di recente. Python: usa Timsort (ibrido di tipo mergesort / insertion). Java: era un tempo fusione, oggi Timsort. I database tendono a utilizzare l'ordinamento esterno. Quicksort è già una specie in pericolo?
Jukka Suomela,

Penso che sia un ottimo punto. Sarebbe bello se qualcuno potesse modificare la risposta.
Juan Bermejo Vega,

@Juan, anche se il punto menzionato da Jukka è corretto, non vedo alcun motivo per modificare la risposta.
Kaveh,


7

Penso che l'algoritmo più usato sia Parity Check (o forse CRC o qualche tipo di codice di correzione degli errori), perché compaiono in ogni accesso RAM.


Utilizzato anche almeno una volta per ogni pacchetto inviato su qualsiasi rete basata su IP
Claus Broch,



4

Corrispondenza delle espressioni regolari mediante conversione in automi finiti: credo che grep funzioni in questo senso.



3

È difficile pensare ad algoritmi più ampiamente utilizzati rispetto a quelli nelle moderne implementazioni di TCP : ovvero prevenzione della congestione , ritrasmissione rapida . Anche se ciò dipende da come si determina cosa soddisfa i criteri per un algoritmo ...


Ma puoi davvero usare gli algoritmi TCP più spesso di FFT (che è già in questo elenco)? Se il mio computer invia un singolo pacchetto IP (TCP o meno), in genere non attiva un sacco di calcoli FFT? Di solito i pacchetti vengono trasmessi ad un certo punto usando tecnologie come WLAN, ADSL e GSM, e penso che la maggior parte di essi usi modulazioni che dipendono fortemente da FFT.
Jukka Suomela,

Penso tu abbia ragione.
Lev Reyzin


2

SHA-1 (e funzioni hash in generale). Probabilmente ha battuto la maggior parte degli altri algoritmi in termini di numero di esecuzioni.


2

Gli algoritmi relativi all'albero B + vengono utilizzati per gli elementi del database


2

Algoritmi di pianificazione. Sono utilizzati da ogni dispositivo e server dell'utente in tutto il mondo. Sono state utilizzate numerose varianti, ho trovato molti riferimenti per "coda di feedback multilivello"


1

Questa risposta interpreta "più spesso" in termini di cicli effettivi della CPU.

Quando imparavo l'informatica negli anni '70, ricordo di aver letto che la stragrande maggioranza dei cicli di computer (leggi: mainframe) erano dedicati all'ordinamento. Le applicazioni aziendali richiedono un ampio ordinamento per analisi e reportistica. Non immagino che sia cambiato molto, ma ovviamente l'ascesa di altre app - e-mail, elaborazione testi, ecc. - deve aver modificato il mix. Questi tipi sono in genere tipi stabili (non Quicksort) a causa della necessità di ordinare le successioni dei campi per creare sottosorti.

A rigor di termini, tuttavia, l'algoritmo utilizzato più spesso è, senza dubbio, qualunque cosa venga eseguita dal processo di attesa del sistema Windows quando nient'altro sta succedendo ;-).


1

Sprase Matrix Vector Moltiplicare

... è il cavallo di battaglia computazionale dietro la soluzione di quasi tutti i sistemi lineari. Di conseguenza, viene eseguito ogni volta

  • Scienziati / ingegneri risolvono equazioni differenziali
  • Gli statistici trovano nuove correlazioni (PCA)
  • Google esegue pagerank
  • Il telefono prevede la posizione da GPS, accelerometri, posizioni dei ripetitori
  • La tua auto regola le sospensioni in movimento
  • eccetera....

La maggior parte dei FLOP su qualsiasi supercomputer o cluster vengono spesi all'interno di un mat-vec rado.


1

Il metodo di Newton. È usato per il calcolo di radici quadrate, per la divisione informatica. Può essere utilizzato per eseguire la programmazione lineare. Più in generale è il cavallo di battaglia dell'ottimizzazione (convessa). Può essere usato per risolvere equazioni differenziali in Fisica minimizzando l'azione / energia.


1

Hashing e alberi rosso-neri.

Sono già implementati in STL (hash_map, map) e ogni programmatore sa che un tale contenitore è incredibilmente conveniente ogni volta che si desidera memorizzare alcune informazioni indicizzate da un tipo di dati arbitrario.



0

Programmazione dinamica .

Penso che DP sia usato "più spesso" di altri algoritmi citati finora nel sondaggio. Ne deduco "più spesso" nel senso di quanto spesso un programmatore non banale ha implementato un concetto di algoritmo nella vita reale, piuttosto che quante volte viene invocata una particolare implementazione di un algoritmo.

DP è versatile e ha molte facce. A volte l'ho usato in qualche modo inconsciamente e poi mi sono reso conto che stavo facendo DP.

Certo, ci sono cose che sono ancora più comuni del Dynamic Program, ma sono principalmente strutture di dati (array, elenco collegato, hash).


7
Questo è un po 'diverso dagli altri suggerimenti in quanto è un paradigma di progettazione di algoritmi (simile a avido o primal-dual) e non solo un singolo algoritmo.
Jukka Suomela,

0

String Matching, utilizzato continuamente nel software applicativo e a livello di database.

Nel caso esatto, ci sono diversi algoritmi abbastanza coinvolti (KMP, Boyer-Moore) con alcuni che raggiungono il runtime atteso sublineare. Sono anche interessanti da studiare dal punto di vista del CS.

La corrispondenza approssimativa delle stringhe, ovvero gli allineamenti, è probabilmente ancora più interessante. Conosci le funzionalità di "correzione automatica"? Inoltre, le ricerche nei dati di stringa rumorosi (ad es. DNA) vengono eseguite utilizzando gli allineamenti.

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.