La programmazione o l'informatica in generale riguardano gli algoritmi?


40

Come studente laureato, trovo sempre più comune per aziende prestigiose (come Google, Facebook, Microsoft, ...) porre domande sugli algoritmi nei loro test e interviste. Alcune startup a cui ho fatto domanda chiedevano anche degli algoritmi. Mi chiedo se la fluidità degli algoritmi sia la cosa più importante per gli sviluppatori di software in quelle aziende?

Se la risposta è sì, quali sono i metodi o le risorse migliori per imparare e fare pratica sugli algoritmi in modo efficace? Non riesco a interessarmi a risolvere problemi apparentemente troppo complicati trovati nella maggior parte dei libri di testo o dei siti Web. Sebbene capisca facilmente gli algoritmi di base (come quicksort, bubblesort, ...), trovo immensamente difficile ricordare e riutilizzarli in seguito.

Grazie.

P / S: Se mi chiedi cosa mi piace, sta creando buoni software per risolvere i problemi degli utenti in modo innovativo. Suppongo che ciò non significhi necessariamente che il software debba essere molto complicato.


26
Hai idea di quanto sia complicato per Google permetterti di cercare in tutto il Web con una casella di testo e un pulsante?
JeffO

21
@JeffO Non uso più nemmeno il pulsante ;-)
maple_shaft

1
Se Google lo rende più semplice, tutti gli altri siti di ricerca non avranno bisogno di alcun codice.
JeffO

Ho pensato che la domanda sarebbe su come funzionano i computer, come funziona una CPU, come funziona la RAM, come funziona il wifi, ecc. Queste sono domande piuttosto interessanti ancora oggetto di molte ricerche. Trovo ancora l'hardware più fantastico di tutta la programmazione geek in Java o PHP.
jokoon

2
Non si tratta solo di algoritmi, ma in effetti sono al centro di CS. Ma c'è molto di più nella programmazione oltre agli algoritmi e alla logica (il mantenimento del codice, ad esempio, non richiederebbe solo la conoscenza degli algoritmi).
haylem,

Risposte:


44

Gli algoritmi sono chiari

Ecco la cosa bella degli algoritmi: lo spazio problematico che affrontano è ben definito, vale a dire che le vostre esigenze non solo sono effettivamente conosciute , ma di solito anche formalizzate proprio come le metriche per la qualità della soluzione.

Quindi, se ti dico di elaborare un algoritmo, non c'è molto potenziale per problemi di comunicazione e misurare le tue prestazioni è un compito banale. Allo stesso tempo, la tua performance è un buon indicatore della tua capacità di pensare logicamente.

Gli algoritmi sono un filtro efficiente

L'attuale problema del settore (e dell'istruzione) è la scarsa qualità media dei laureati. Questo è stato illustrato con il test FizzBuzz , che è:

Scrivi un programma, che passerà attraverso i numeri da 1 a 100 e stamperà "fizz" se il numero è divisibile per 3, "buzz" se è divisibile per 5 e il numero stesso se non è divisibile per nessuno dei due.

Apparentemente, la maggior parte dei laureati di Comp Sci non riesce a risolvere questo problema. Si noti che questa è una domanda algoritmica, sebbene ovviamente imbarazzantemente semplice. Detto questo, ottenendo qualcuno in grado di risolvere il tipo di problemi indicati in Google Code Jam o Project Euler, ti stai già godendo la crema-de-la-crema.

Gli algoritmi sono una piccola parte dello sviluppo del software

La verità è che non appena lavorerai nel settore, non utilizzerai le tue abilità algoritmiche più dell'1% delle volte.

Prima ancora di iniziare a scrivere codice, è necessario innanzitutto raccogliere e analizzare i requisiti. Quindi devi sintetizzare il tuo design basato su di essi. Quindi è necessario implementare il design. Quindi è necessario valutare l'implementazione rispetto ai requisiti originali, quindi iterare i requisiti, quindi iterare la progettazione, quindi iterare l'implementazione e così via.

Uno dei requisiti è la prestazione ragionevole . Se tale requisito non viene soddisfatto, è necessario creare un profilo dell'implementazione per rintracciare i colli di bottiglia e quindi è possibile ottimizzarlo, che a volte è una questione di micro-ottimizzazione diretta (che è piuttosto facile da fare), ma a volte è una questione di utilizzando algoritmi migliori (che non sempre sono facilmente eseguibili in seguito). Perciò:

Gli algoritmi sono fondamentali

Migliore è la tua conoscenza degli algoritmi, maggiore è la possibilità di ottenerlo nel modo giusto la prima volta. Altrimenti, è probabile che non si verifichi solo un problema che può essere risolto solo implementando un algoritmo migliore, ma non si sarà nemmeno in grado di risolverlo.
Quindi, mentre non hai quasi mai bisogno di questa abilità, presenta un singolo punto di errore nella tua metodologia di sviluppo e se non hai l'abilità, puoi solo sperare che la necessità non si presenti mai o che qualcun altro salti per risolverlo per tu.

Ciò che è veramente importante è avere un'idea della complessità computazionale e di come mantenerla bassa, come ho anche spiegato in risposta a una domanda simile . O specializzarsi in cose in cui questo semplicemente non è importante, come lo sviluppo della GUI, ma poi quasi tutti lo odiano ... per una ragione!


5
+1 per una risposta molto completa e intelligente. Inoltre, è triste quanto sia efficace un filtro FizzBuzz. Non ci sono assolutamente scuse per non essere in grado di farlo.
Adam Crossland,

4
Ho pensato che avresti dovuto stampare fizzbuzzse il numero era divisibile per entrambi e che molti sono scivolati su questo perché devi ordinare attentamente i controlli del modulo.
Matthieu M.

1
L'1% potrebbe essere un po 'troppo alto
canapa il

1
@MatthieuM .: la stampa di entrambi è inerente alla formulazione del requisito. Manca questo, significa che non hai controllato attentamente i requisiti; ora, ciò che trovo interessante è che non dice che devi stamparli in un ordine particolare, o anche costantemente nello stesso ordine ...
jmoreno

1
@ back2dos: sì, ma farlo in un ordine casuale sembra più divertente ... nota che il requisito indicato in questa risposta non menziona le righe, ma solo la stampa . Se ti viene dato un test FizzBuzz, potrebbe essere utile sottolineare che ci sono molte ipotesi non dichiarate in esso (quindi, potrebbe farti dipingere come un saggio).
jmoreno,

30

In generale, la programmazione come lavoro non riguarda gli algoritmi. Puoi passare anni a programmare applicazioni CRUD senza richiedere competenze algoritmiche profonde.

La programmazione come lavoro riguarda:

  1. Comunicazione:

    • Il tuo codice sorgente è un mezzo per comunicare le tue idee ai tuoi pari. Se nessuno è in grado di leggere / comprendere il tuo codice, è inutile.

    • Uno sviluppatore solitario che non parla con nessun altro sviluppatore probabilmente inizierebbe a fare errori nel codice e crede che il suo approccio sia l'unico accettabile.

    • Devi sapere come comunicare con le parti interessate, il dipartimento di controllo qualità, gli utenti, i visual designer, i DBA, ecc.

    • Come sviluppatore esperto, devi insegnare ai colleghi meno esperti che desiderano migliorare le proprie capacità.

  2. Conoscenza degli strumenti giusti: controllo della versione, sistema di tracciamento dei bug, IDE, quale lingua è più adatta per un'attività specifica e perché, come usare l'analisi del codice, ecc.

  3. Ampia conoscenza e cultura: quali sono i linguaggi funzionali? Come i computer interpretano il codice? Perché LOC è una misura insignificante? eccetera.

  4. Conoscenza approfondita della lingua o delle lingue con cui lavori.

  5. Algoritmi.

L'informatica, d'altra parte, è più orientata agli algoritmi. Se lavori come scienziato, questo potrebbe non avere nulla a che fare con il lavoro di uno sviluppatore e lavorerai di più su come ottimizzare un algoritmo, come trasformare una rappresentazione di dati in un altro, ecc.


12
-1: "Applicazioni CRUD" sono algoritmi. Sono semplicemente (generalmente) semplici. Non esiste un "significato nobile".
S. Lott,

2
e il codice sorgente è il tuo unico canale di comunicazione con il computer che fa esattamente quello che gli dici di fare (e quasi mai quello che vuoi che faccia)
maniaco del cricchetto

5
È incredibile quanto sia buono il mercato per ripulire le applicazioni CRUDdy i cui team di ingegneri hanno ignorato (o non hanno mai appreso) le basi degli algoritmi.
JasonTrue,

2
@ S.Lott: "Le applicazioni CRUD sono algoritmi" è analogo a "I am America". ;)
Jim G.

1
@JimG: Come dice Steven Colbert "Io sono l'America e anche tu puoi". Le applicazioni CRUD contengono, sono basate, includono, sono implementazioni di, sono realizzazioni di, incarnano, riflettono algoritmi. Ti sei solo lamentato, senza suggerire una preposizione specifica. Quale ti avrebbe reso più felice?
S. Lott,

16

Penso che le domande sugli algoritmi nelle interviste siano uno dei modi principali in cui le aziende cercano di giudicare la comprensione da parte dei candidati dei fondamenti dell'informatica. Sebbene questa non sia l'unica area di competenza importante per un programmatore professionista, è una delle competenze chiave di un buon programmatore.

Penso che il motivo per cui molte grandi aziende enfatizzano i fondamenti della CS nel loro processo di intervista, è che è l'abilità principale che si sviluppa meno dopo essersi laureata ed essere entrata nella forza lavoro. Abilità pratiche di programmazione, capacità di progettazione, pratiche di ingegneria del software e simili sono tutte cose che sono principalmente sviluppate attraverso l'esperienza, mentre i fondamenti del tuo CS sono sviluppati principalmente nel corso della tua istruzione.

Per quanto riguarda come esercitarsi nella progettazione di algoritmi, Steve Yegge raccomanda The Algorithm Design Manual di Skiena nella sua eccellente guida alle interviste come programmatore .


4
+1: linguaggi di programmazione, framework, sistema operativo, editor, set di strumenti, tutti vanno e vengono, ma sapere come risolvere efficacemente i problemi ha tutto a che fare con la conoscenza dei fondamenti delle strutture dati e degli algoritmi. Queste cose rimangono sempre con noi.
Adam Crossland,

"Per quanto riguarda come esercitarsi nella progettazione di algoritmi, Steve Yegge raccomanda The Algorithm Design Manual di Skiena nella sua eccellente guida alle interviste come programmatore." Ci dispiace, ma questo potrebbe non essere applicabile alla persona che ha posto questa domanda poiché sembra essere uno studente laureato. Google / MS è passato da Skiena (per studenti laureati) a porre domande che sono apparse in concorsi internazionali di programmazione collegiale. (Questo lo so per esperienza aneddotica). Il libro di Skiena è ancora usato - ma principalmente per i candidati di livello universitario.
user396089

Per quanto riguarda le domande che compaiono nelle competizioni di programmazione - sei praticamente esaltato se non hai mai visto la domanda prima (a meno che il tuo QI non sia anche 3 SD lontano dal normale)
user396089

11

Come uno sviluppatore di software di successo che è autodidatta e ha frequentato solo pochi corsi di informatica al college, dirò che i maggiori problemi che si presentano oggi al business non sono la capacità di tutti i loro programmatori di scrivere un algoritmo di classificazione delle bolle nel modo più efficiente possibile. I veri problemi che le aziende devono affrontare:

  • Sviluppatori che non possono apprendere e adattarsi rapidamente a nuovi domini

  • Gli sviluppatori che non possono interagire socialmente con i clienti o le parti interessate in modo significativo

  • Gli sviluppatori che non sono in grado di indovinare e mettere in discussione i requisiti aziendali errati o mal pensati

  • Gli sviluppatori che non capiscono come testare a fondo il loro codice e le loro funzionalità

  • Sviluppatori che non sono in grado di fornire stime significative in modo tempestivo

  • Sviluppatori che non sono in grado di creare documentazione chiara e concisa

  • Sviluppatori che non possono auto avviare o farsi carico di una situazione

Nove volte su dieci scommetterò che quasi tutte le circostanze in cui uno sviluppatore si dimena in un'azienda è perché falliscono irrimediabilmente in una delle qualità di cui sopra. Dimentica Google e Facebook, sono casi di eccezione e hanno legittimo bisogno di persone che comprendono profondamente l'informatica.

Le imprese reali, sebbene non lottino con le complessità dell'informatica, lottano con le complessità dell'umanità. Il problema è che è VERAMENTE difficile testare le qualità sopra menzionate. Il più delle volte devi giudicare le persone su queste qualità in base alla tua reazione intestinale. È difficile se non si hanno buone capacità e intuizione delle persone, è molto più facile testare la conoscenza dell'algoritmo.


+1 Le aziende regolari e non bizzarre come Google hanno bisogno di persone con buone capacità imprenditoriali e soprattutto per capire come inventare / applicare / gestire / modificare i processi. Non è un errore che le aziende simili a Google non abbiano covato il movimento Agile, perché l'informatica non riguarda la risoluzione dei problemi aziendali.
S.Robins,

10

Personalmente vedo algoritmi e strutture dati "standard" come parte del vocabolario di un programmatore. E molti dei problemi pratici che affronti come programmatore hanno spesso una soluzione che è (almeno in parte) esprimibile in questo vocabolario.

Avere questo vocabolario a tua disposizione ti impedisce di dover escogitare le tue "proprie" soluzioni (reinventando la ruota per così dire), permettendoti di lavorare in modo più intelligente e spesso più veloce.

"Non riesco a interessarmi a risolvere problemi apparentemente troppo complicati trovati nella maggior parte dei libri di testo o dei siti Web"

"Trovo immensamente difficile ricordare e riutilizzarli in seguito"

Sforzati di completarli. Ti ringrazierai più tardi. Anche se non li ricordi in dettaglio (anche se con abbastanza pratica lo farai sicuramente), essere in grado di dire "Ricordo di aver risolto qualcosa di simile usando l'algoritmo X o la struttura di dati Y" ti aiuterà moltissimo. Anche se richiede di cercare i dettagli e aggiornare la memoria.


+1 per le strutture dati. Sono l'altra metà della moneta algoritmica.
Spencer Rathbun,

9

Anche se non puoi essere un buon programmatore senza conoscere i tuoi algoritmi, non è giusto tenere lontani altri aspetti della professione di programmatore. Ad esempio, la rigida disciplina e la buona padronanza della tua lingua madre sono almeno importanti per essere un buon programmatore quanto la tua conoscenza degli algoritmi. Non bisogna inoltre sottovalutare l'importanza di comprendere i propri strumenti di base, come linguaggi di programmazione, sistemi di controllo del codice sorgente, ambienti di test, eccetera.

Tuttavia, quando si tratta di interviste, misurare la tua comprensione degli algoritmi è molto più semplice che misurare le tue altre abilità legate al lavoro come programmatore. Ecco perché gli intervistatori spesso si concentrano sulla domanda di algoritmi e prestano molta attenzione al modo in cui li spieghi durante l'intervista. Non è perché altre cose sono meno importanti, ma perché è difficile valutare queste altre cose nei 30 minuti assegnati all'intervista.


1
+1 Risposta perfetta! È più facile testare la conoscenza dell'algoritmo.
maple_shaft

"i tuoi algoritmi" - Sono autodidatta. C'è una fonte o un elenco da qualche parte che afferma quali sono questi algoritmi comuni che ogni programmatore dovrebbe sapere? Vorrei leggerli. Grazie!
Ominus,

2
@Ominus Anche se non esiste un consenso generale sulla "lista dei gentiluomini" di algoritmi, nella maggior parte dei casi includerebbe la ricerca, l'ordinamento, il movimento di strutture di dati che mancano di continuità spaziale (elenchi collegati, alberi binari, ecc.) E rudimentale (mis) applicazioni di ricorsione (fattoriale ricorsivo, sequenza di Fibonacci, ecc.)
dasblinkenlight

@Ominus - Anch'io sono autodidatta ma penso "Introduzione agli algoritmi" - CLRS è un buon modo per familiarizzare con il campo. Anche il libro di Skiena "The Algorithm Design Manual" è buono.
Tod

5

Sì, la programmazione riguarda principalmente algoritmi.

Ma forse non nel senso che stai pensando.

Ho l'impressione che stiamo tutti usando diverse definizioni di algoritmo. Ad essere onesti, è difficile rispondere a questa domanda perché l'algoritmo è un termine vago. Userò la definizione di Wikipedia per rispondere a questa domanda:

Un insieme di regole che definisce con precisione una sequenza di operazioni.

Questo è il cuore e l'anima della programmazione. Quando scrivi un codice, stai solo implementando un algoritmo. Se stai scrivendo alcune applicazioni CRUD, stai implementando un semplice algoritmo. Essere in grado di elaborare un algoritmo per risolvere un problema è la programmazione. Il resto sono solo dettagli.

Non sono d'accordo con il precedente poster che diceva che avere una profonda comprensione di una lingua è più importante della comprensione degli algoritmi. Qualsiasi buon programmatore dovrebbe essere in grado di apprendere profondamente una lingua, ma senza algoritmi, non puoi inventare alcun codice da solo.


Da un'altra prospettiva, in Matematica il cuore e l'anima possono essere algoritmi, tuttavia per la Programmazione è qualcos'altro. Puoi scrivere software senza bisogno di algoritmi di per sé (forse non un buon software), ma non puoi scrivere software senza logica e pensiero astratto. Al centro , tuttavia, si tratta di risolvere i problemi. Trovare la soluzione è un processo algoritmico, ma la soluzione stessa non è necessariamente un algoritmo.
S.Robins

4

La risposta dipende interamente dal lavoro che stai perseguendo. Alcuni campi sono particolarmente più focalizzati sugli algoritmi di altri. Parlando a quella nota, anche se ho avuto il piacere di intervistare Amazon più volte. Anche se la posizione avrebbe poco a che fare con questi complessi algoritmi, mi è stato grigliato il modo in cui fare un'attività ammortizzata a tempo costante.

Ciò che dimostra una forte comprensione degli algoritmi è la prova per il tuo potenziale datore di lavoro che sei un risolutore di problemi adatto. Non è davvero un buon indicatore (IMO) di un buon dipendente, ma alcuni datori di lavoro lo usano per lo screening. Se stai candidando per una posizione che richiede un diploma di laurea, ci si aspetta che tu abbia una base più rigorosa negli algoritmi.

Ciò che (IMO) è immensamente utile nella pratica non è memorizzare algoritmi specifici ma attraverso la comprensione di come funzionano alcuni algoritmi c'è questo piccolo nugget nella parte posteriore della tua mente in cui dirai "L'ho già visto prima" o "So che può fare questo meglio "che genererà un po 'di ricerca sulla soluzione del tuo problema.


+1 per parlare della barra delle assunzioni per studenti universitari. Alcune aziende sono molto più agitate quando assumono studenti universitari rispetto agli studenti universitari. Ma per essere onesti con loro, gli studenti laureati sono anche meglio pagati e in genere reclutati a un livello superiore internamente.
user396089

1

Penso sempre che la programmazione sia più basata sui dati rispetto agli algoritmi .. ma poi, a che servono i dati se non ci fai cose ... tutte queste manipolazioni sono algoritmi. Quindi in realtà sì, la programmazione è praticamente interamente basata su algoritmi.

Potrebbe non sembrare matematica, e un sacco di lavoro algoritmico che faresti ogni giorno è molto semplicemente roba come l'invio di dati tra una GUI e un programma, ma conta anche come un algoritmo. L'inserimento di un elemento in una casella di riepilogo è un algoritmo di inserimento standard che presenta problemi propri come la manipolazione delle prestazioni e della struttura degli elenchi.


1

Solo i programmatori che lavorano per quelle aziende possono davvero rispondere alla tua domanda. I tipi di algoritmi trattati nella "Introduzione agli algoritmi" hanno probabilmente avuto un ruolo nello 0,01% della mia vita di programmazione negli ultimi 25 anni. Quando ho bisogno di una struttura di dati o di un ordinamento, di solito le librerie o i framework forniti hanno ciò di cui ho bisogno. Quando ho bisogno di una FFT superveloce trovo qualcosa come la libreria Intel Math piuttosto che scriverne una. Tuttavia, posso capire come ciò che fanno in Google sia molto diverso da quello che ho fatto nella mia carriera. Il libro di Skiena "The Algorithm Design Manual" ha aperto gli occhi a causa delle storie di guerra che racconta. Puoi dire che usa ALgorithms nel suo lavoro MOLTO.

Nella mia esperienza come consulente di programmazione indipendente, il successo è venuto da tre cose: 1. Comunicare efficacemente con i clienti 2. Scrivere codice che funzioni. 3. Gestire la complessità

Fare solo i numeri 1 e 2 non è abbastanza. Se il codice non è gestibile (da parte di un programmatore o dei programmatori che lo hanno scritto, è condannato.

Il numero 3 è l'abilità di programmazione più difficile da padroneggiare. Richiede che il pensiero sia inserito in architettura, design e codifica. Richiede il master refactoring. Richiede una comprensione dei principi SOLID / DRY. Se dovessi assumere un programmatore che avesse letto Intro to Algorithms e si dedicasse a padroneggiarlo o uno che leggesse The Pragmatic Programmer e si dedicasse a esserlo, assumerei quest'ultimo ogni volta. (Non che debbano escludersi a vicenda).


1

Sì.

L'informatica è principalmente algoritmi (in percentuale).

No.

Ma questa è la "scienza" dei computer. L'applicazione più comune di informatica è ingegneria del software. L'ingegneria del software non è principalmente algoritmi. Si tratta principalmente dell'arte della creazione, della ricerca della perfezione, ed è incentrato sull'influenza positiva sulla vita delle persone reali che esistono oggi. Sebbene l'informatica possa condividere alcune delle stesse motivazioni, è molto lontana dall'ingegneria del software.

Chiedi a un professore di ruolo presso un'importante Università di Informatica qual è la cosa più critica da capire sulla programmazione e probabilmente ti diranno "algoritmi e strutture di dati"

Chiedi a uno sviluppatore senior di un'importante società di software quale sia la cosa più critica da capire sulla programmazione e probabilmente ti diranno "imparare a deliziare i clienti" (implicito nel capire agile, pensare come un cliente, spedire in tempo e continuamente, facendo cose che funzionano , ecc.)

Potrebbe sembrare una semantica, ma dalla mia comprensione i due sono notevolmente diversi sia nella pratica che nella teoria.


1

Se dovessi scegliere una cosa nell'informatica come la parte più importante di essa, sceglierei le astrazioni , non gli algoritmi.


1

In Informatica quali concetti apprendi saranno inutili fino a quando non lo mostrerai. Il problema è di primaria importanza che deve essere risolto, quindi l'algoritmo è una breve pianificazione di come il problema verrà risolto in generale. Pertanto è di grande preoccupazione nel mondo dell'informatica.

Penso che quasi ogni aspetto dell'informatica abbia bisogno dell'algoritmo. Lascia che ti mostri questo Il seguente elenco includerebbe varie aree di informatica e quali algoritmi usano.

Automata

Costruzione Powerset. Algoritmo per convertire l'automa non deterministico in automa deterministico. Algoritmo di Todd-Coxeter. Procedura per la generazione di cosets.

Intelligenza artificiale

Alfa-beta. Alpha max plus beta min. Ampiamente usato nei giochi da tavolo. Ant-algoritmi. L'ottimizzazione della colonia di formiche è un insieme di algoritmi ispirati al comportamento delle formiche per risolvere un problema, trovare il percorso migliore tra due posizioni. DE (Evoluzione differenziale). Risolvi il problema di adattamento polinomiale di Chebyshev. Riconoscimento semi supervisionato delle frasi sarcastiche nelle recensioni di prodotti online. Algortithm che riconosce i sacarsmi o l'ironia in un tweet o in un documento online. Un tale algoritmo sarà essenziale anche per la programmazione di robot umanoidi.

Visione computerizzata

Epitome. Rappresenta un'immagine o un video con uno più piccolo. Conteggio degli oggetti in un'immagine . Utilizza l'algoritmo di etichettatura dei componenti connessi per etichettare prima ogni oggetto e quindi contare gli oggetti. Algoritmo di O'Carroll. Da una conversione matematica della visione degli insetti, questo algoritmo valuta come aggirare evitando gli oggetti.

Algoritmi genetici

Usano tre operatori. selezione (scegliere la soluzione), riproduzione (utilizzare soluzioni scelte per costruirne altre), sostituzione (sostituire la soluzione se migliore).

Selezione proporzionale del fitness. Nota anche come selezione della ruota della roulette, è una funzione utilizzata per selezionare le soluzioni. Selezione del troncamento. Un altro metodo per selezionare le soluzioni, ordinato per fitness. Selezione del torneo. Seleziona la soluzione migliore per una specie di torneo. Campionamento universale stocastico. Gli individui sono mappati su segmenti contigui di una linea, in modo tale che il segmento di ciascun individuo abbia le stesse dimensioni della sua forma fisica esattamente come nella selezione della ruota della roulette.

Reti neurali

Hopfield net. Rete neurale artificiale ricorrente che funge da sistema di memoria indirizzabile al contenuto con unità binarie di soglia. Convergono in uno stato stabile. Backpropagation. Tecnica di apprendimento supervisionata utilizzata per l'addestramento di reti neurali artificiali. Mappa auto-organizzante (mappa di Kohonen). Reti neurali addestrate utilizzando l'apprendimento non supervisionato per produrre una rappresentazione a bassa dimensione (2D, 3D) dei campioni di addestramento. Buono per visualizzare dati ad alta dimensione.

Bioinformatica

Needleman-Wunsch. Esegue un allineamento globale su due sequenze, per sequenze di proteine ​​o nucleotidi. Smith-Waterman. Variazione di Needleman-Wunsch.

Compressione

Algoritmi di compressione senza perdita

Trasformata di Burrows-Wheeler. Preelaborazione utile per migliorare la compressione senza perdita. Sgonfiare. Compressione dei dati utilizzata da ZIP. Codifica delta. Aiuti alla compressione di dati in cui i dati sequenziali si verificano frequentemente. Codifica incrementale. Codifica delta applicata a sequenze di stringhe. LZW. (Lempel-Ziv-Welch). Successore di LZ78. Crea una tabella di traduzione dai dati da comprimere. Viene utilizzato dal formato grafico GIF. LZ77 e 78. La base di ulteriori variazioni LZ (LZW, LZSS, ...). Sono entrambi programmatori di dizionari. LZMA. Abbreviazione di Lempel-Ziv-Markov chain-Algorithm. LZO. Algoritmo di compressione dei dati incentrato sulla velocità. PPM(Previsione per corrispondenza parziale). Tecnica adattiva di compressione dei dati statistici basata sulla modellazione e la previsione del contesto. Codifica Shannon-Fano. Crea codici prefisso basati su un insieme di simboli e relative probabilità. Binario troncato. Una codifica entropica in genere utilizzata per distribuzioni di probabilità uniformi con un alfabeto finito. Migliora la codifica binaria. Codifica run-length. Compressione primaria che sostituisce una sequenza dello stesso codice con il numero di occorrenze. Sequitur. Inferenza grammaticale incrementale su una stringa. EZW (Embedded Zerotree Wavelet). Codifica progressiva per comprimere un'immagine in un flusso di bit con maggiore precisione. Può essere una compressione con perdita anche con risultati migliori.

Codifica entropica Schema di codifica che assegna codici ai simboli in modo da abbinare le lunghezze dei codici alle probabilità dei simboli.

Codifica di Huffman. Semplice compressione lossless sfruttando le frequenze dei caratteri relativi. Codifica adattativa di Huffman. Tecnica di codifica adattativa basata sulla codifica Huffman. Codifica aritmetica. Codifica di entropia avanzata. Codifica intervallo. Lo stesso della codifica aritmetica, ma guardato in un modo leggermente diverso. Codifica unaria. Codice che rappresenta un numero n con n seguito da uno zero. Elias delta, gamma, codifica omega. Codice universale che codifica gli interi positivi. Codifica di Fibonacci. Codice universale che codifica numeri interi positivi in ​​parole di codice binario. Codifica Golomb. Forma di codifica entropica ottimale per alfabeti che seguono distribuzioni geometriche. Codifica del riso. Forma di codifica entropica ottimale per alfabeti che seguono distribuzioni geometriche.

Algoritmi di compressione con perdita

Codifica predittiva lineare. Compressione in perdita rappresentando l'inviluppo spettrale di un segnale vocale digitale in forma compressa. Algoritmo A-law. Algoritmo di companding standard. Algoritmo Mu-law. Algoritmo standard di compressione o compressione del segnale analogico. Compressione frattale. Metodo utilizzato per comprimere le immagini utilizzando i frattali. Trasforma la codifica. Tipo di compressione dei dati per dati come segnali audio o immagini fotografiche. Quantizzazione vettoriale. Tecnica spesso utilizzata nella compressione di dati con perdita di dati. Compressione ondulata. Forma di compressione dei dati adatta per la compressione di immagini e audio.

Crittografia

Chiave segreta (crittografia simmetrica)

Utilizzare una chiave segreta (o una coppia di chiavi direttamente correlate) sia per la decrittografia che per la crittografia.

Advanced Encryption Standard (AES) , noto anche come Rijndael. Blowfish. Progettato da Schneier come algoritmo per tutti gli usi, inteso come sostituto dell'invecchiamento della DE. Data Encryption Standard (DES) , precedentemente DE Algorithm. IDEA (International Data Encryption Algorithm) . Precedentemente IPES (PES migliorato), un altro sostituto di DES. Viene utilizzato da PGP (Pretty Good Privacy). Esegue trasformazioni su dati suddivisi in blocchi, utilizzando una chiave. RC4 o ARC4. Crittografia di flusso ampiamente utilizzata in protocolli come SSL per il traffico Internet e WEP per reti wireless. Algoritmo di crittografia minuscola. Algoritmo di cifratura a blocchi facile da implementare usando alcune formule. PES (Proposta di standard di crittografia). Nome precedente per IDEA.

Chiave pubblica (crittografia asimmetrica)

Utilizzare una coppia di chiavi, designate come chiave pubblica e chiave privata. La chiave pubblica crittografa il messaggio, solo la chiave privata consente di decrittografarlo.

DSA (Digital Signature Algorithm). Genera chiavi con numeri primi e casuali. È stato utilizzato da agenzie statunitensi e ora di dominio pubblico. ElGamal. Basato su Diffie-Hellman, utilizzato dal software GNU Privacy Guard, PGP e altri sistemi crittografici. RSA (Rivest, Shamir, Adleman). Ampiamente usato nei protocolli di commercio elettronico. Usa i numeri primi. Scambio di chiavi Diffie-Hellman (Merkle) (o scambio di chiavi esponenziale). Metodo e algoritmo per condividere segreti su un canale di comunicazione non protetto. Utilizzato da RSA. NTRUEncrypt. Usa anelli di polinomi con moltiplicazioni di convoluzione.

Funzioni di digest dei messaggi

Un digest di messaggio è un codice risultante dalla crittografia di una stringa o di dati di qualsiasi lunghezza, elaborato da una funzione hash.

MD5. Utilizzato per controllare le immagini ISO di CD o DVD. RIPEMD (Digest del messaggio di valutazione dei primitivi di integrità RACE). Basato sui principi di MD4 e simili a SHA-1. SHA-1 (Secure Hash Algorithm 1). Più comunemente usato dell'insieme SHA delle relative funzioni hash crittografiche. È stato progettato dall'agenzia NSA. HMAC. autenticazione dei messaggi con hash con chiave. Tiger (TTH). Di solito usato negli hash di tigre.

Crittografia utilizzando numeri pseudo-casuali Vedi. Generatori di numeri casuali

Tecniche di crittografia

Condivisione segreta, divisione del segreto, divisione del tasto, algoritmi M di N.

Schema di condivisione segreta di Shamir. Questa è una formula basata sull'interpolazione polinomiale. Schema di condivisione segreta di Blakley. È di natura geometrica, il segreto è un punto in uno spazio m-dimensionale.

Altre tecniche e decrittazione

Somma del sottoinsieme. Dato un insieme di numeri interi, la somma di un sottoinsieme equivale a zero? Usato in crittografia. L'algoritmo di Shor. Algoritmo quantistico in grado di decrittografare un codice basato su funzioni asimmetriche come RSA.

Geometria

Incartamento di regalo. Determinazione dello scafo convesso di una serie di punti. Distanza Gilbert-Johnson-Keerthi. Determinazione della distanza minima tra due forme convesse. Graham scan. Determinazione dello scafo convesso di una serie di punti nel piano. Intersezione del segmento di linea. Verifica se le linee si intersecano con un algoritmo di linea sweep. Punta in poligono. Verifica se un determinato punto si trova all'interno di un dato. Intersezione raggio / piano. * Intersezione linea / triangolo. * Caso particolare dell'intersezione raggio / piano. Poligonizzazione di superfici implicite. Approssimare una superficie implicita con una rappresentazione poligonale. Triangolazione.Metodo per valutare la distanza da un punto dagli angoli ad altri punti, la cui distanza è nota.

Grafici Tecnologia Surface Tracker 3D. Processo per aggiungere immagini sui muri in un video mentre vengono prese in considerazione le superfici nascoste. Bellman-Ford. Calcola i percorsi più brevi in ​​un grafico ponderato (in cui alcuni dei pesi dei bordi possono essere negativi). L'algoritmo di Dijkstra. Calcola i percorsi più brevi in ​​un grafico con pesi dei bordi non negativi. Metodi di perturbazione. Un algoritmo che calcola i percorsi localmente più brevi in ​​un grafico. Floyd-Warshall. Risolve il problema del percorso più breve di tutte le coppie in un grafico diretto e ponderato. La ricerca del ciclo di Floyd. Trova cicli nelle iterazioni. Johnson. Algoritmo del percorso più breve di tutte le coppie nel grafico diretto ponderato rado. Kruskal.Trova un albero di spanning minimo per un grafico. Di Prim. Trova un albero di spanning minimo per un grafico. Chiamato anche algoritmo DJP, Jarník o Prim – Jarník. * Boruvka. * Trova un albero di spanning minimo per un grafico. Ford-Fulkerson. Calcola il flusso massimo in un grafico. Edmonds-Karp. Implementazione di Ford-Fulkerson. Interruttore di spanning minimo non bloccante. Per un centralino telefonico. Woodhouse-Sharp. Trova un albero di spanning minimo per un grafico. A base di primavera. Algoritmo per il disegno grafico. Ungherese. Algoritmo per trovare una corrispondenza perfetta. Algoritmo di colorazione. Algoritmo di colorazione del grafico. Vicino più vicino.Trova il vicino più vicino. Ordinamento topologico. Ordinare un grafico aciclico diretto in modo tale che ciascun nodo preceda tutti i nodi a cui ha bordi (secondo le direzioni). Algoritmo degli antenati meno comuni off-line di Tarjan. Calcola gli antenati comuni più bassi per le coppie di nodi in un albero.

Grafica

Algoritmo di linea di Bresenham. Utilizza le variabili di decisione per tracciare una linea retta tra 2 punti specificati. Paesaggio Disegna uno scenario 3D. * Algoritmo della linea DDA. * Usa la matematica in virgola mobile per tracciare una linea retta tra 2 punti specificati. Riempimento. Riempie una regione connessa con un colore. Ripristino dell'immagine. Ripristina foto, migliora le immagini. Algoritmo di linea di Xiaolin Wu. Antialiasing di linea. Algoritmo del pittore. Rileva parti visibili di uno scenario tridimensionale. Ray tracing. Rendering di immagini realistiche. Phong shading. Un modello di illuminazione e un metodo di interpolazione in computer grafica 3D. Ombreggiatura Gouraud.Simula i diversi effetti di luce e colore sulla superficie di un oggetto 3D. Rendering scanline. Costruisce un'immagine spostando una linea immaginaria. Illuminazione globale. Considera l'illuminazione diretta e il riflesso di altri oggetti. Interpolazione. Costruzione di nuovi punti dati come nello zoom digitale. Resynthesizer. Rimuovi un oggetto su una foto e ricostruisci lo sfondo utilizzato da Photoshop e The Gimp. Tutorial su Resynthesizer. Algoritmo di intercettazione pendenza. È un'implementazione della formula di intercettazione dell'inclinazione per tracciare una linea. Interpolazione spline. Riduce l'errore con il fenomeno di Runge. Tecnologia 3D Surface Tracker. Aggiunta di immagini o video sui muri in un video, tenendo conto delle superfici nascoste.

Elenchi, matrici e alberi

ricerca

Ricerca nel dizionario. Vedi ricerca predittiva. Algoritmo di selezione. Trova il kth più grande elemento in un elenco. Algoritmo di ricerca binaria. Individua un elemento in un elenco ordinato. Ampia ricerca. Attraversa un grafico livello per livello. Ricerca in profondità. Attraversa un grafico ramo per ramo. La migliore ricerca. Attraversa un grafico nell'ordine della probabile importanza usando una coda prioritaria. Una ricerca di alberi. * Caso speciale della migliore ricerca che utilizza l'euristica per migliorare la velocità. Ricerca a costi uniformi. Una ricerca ad albero che trova il percorso di costo più basso in cui i costi variano. Ricerca predittiva.Ricerca binaria come i fattori che determinano l'entità del termine di ricerca rispetto ai valori alti e bassi della ricerca. Hash table. Associare le chiavi agli elementi in una raccolta non ordinata, per recuperarli in un tempo lineare. Ricerca interpolata. Vedi ricerca predittiva.

Ordinamento

Ordinamento di alberi binari. Ordinamento di un albero binario, incrementale, simile all'ordinamento per inserzione. Stupid Sort. Ordinamento casuale inefficiente di una carta da scrivania. Ordinamento delle bolle. Per ogni coppia di indici, scambiare gli articoli se non funzionanti. Ordinamento della benna. Dividi un elenco in secchi e ordinali singolarmente. Generalizza la specie di piccione. Ordinamento cocktail (o bolla bidirezionale, shaker, ripple, shuttle, happy hour sort). Variazione dell'ordinamento a bolle che ordina in entrambe le direzioni ciascuna passa attraverso l'elenco. Comb ordinamento. Variazione efficiente dell'ordinamento delle bolle che elimina le "tartarughe", i piccoli valori vicino alla fine dell'elenco e fa uso degli spazi vuoti tra i valori. Ordinamento di conteggio.Utilizza l'intervallo di numeri nell'elenco A per creare un array B di questa lunghezza. Gli indici in B vengono utilizzati per contare quanti elementi in A hanno un valore inferiore a i. Gnome sort. Simile all'ordinamento per inserzione, tranne per il fatto che lo spostamento di un elemento nella posizione corretta viene eseguito da una serie di scambi, come nell'ordinamento a bolle. Heapsort. Converti l'elenco in un heap, continua a rimuovere l'elemento più grande dall'heap e aggiungilo alla fine dell'elenco. Ordinamento per inserzione. Determina la posizione dell'elemento corrente nell'elenco di quelli ordinati e inseriscilo lì. Introsort. O ordinamento introspettivo. Inizia in quicksort e passa a heapsort a un certo livello di ricorsione. Unisci ordinamento.Ordinare la prima e la seconda metà dell'elenco separatamente, quindi unire gli elenchi ordinati. Pancake sort. Elementi inversi di alcuni prefissi di una sequenza. Sorta di piccione. Riempi un array vuoto con tutti gli elementi di un array da ordinare, in ordine. Sorta di postino. Variante gerarchica del secchio, utilizzata dagli uffici postali. Quicksort. Dividi l'elenco in due, con tutti gli elementi nel primo elenco che precedono tutti gli elementi nel secondo elenco .; quindi ordinare i due elenchi. Spesso il metodo di scelta. Ordinamento Radix. Ordina le chiavi associate agli articoli o numeri interi elaborando le cifre. Ordinamento di selezione. Scegli il più piccolo degli elementi rimanenti, aggiungilo alla fine dell'elenco ordinato. Ordinamento Shell.Migliora l'ordinamento di inserzione con l'uso di spazi vuoti tra i valori. Smoothsort. Vedi heapsort. Ordinamento stocastico. Vedi bogosort.

e molti altri...


0

Hai fatto due domande nell'intestazione della domanda, quindi risponderò ad entrambe.

Sì, l'informatica riguarda gli algoritmi. Beh ... in realtà è un po 'fuorviante perché ci sono molti aspetti dell'informatica, quindi lo riformulo. L'informatica applicata nel mondo del lavoro riguarda prevalentemente algoritmi. Aziende come Google, Facebook e tutti quei luoghi folli che assumono fisici e sviluppatori di Wall Street vogliono che i problemi altamente complessi si riducano a una forma semplice, che di per sé richiede una profonda comprensione della matematica e della progettazione di algoritmi.

No, la programmazione non riguarda solo gli algoritmi. La programmazione consiste nel prendere le specifiche e convertirle in codice che può essere compilato per l'esecuzione.

La parte extra della risposta: lo sviluppo del software non sta programmando, eppure molti sembrano confondere i termini e usarli in modo intercambiabile. La programmazione è semplicemente una funzione o una tecnica forse del più ampio processo di sviluppo del software. Lo sviluppo del software non riguarda certamente gli algoritmi, si tratta di risolvere i problemi con il software e di applicare solidi processi aziendali compatibili per consentire la risoluzione efficiente dei problemi. Mentre i processi di sviluppo del software - e persino la programmazione stessa - potrebbero essere processi algoritmici nella loro natura, questo non è lo stesso degli algoritmi.

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.