Strutture dati e algoritmi (DSA) fare riferimento allo studio di metodi per organizzare e archiviare dati e alla progettazione di procedure (algoritmi) per la risoluzione di problemi, che operano su queste strutture dati. DSA è una delle competenze più importanti che ogni studente di informatica deve possedere. Si vede spesso che le persone con una buona conoscenza di queste tecnologie sono programmatori migliori di altri e, quindi, interrompono le interviste di quasi tutti i giganti della tecnologia. Questo Esercitazione sui DSA mira ad aiutarti ad apprendere strutture dati e algoritmi (DSA) in modo rapido e semplice.
Tabella dei contenuti
- Modulo completo DSA
- Cos'è il DSA?
- Come apprendere i DSA?
- Corda
- Elenchi collegati
- Matrice/Griglia
- Pila
- Coda
- Mucchio
- Hash
- Albero
- Grafico
- Algoritmo di ricerca
- Algoritmo di ordinamento
- Algoritmo 'dividi e conquista'.
- Algoritmi golosi
- Ricorsione
- Algoritmo di backtracking
- Programmazione dinamica
- Algoritmi grafici:
- Ricerca di modelli
- Algoritmi matematici
- Algoritmi geometrici
- Algoritmi bit per bit
- Algoritmi randomizzati
- Algoritmo di branch e bound
Modulo completo DSA
Il termine DSA sta per Strutture dati e algoritmi , nel contesto dell'informatica.
Cos'è il DSA?
Strutture dati e algoritmi (DSA) fare riferimento allo studio di metodi per organizzare e archiviare dati e alla progettazione di procedure (algoritmi) per la risoluzione di problemi, che operano su queste strutture dati.
Come apprendere i DSA?
La prima cosa più importante è dividere l'intera procedura in piccole parti che devono essere eseguite in sequenza. Il processo completo per apprendere i DSA da zero può essere suddiviso in 5 parti:
- Impara almeno un linguaggio di programmazione (lo lasciamo alla tua scelta).
- Impara le strutture dati
- Impara gli algoritmi
- Scopri le complessità del tempo e dello spazio
- Problemi pratici sui DSA

Come apprendere i DSA?
Sperando che tu abbia imparato un linguaggio di programmazione di tua scelta, andiamo avanti con il passaggio successivo per imparare DSA in questo tutorial DSA.
Ecco la fase più importante e più attesa della tabella di marcia per l’apprendimento della struttura dei dati e dell’algoritmo: la fase in cui inizi a conoscere i DSA. L’argomento dei DSA è composto da due parti:
- Strutture dati
- Algoritmi
Sebbene siano due cose diverse, sono fortemente correlate ed è molto importante seguire la strada giusta per apprenderle nel modo più efficiente. Se sei confuso su quale imparare per primo, ti consigliamo di consultare la nostra analisi dettagliata sull'argomento: Qui abbiamo seguito il flusso di apprendimento di una struttura dati e quindi gli algoritmi più correlati e importanti utilizzati da quella struttura dati.
Impara le strutture dati
Strutture dati sono componenti essenziali che aiutano a organizzare e archiviare i dati in modo efficiente nella memoria del computer. Forniscono un modo per gestire e manipolare i dati in modo efficace, consentendo operazioni di accesso, inserimento ed eliminazione più rapide. Le strutture dati comuni includono array, elenchi concatenati, pile, code, alberi e grafici , ciascuno con scopi specifici in base ai requisiti del problema in questione. Comprendere le strutture dei dati è fondamentale per progettare algoritmi efficienti e ottimizzare le prestazioni del software.
Vettore è una struttura dati lineare che memorizza una raccolta di elementi dello stesso tipo di dati. Agli elementi viene allocata memoria contigua, consentendo l'accesso in tempo costante. Ogni elemento ha un numero di indice univoco.
- Operazioni sull'array:
- Traversata : Iterazione attraverso gli elementi di un array.
- Inserimento : Aggiunta di un elemento all'array in corrispondenza di un indice specifico.
- Cancellazione : rimozione di un elemento dall'array in corrispondenza di un indice specifico.
- Ricerca : ricerca di un elemento nell'array in base al suo valore o indice.
- Tipi di array :
- Matrice unidimensionale : un array semplice con una singola dimensione.
- Matrice multidimensionale : un array con più dimensioni, ad esempio una matrice.
- Applicazioni dell'array :
- Memorizzazione dei dati in modo sequenziale
- Implementazione di code, stack e altre strutture dati
- Rappresentazione di matrici e tabelle
- Argomenti correlati sull'array:
- Esercitazione sugli array
- I 50 principali problemi di codifica degli array per le interviste
- Problemi pratici sugli array
2. Corda
UN corda è una sequenza di caratteri, generalmente utilizzata per rappresentare il testo. È considerato un tipo di dati che consente la manipolazione e l'elaborazione di dati testuali nei programmi informatici.
- Operazioni su stringa :
- Concatenazione : Unire due corde insieme.
- Confronto : Confronto lessicografico di due stringhe.
- Sottostringa estrazione : estrazione di una sottostringa da una stringa.
- Ricerca : ricerca di una sottostringa all'interno di una stringa.
- Modifica : modifica o sostituzione di caratteri all'interno di una stringa.
- Applicazioni della stringa :
- Elaborazione del testo
- Corrispondenza del modello
- Convalida dei dati
- Gestione del database
- Post correlati:
- Tutorial sulle corde
- I 50 principali problemi di codifica delle stringhe per le interviste
- Problemi pratici sulla corda
3. Elenchi collegati
UN lista collegata è una struttura dati lineare che memorizza i dati in nodi, collegati da puntatori. A differenza degli array, gli elenchi collegati non vengono archiviati in posizioni di memoria contigue.
- Caratteristiche della lista collegata:
- Dinamico : gli elenchi collegati possono essere facilmente ridimensionati aggiungendo o rimuovendo nodi.
- Non contiguo : I nodi vengono archiviati in posizioni di memoria casuali e collegati tramite puntatori.
- Accesso sequenziale : L'accesso ai nodi è possibile solo in sequenza, a partire dall'inizio della lista.
- Operazioni sulla lista collegata:
- Creazione : Creazione di un nuovo elenco collegato o aggiunta di un nuovo nodo a un elenco esistente.
- Traversata : Iterazione dell'elenco e accesso a ciascun nodo.
- Inserimento : Aggiunge un nuovo nodo in una posizione specifica nell'elenco.
- Cancellazione : rimozione di un nodo dall'elenco.
- Ricerca : Trovare un nodo con un valore specifico nell'elenco.
- Tipi di elenco collegato :
- Elenco collegato singolarmente : Ogni nodo punta al nodo successivo nell'elenco.
- Elenco doppiamente collegato : Ogni nodo punta sia al nodo successivo che a quello precedente nell'elenco.
- Elenco collegato circolare : L'ultimo nodo punta al primo nodo, formando un anello circolare.
- Applicazioni della lista collegata :
- Gli elenchi collegati vengono utilizzati in varie applicazioni, tra cui:
- Implementazione di code e stack
- Rappresentare grafici e alberi
- Mantenimento dei dati ordinati
- Gestione della memoria
- Argomenti correlati:
- Esercitazione sull'elenco collegato
- I 50 principali problemi nell'elenco collegato per le interviste
- Problemi pratici sulle liste collegate
4. Matrice/Griglia
UN matrice è un array bidimensionale di elementi, disposti in righe e colonne. È rappresentato come una griglia rettangolare, con ciascun elemento all'intersezione di una riga e di una colonna.
- Concetti chiave:
- Righe : Linee orizzontali di elementi in una matrice.
- Colonne : Linee verticali di elementi in una matrice.
- Dimensioni : Il numero di righe e colonne in una matrice (ad esempio, una matrice 3×4 ha 3 righe e 4 colonne).
- Elemento Accesso : È possibile accedere agli elementi utilizzando gli indici di riga e colonna (ad esempio, M[2][3] si riferisce all'elemento nella riga 2, colonna 3).
- Applicazioni di Matrice/Griglia :
- Elaborazione delle immagini
- Analisi dei dati
- Problemi di ottimizzazione
- Post correlati:
- Tutorial su matrice/griglia
- I 50 principali problemi sulla matrice/griglia per le interviste
- Problemi pratici su matrice/griglia
5. Pila
Pila è una struttura di dati lineare che segue un ordine particolare in cui vengono eseguite le operazioni. L'ordine potrebbe essere LIFO (ultimo entrato, primo uscito) O FILO (Primo entrato, ultimo uscito) . LIFO implica che l'elemento che viene inserito per ultimo, esce per primo e FILO implica che l'elemento che viene inserito per primo, esce per ultimo.
- Operazione sullo Stack :
- Spingere : aggiunge un elemento in cima allo stack
- Pop : rimuove e restituisce l'elemento in cima allo stack
- Sbirciare : Restituisce l'elemento in cima allo stack senza rimuoverlo
- Misurare : Restituisce il numero di elementi nello stack
- È vuoto : Controlla se lo stack è vuoto
- Applicazioni dello Stack :
- Chiamate di funzione
- Valutazione dell'espressione
- Fare marcia indietro
- Annulla/ripristina operazioni
- Argomenti correlati sullo stack:
- Esercitazione sullo stack
- I 50 principali problemi in pila per le interviste
- Esercitarsi sui problemi sullo Stack
6. Coda
UN Coda La struttura dei dati è un concetto fondamentale in informatica utilizzato per archiviare e gestire i dati in un ordine specifico. Segue il principio di Il primo che entra è il primo ad uscire ( FIFO ), dove il primo elemento aggiunto alla coda è il primo ad essere rimosso
- Operazione in coda :
- Accodare : aggiunge un elemento alla fine della coda
- Di conseguenza : rimuove un elemento dalla parte anteriore della coda
- Sbirciare : Recupera l'elemento frontale senza rimuoverlo
- È vuoto : controlla se la coda è vuota
- È pieno : Controlla se la coda è piena
- Tipo di coda :
- Coda circolare : L'ultimo elemento si collega al primo elemento
- Coda a doppia estremità (Deque) : Le operazioni possono essere eseguite da entrambe le estremità
- Coda prioritaria : Gli elementi sono organizzati in base alla priorità
- Applicazioni della coda :
- Pianificazione del lavoro
- Accodamento di messaggi
- Modellazione di simulazione
- Bufferizzazione dei dati
- Argomenti correlati:
- Esercitazione sulla coda
- I 50 principali problemi in coda per le interviste
- Esercitarsi sui problemi in coda
7. Mucchio
UN Mucchio è una struttura dati ad albero binario completa che soddisfa la proprietà heap: per ogni nodo, il valore dei suoi figli è inferiore o uguale al proprio valore. Gli heap vengono solitamente utilizzati per l'implementazione code prioritarie , dove l'elemento più piccolo (o più grande) è sempre alla radice dell'albero.
- Operazioni di Heap :
- Inserire : Aggiunge un nuovo elemento all'heap mantenendo le proprietà dell'heap.
- Estrai-Max/Estrai-Min : rimuove l'elemento root e ristruttura l'heap.
- Tasto aumento/diminuzione : Aggiorna il valore di un nodo e ristruttura l'heap.
- Tipi di heap :
- Max-Heap : Il nodo radice ha il valore massimo tra i suoi figli.
- Min-Heap : Il nodo radice ha il valore minimo tra i suoi figli.
- Applicazioni di Heap :
- Code prioritarie
- Ordinamento
- Algoritmi grafici (ad esempio, l'algoritmo di Dijkstra)
- Post correlati:
- Esercitazione sull'heap
- I 50 principali problemi sull'heap per le interviste
- Problemi pratici sull'heap
8. Hash
Hashing è una tecnica che genera un output di dimensione fissa (valore hash) da un input di dimensione variabile utilizzando formule matematiche chiamate funzioni hash . L'hashing viene utilizzato per determinare un indice o una posizione in cui archiviare un elemento in una struttura dati, consentendo un recupero e un inserimento efficienti.
- Concetti chiave:
- Funzione hash : una funzione matematica che associa un input a un valore hash.
- Tabella hash : una struttura dati che memorizza coppie chiave-valore, dove la chiave è un valore hash e il valore sono i dati effettivi.
- Collisione : quando due chiavi diverse producono lo stesso valore hash.
- Tipi di funzioni hash :
- Metodo della divisione : divide l'input per una costante e utilizza il resto come valore hash.
- Piazza Metà Metodo: quadra l'input e prende le cifre centrali come valore hash.
- Metodo di piegatura : divide l'input in blocchi di uguali dimensioni e li somma per ottenere il valore hash.
- Metodo di moltiplicazione : Moltiplica l'input per una costante e prende la parte frazionaria come valore hash.
- Tecniche di risoluzione delle collisioni :
- Concatenamento separato (hash aperto) : memorizza gli elementi in conflitto in un elenco collegato al valore hash corrispondente.
- Indirizzamento aperto (hashing chiuso) : utilizza varie strategie per trovare una posizione alternativa per gli elementi in collisione all'interno della tabella hash.
- Applicazioni dell'hashing :
- Archiviazione e recupero efficienti dei dati in database e file system.
- Verifica password e firme digitali.
- Distribuire le richieste su più server.
- Generazione di hash sicuri per l'integrità e l'autenticazione dei dati.
- Post correlati:
- Tutorial sull'hash
- Problemi pratici sull'hashing
9. Albero
UN albero è una struttura dati gerarchica non lineare costituita da nodi collegati da bordi, con un nodo superiore chiamato radice e nodi aventi nodi figli. Viene utilizzato in informatica per organizzare i dati in modo efficiente.
anaconda contro serpente pitone
- Traversata dell'albero : I metodi di attraversamento dell'albero vengono utilizzati per visitare ed elaborare i nodi in una struttura dati ad albero. I tre metodi di attraversamento comuni sono:
- Al fine : Visita il sottoalbero sinistro, il nodo corrente, quindi il sottoalbero destro.
- Ordine prestabilito : Visita il nodo corrente, il sottoalbero sinistro, quindi il sottoalbero destro.
- Post-ordine : Visita il sottoalbero sinistro, il sottoalbero destro, quindi il nodo corrente.
- Classificazioni degli alberi:
- Classificazioni di Alberi si riferiscono al raggruppamento di alberi in base a determinate caratteristiche o criteri. Ciò può comportare la categorizzazione degli alberi in base al loro fattore di equilibrio, al grado dei nodi, alle proprietà di ordinamento, ecc. Di seguito sono riportate alcune importanti classificazioni degli alberi.
Classificazione | Descrizione | Tipo | Descrizione |
---|---|---|---|
Per grado | Gli alberi possono essere classificati in base al numero massimo di figli che ciascun nodo può avere. | Albero binario | Ogni nodo ha al massimo due figli. |
Albero ternario | Ogni nodo ha al massimo tre figli. | ||
Albero N-ario | Ogni nodo ha al massimo N figli. | ||
Ordinando | Gli alberi possono essere classificati in base all'ordinamento di nodi e sottoalberi | Albero di ricerca binario (BST) | Bambino sinistro |
Mucchio | Albero binario specializzato con la proprietà heap. | ||
Per equilibrio | Gli alberi possono essere classificati in base al loro equilibrio. | Le altezze dei sottoalberi differiscono al massimo di uno. Gli esempi includono alberi AVL e alberi Rosso-Nero. | |
Albero sbilanciato | Le altezze delle sottostrutture possono differire in modo significativo, influenzando le prestazioni in operazioni come la ricerca e l'inserimento. algoritmo di Kruskals |
- Applicazioni degli alberi:
- File system
- Banche dati
- documenti XML
- Intelligenza artificiale
- Post correlati:
- Esercitazione sull'albero
- I 50 principali problemi di codifica degli alberi
- Problemi pratici sull'albero
10. Grafico
UN Grafico è una struttura dati non lineare costituita da un insieme finito di vertici (o nodi) e un insieme di bordi che collegano una coppia di nodi.
- Attraversamenti del grafico:
- Ricerca in ampiezza (BFS) : Visita i nodi livello per livello.
- Ricerca in profondità (DFS) : visita i nodi in modo ricorsivo, esplorando un ramo alla volta.
- Applicazioni dei grafici :
- Social networks
- Mappe e navigazione
- Pianificazione
- Estrazione dei dati
- Post correlati:
- Rappresentazione grafica
- Tipi di grafici
- Esercitazione sui grafici
- Problemi pratici sul grafico
Impara gli algoritmi
Una volta chiariti i concetti di Strutture dati , ora è il momento di iniziare il tuo viaggio attraverso Algoritmi . In base alla tipologia di natura e di utilizzo, gli Algoritmi sono raggruppati in più categorie, come di seguito riportato:
1. Algoritmo di ricerca
Algoritmi di ricerca vengono utilizzati per individuare dati specifici all'interno di un insieme di dati più ampio. Aiuta a trovare la presenza di un valore target all'interno dei dati. Esistono vari tipi di algoritmi di ricerca, ciascuno con il proprio approccio ed efficienza.
- Algoritmi di ricerca più comuni:
- Ricerca lineare : ricerca iterativa da un'estremità all'altra.
- Ricerca binaria : ricerca divide et impera su un array ordinato, dimezzando lo spazio di ricerca ad ogni iterazione.
- Ricerca ternaria : ricerca divide et impera su un array ordinato, dividendo lo spazio di ricerca in tre parti ad ogni iterazione.
- Altri algoritmi di ricerca:
- Salta la ricerca
- Ricerca per interpolazione
- Ricerca esponenziale
- Argomenti correlati:
- Problemi pratici sull'algoritmo di ricerca
2. Algoritmo di ordinamento
Algoritmi di ordinamento sono utilizzati per disporre gli elementi di un elenco in un ordine specifico, ad esempio numerico o alfabetico. Organizza gli elementi in modo sistematico, facilitando la ricerca e l'accesso a elementi specifici.
Esistono molti tipi diversi di algoritmi di ordinamento. Alcuni algoritmi ampiamente utilizzati sono:
Algoritmo di ordinamento | Descrizione |
---|---|
Ordinamento a bolle | Confronta iterativamente gli elementi adiacenti e li scambia se sono fuori servizio. L'elemento più grande bolle alla fine dell'elenco ad ogni passaggio. |
Ordinamento della selezione | Trova l'elemento minimo nella parte non ordinata dell'elenco e lo scambia con il primo elemento. Ripete questo processo finché l'intero elenco non viene ordinato. |
Ordinamento per inserimento | Costruisce l'elenco ordinato un elemento alla volta inserendo ciascun elemento non ordinato nella posizione corretta nella porzione ordinata. |
Ordinamento rapido | Un algoritmo divide et impera che seleziona un elemento pivot, suddivide l'elenco in due sottoliste in base al pivot e applica ricorsivamente lo stesso processo alle sottoliste. |
Unisci ordinamento | Un altro algoritmo divide et impera che divide ricorsivamente l'elenco in sottoelenchi più piccoli, li ordina e quindi li unisce nuovamente per ottenere l'elenco ordinato. |
Argomenti correlati:
- Tutorial sull'algoritmo di ordinamento
- Domande e problemi di ordinamento principali dell'intervista
- Problemi pratici sull'algoritmo di ordinamento
3. Algoritmo “dividi e conquista”.
Dividere e conquistare Gli algoritmi seguono una strategia ricorsiva per risolvere i problemi dividendoli in sottoproblemi più piccoli, risolvendoli e combinando le soluzioni per ottenere la soluzione finale.
Passaggi:
- Dividere : suddividere il problema in sottoproblemi più piccoli e indipendenti.
- Conquistare : Risolvi ricorsivamente ogni sottoproblema.
- Combina : Unire le soluzioni dei sottoproblemi per ottenere la soluzione finale.
Esempi:
- Unisci ordinamento: divide l'array in due metà, ordina ciascuna metà in modo ricorsivo e unisce le metà ordinate.
- Ordinamento rapido: seleziona un elemento pivot, suddivide l'array in due sottoarray in base al pivot e ordina ricorsivamente ciascun sottoarray.
- Ricerca binaria: divide ripetutamente lo spazio di ricerca a metà finché non viene trovato l'elemento di destinazione o fino all'esaurimento dello spazio di ricerca.
Articoli Correlati:
- Tutorial Divide et Impera
- Problemi pratici sull'algoritmo Divide And Conquer
4. Algoritmi golosi
Come suggerisce il nome, questo algoritmo costruisce la soluzione un pezzo alla volta e sceglie il pezzo successivo che offre il vantaggio più ovvio e immediato, ovvero che è la scelta più ottimale in quel momento. Quindi i problemi in cui la scelta ottimale a livello locale porta anche a soluzioni globali sono più adatti a Greedy.
Alcuni importanti problemi degli algoritmi greedy sono:
Algoritmo | Descrizione |
---|---|
Zaino frazionario | Trova il valore totale massimo degli oggetti che possono essere inseriti nello zaino, consentendo l'inclusione frazionaria degli oggetti. |
Algoritmo di Dijkstra | Trova il percorso più breve da un vertice sorgente a tutti gli altri vertici in un grafico pesato. |
Algoritmo di Kruskal | Trova l'albero di copertura minimo di un grafico ponderato. |
Codifica Huffman | Crea un codice prefisso ottimale per un insieme di simboli, riducendo al minimo la lunghezza totale della codifica. |
Articoli Correlati:
- Tutorial sull'algoritmo goloso
- Problemi pratici sull'algoritmo Greedy
5. Ricorsione
Ricorsione è una tecnica di programmazione in cui una funzione richiama se stessa all'interno della propria definizione. Di solito viene utilizzato per risolvere problemi che possono essere suddivisi in istanze più piccole dello stesso problema. Per esempio: Torri di Hanoi (TOH) , Calcolo fattoriale E Sequenza di Fibonacci eccetera.
Passi :
- Caso base : definisce una condizione che interrompe le chiamate ricorsive e fornisce una soluzione.
- Caso ricorsivo : definire i passaggi per suddividere il problema in istanze più piccole ed effettuare chiamate ricorsive.
- Ritorno : Restituisce la soluzione dalle chiamate ricorsive e combinale per risolvere il problema originale.
Il punto che rende la ricorsione uno degli algoritmi più utilizzati è che costituisce la base per molti altri algoritmi come Attraversamenti sugli alberi , Attraversamenti del grafico , Algoritmi 'dividi e conquista'. E Algoritmi di backtracking .
Argomenti correlati:
- Esercitazione sulla ricorsione
- Funzioni ricorsive
- Ricorsione della coda
- I 50 principali problemi sull'algoritmo di ricorsione per l'intervista
- Problemi pratici sull'algoritmo di ricorsione
6. Algoritmo di backtracking
Come accennato in precedenza, il Fare marcia indietro L'algoritmo è derivato dall'algoritmo Ricorsione, con la possibilità di ripristinare se una soluzione ricorsiva fallisce, ovvero nel caso in cui una soluzione fallisce, il programma risale al momento in cui ha fallito e si basa su un'altra soluzione. Quindi in pratica prova tutte le possibili soluzioni e trova quella corretta.
Alcuni problemi importanti e più comuni degli algoritmi di backtracking, che è necessario risolvere prima di andare avanti, sono:
Problema | Descrizione |
---|---|
Il problema del tour di Knight | Trovare una sequenza di mosse di un cavallo su una scacchiera tale che visiti ogni casella esattamente una volta. |
Ratto in un labirinto | Trovare un percorso dalla posizione di partenza all'uscita in un labirinto, con gli ostacoli rappresentati come muri. |
Problema della N-Regina | Posizionare N regine su una scacchiera N×N in modo tale che due regine non si attacchino a vicenda. |
Problema della somma dei sottoinsiemi | Determinare se esiste un sottoinsieme dell'insieme dato con una data somma. |
Sudoku | Risolvere un puzzle con griglia 9×9 con numeri da 1 a 9 in modo tale che ogni riga, colonna e griglia secondaria 3×3 contenga tutte le cifre senza ripetizioni. |
Articolo correlato:
- Tutorial sul ritorno alla normalità
- Problemi pratici sull'algoritmo di Backtracking
7. Programmazione dinamica
Programmazione dinamica è un metodo utilizzato in matematica e informatica per risolvere problemi complessi scomponendoli in sottoproblemi più semplici. Risolvendo ciascun sottoproblema una sola volta e memorizzando i risultati, si evitano calcoli ridondanti, portando a soluzioni più efficienti per un'ampia gamma di problemi.
Concetti chiave:
- Sottostruttura ottimale : La soluzione ottima di un problema può essere costruita a partire dalle soluzioni ottime dei suoi sottoproblemi.
- Sottoproblemi sovrapposti : I sottoproblemi sono spesso ripetuti nel problema più grande, portando a calcoli ridondanti.
- Memoizzazione / Tabulazione : Memorizzare le soluzioni ai sottoproblemi per evitare il ricalcolo.
Alcuni problemi importanti e più comuni degli algoritmi di programmazione dinamica, che è necessario risolvere prima di procedere, sono:
Problema | Descrizione |
---|---|
Sequenza di Fibonacci | Generazione di numeri di Fibonacci utilizzando la programmazione dinamica per evitare calcoli ridondanti. |
Sottosequenza comune più lunga | Trovare la sottosuccessione più lunga comune a due sequenze. |
Sottosequenza crescente più lunga | Trovare la sottosuccessione più lunga di una data sequenza in cui gli elementi sono ordinati in ordine crescente. |
0/1 Problema dello zaino | Determinazione del valore massimo che può essere ottenuto selezionando articoli con pesi e valori determinati, senza superare un limite di peso specificato. |
Problema del taglio dell'asta | Massimizzare il profitto tagliando in pezzi una canna di determinata lunghezza e vendendoli a determinati prezzi. |
Problema del cambio moneta | Determinare il numero di modi per apportare il resto per un determinato importo utilizzando un determinato insieme di denominazioni di monete. |
Modifica distanza | Trovare il numero minimo di operazioni (inserimento, cancellazione, sostituzione) necessarie per convertire una stringa in un'altra. |
Problema della somma dei sottoinsiemi | Determinare se esiste un sottoinsieme di un dato insieme con una data somma. |
Sottosequenza palindromica più lunga | Trovare la sottosuccessione più lunga di una data sequenza che sia palindroma. |
Somma massima del sottoarray | Trovare il sottoarray contiguo con la somma più grande all'interno di un dato array unidimensionale. |
Somma sottoinsieme uguale partizione | Determinare se è possibile partizionare un dato insieme in due sottoinsiemi di uguale somma. |
Percorso a costo minimo | Trovare il percorso del costo minimo dall'angolo in alto a sinistra all'angolo in basso a destra di una determinata griglia. |
Sottoarray prodotto massimo | Trovare il sottoarray contiguo con il prodotto più grande all'interno di un dato array unidimensionale. |
Articoli Correlati:
- Tabulazione vs Memoizzazione
- Come risolvere un problema di programmazione dinamica?
- Tutorial sulla programmazione dinamica
- I 50 principali problemi di codifica della programmazione dinamica per le interviste
- Esercitazioni pratiche sull'algoritmo di Programmazione Dinamica
8. Algoritmi grafici :
Algoritmi grafici nelle strutture dati e negli algoritmi (DSA) sono un insieme di tecniche e metodi utilizzati per risolvere problemi relativi ai grafi, che sono una raccolta di nodi e spigoli. Questi algoritmi sono progettati per eseguire varie operazioni sui grafici, come ad esempio cercare, attraversare, trovare la strada più breve e determinante connettività . Sono essenziali per risolvere un'ampia gamma di problemi del mondo reale, tra cui il routing della rete, l'analisi dei social network e l'allocazione delle risorse.
Argomento | Descrizione dell'argomento | Algoritmo | Descrizione dell'algoritmo |
---|---|---|---|
Attraversamento del grafico | Tecniche per visitare tutti i vertici di un grafico. | Ricerca in profondità (DFS) | Esplora il più lontano possibile lungo ciascun ramo prima di tornare sui propri passi. |
Ricerca in ampiezza (BFS) | Esplora i vertici vicini prima di passare al livello successivo di vertici. | ||
Alberi di copertura minimi | Gli Spanning Tree minimi sono gli alberi più piccoli che collegano tutti i nodi in un grafo senza formare cicli, ottenuti aggiungendo i bordi più corti possibili. | Trova un albero di copertura minimo per un grafico pesato connesso. Aggiunge il bordo di peso più piccolo che non forma un ciclo. | |
Trova anche un albero di copertura minimo per un grafico pesato connesso. Aggiunge il bordo di peso più piccolo che collega due alberi. | |||
Ordinamento topologico | L'ordinamento topologico è un ordinamento lineare dei vertici in un grafo aciclico diretto (DAG) tale che per ogni bordo diretto dal vertice u al vertice v, u viene prima di v nell'ordinamento. | Algoritmo di Kahn | L’algoritmo di Kahn trova un ordinamento topologico di un grafo aciclico diretto (DAG). |
Algoritmo basato su DFS | L'algoritmo basato su DFS utilizza la ricerca Depth-First per eseguire l'ordinamento topologico in un grafico aciclico diretto (DAG). | ||
Il percorso più breve | Un percorso più breve in un grafico è il percorso tra due vertici in un grafico che ha la somma minima dei pesi lungo i suoi bordi rispetto a tutti gli altri percorsi tra gli stessi due vertici. | Algoritmo greedy per trovare il percorso più breve tra tutti i nodi in tempo O(E * V logV). | |
Trova il percorso più breve tra tutte le coppie di nodi nel tempo O(V^3). | |||
Trova il percorso più breve da una singola sorgente in tempo O(V * E). | |||
Algoritmo di Johnson | Trova i percorsi più brevi tra tutte le coppie di vertici nel tempo O(V^2 logV + V * E). | ||
Componenti fortemente connessi scanner scansiona java | Una componente fortemente connessa (SCC) di un grafo orientato è un insieme massimale di vertici tale che esiste un percorso da ogni vertice dell'insieme a ogni altro vertice dell'insieme. | L’algoritmo di Kosaraju è un algoritmo a due passaggi che trova in modo efficiente le componenti fortemente connesse (SCC) di un grafo orientato. | |
Algoritmo di Tarjan | L’algoritmo di Tarjan è un altro algoritmo efficiente per trovare SCC in un grafico diretto |
Argomenti correlati:
- Esercitazione sui grafici
- I 50 principali problemi di codifica dei grafici per le interviste
- Problema pratico sugli algoritmi su grafici
9 . Ricerca di modelli
Ricerca di modelli è una tecnica fondamentale nei DSA utilizzata per trovare occorrenze di un modello specifico all'interno di un dato testo.
Di seguito sono riportati alcuni algoritmi di ricerca di modelli standard:
Algoritmo | Descrizione | Complessità temporale |
---|---|---|
Forza bruta | Confronta il modello con ogni sottostringa del testo | O(mn) |
Knuth-Morris-Pratt | Utilizza una funzione di errore precalcolata per saltare confronti non necessari | O(m + n) |
Boyer-Moore | Confronta lo schema da destra a sinistra, saltando i caratteri in base all'ultima mancata corrispondenza | O(mn) |
Rabin-Karp | Utilizza l'hashing per verificare rapidamente le potenziali corrispondenze | O(m + n) |
Argomenti correlati:
- Tutorial sulla ricerca di modelli
- Problema pratico su Ricerca di modelli
10 . Algoritmi matematici
Algoritmi matematici sono una classe di algoritmi che risolvono problemi legati a concetti matematici. Sono ampiamente utilizzati in vari campi, tra cui la computer grafica, l'analisi numerica, l'ottimizzazione e la crittografia.
Algoritmo | Descrizione |
---|---|
GCD E LCM | Trova il massimo comun divisore e il minimo comune multiplo di due numeri. |
Fattorizzazione in numeri primi | Scomporre un numero nei suoi fattori primi. |
Numeri di Fibonacci | Genera la sequenza di Fibonacci, dove ogni numero è la somma dei due precedenti. |
Numeri catalani | Contare il numero di espressioni valide con un dato numero di coppie di parentesi. |
Aritmetica modulare | Eseguire operazioni aritmetiche su numeri modulo un dato valore. |
Funzione Toziente di Eulero | Contare il numero di interi positivi minori di un dato numero che sono primi rispetto ad esso. |
Calcoli nCr | Calcola il coefficiente binomiale, che rappresenta il numero di modi per scegliere r elementi da un insieme di n elementi. |
Numeri primi e test di primalità | Determina se un dato numero è primo e trova i numeri primi in modo efficiente. |
Algoritmi di setaccio | Trova tutti i numeri primi fino a un dato limite. |
Argomenti correlati:
- Problema pratico sull'algoritmo matematico
11. Algoritmi geometrici
Algoritmi geometrici sono una classe di algoritmi che risolvono problemi legati alla geometria. Gli algoritmi geometrici sono essenziali per risolvere un'ampia gamma di problemi in informatica, come ad esempio:
Algoritmo | Descrizione |
---|---|
Scafo convesso | Trova il poligono convesso più piccolo che contiene un insieme di punti. |
Coppia di punti più vicina | Trova i due punti di un insieme più vicini tra loro. |
Intersezione di linee | Determina se due linee si intersecano e, in tal caso, trova il punto di intersezione. |
Punto nel poligono | Determina se un dato punto è all'interno o all'esterno di un poligono. |
Argomenti correlati:
- Problema pratico sugli algoritmi geometrici
12. Algoritmi bit a bit
Algoritmi bit per bit sono algoritmi che operano su singoli bit di numeri. Questi algoritmi manipolano la rappresentazione binaria dei numeri per eseguire attività come la manipolazione dei bit, operazioni logiche bit per bit (AND, OR, XOR), bit di spostamento , E collocamento O cancellare bit specifici all'interno di un numero. Gli algoritmi bit a bit sono comunemente usati in attività di programmazione, crittografia e ottimizzazione di basso livello dove è richiesta una manipolazione efficiente dei singoli bit.
Argomento | Descrizione |
---|---|
Spostamento di bit | Sposta i bit a sinistra o a destra di un numero specificato di posizioni. |
Spostamento a sinistra (<<) | Sposta i bit a sinistra, moltiplicando di fatto il numero per 2. |
Spostamento a destra (>>) | Sposta i bit a destra, dividendo effettivamente il numero per 2. |
Estrai bit | Utilizzo di maschere per estrarre bit specifici da un numero intero. |
Impostazione dei bit | Utilizzo di maschere per impostare bit specifici su 1 in un numero intero. |
Bit di cancellazione | Utilizzo di maschere per impostare bit specifici su 0 in un numero intero. |
Commutazione dei bit | Utilizzo di XOR (^) per alternare bit specifici in un numero intero. |
Conteggio dei bit impostati | Conteggio del numero di bit impostati (1) in un numero intero. |
Argomenti correlati:
- Tutorial sugli algoritmi bit a bit
- Problema pratico sugli algoritmi bit a bit
13. Algoritmi randomizzati
Gli algoritmi randomizzati sono algoritmi che utilizzano la casualità per risolvere problemi. Fanno uso di input casuali per raggiungere i propri obiettivi, spesso portando a soluzioni più semplici o più efficienti.
Tipi di algoritmi randomizzati:
- Las Vegas : Produce sempre un risultato corretto, ma il tempo di esecuzione è casuale.
- Monte Carlo : può produrre un risultato errato con una piccola probabilità, ma il tempo di esecuzione è solitamente più veloce.
Algoritmi importanti che utilizzano algoritmi di randomizzazione:
Algoritmo | Descrizione |
---|---|
Ordinamento rapido | Un algoritmo di ordinamento randomizzato con una complessità temporale nel caso medio di O(n log n). |
Salta elenco | Una struttura dati randomizzata che fornisce operazioni di ricerca e inserimento veloci. |
Filtro fioritura | Una struttura dati probabilistica per test efficienti di appartenenza a un insieme. |
14. Algoritmo di branch e bound
IL Algoritmo di branch e bound è un metodo utilizzato nei problemi di ottimizzazione combinatoria per ricercare sistematicamente la soluzione migliore. Funziona dividendo il problema in sottoproblemi più piccoli, o rami, e quindi eliminando alcuni rami in base ai limiti della soluzione ottimale. Questo processo continua finché non viene trovata la soluzione migliore o finché tutti i rami non vengono esplorati.
Problemi standard sull'algoritmo Branch and Bound:
Problema unico | Descrizione |
---|---|
Zaino 0/1 usando Branch and Bound | Dettagli di implementazione dell'approccio branch and bound per risolvere il problema dello zaino 0/1. |
Zaino 0/1 che usa il ramo e il legame a costo minimo | Risolvere il problema dello zaino 0/1 utilizzando la tecnica branch and bound a costo minimo. |
8 puzzle Problema con Branch and Bound | Applicazione di branch and bound per risolvere il problema degli 8 puzzle, un popolare gioco di puzzle a scorrimento. |
N Queen Problema utilizzando Branch and Bound | Utilizzando branch and bound per trovare soluzioni al problema N Queens, un classico problema di scacchi. |
Argomenti correlati:
- Tutorial sull'algoritmo Branch and Bound
Scopri le complessità
Nelle strutture dati e algoritmi (DSA), l'obiettivo principale è risolvere i problemi in modo efficace ed efficiente. Per determinare l’efficienza di un programma, esaminiamo due tipi di complessità:
- Complessità temporale : Questo ci dice quanto tempo impiega il nostro codice per essere eseguito.
- Complessità spaziale : Questo ci dice quanta memoria utilizza il nostro codice.
Notazione asintotica :
Per confrontare l'efficienza degli algoritmi, utilizziamo la notazione asintotica, uno strumento matematico che stima tempo basato su dimensione di ingresso senza eseguire il codice. Si concentra sul numero di operazioni di base nel programma.
Notazione | Descrizione |
---|---|
O grande (Ο) | Descrive lo scenario peggiore, fornendo un limite temporale superiore dell'algoritmo. |
Omega (Ω) | Descrive lo scenario migliore, offrendo un limite temporale inferiore dell'algoritmo. |
Teta (θ) | Rappresenta la complessità media di un algoritmo di algoritmo. |
La notazione più comunemente utilizzata per l'analisi del codice è Notazione O grande , fornendo un limite superiore al tempo di esecuzione o all'utilizzo della memoria relativo alla dimensione dell'input.
Argomenti correlati:
- Comprendere la complessità temporale con semplici esempi
- Complessità temporali di diverse strutture dati
- Come analizzare i cicli per l'analisi della complessità degli algoritmi
- Domande pratiche sull'analisi della complessità temporale
Schede di riferimento per i problemi pratici:
Elenchi curati di problemi dai seguenti articoli:
- Roadmap DSA di Sandeep Jain
- SCHEDA SDE – Una guida completa per la preparazione SDE
- techcodeview.com Foglio principale: elenco di tutti i cheat sheet