logo

Leer datastructuren en algoritmen | DSA-zelfstudie

Datastructuren en algoritmen (DSA) verwijzen naar de studie van methoden voor het organiseren en opslaan van gegevens en het ontwerp van procedures (algoritmen) voor het oplossen van problemen, die op deze datastructuren werken. DSA is een van de belangrijkste vaardigheden die elke student informatica moet hebben. Vaak wordt gezien dat mensen met een goede kennis van deze technologieën betere programmeurs zijn dan anderen en dus de interviews van bijna elke technologiegigant kraken. Dit DSA-tutorial is bedoeld om u te helpen gegevensstructuren en algoritmen (DSA) snel en gemakkelijk te leren.



Inhoudsopgave

  • Leer algoritmen
  • Leer meer over complexiteiten
  • Oefen probleem-spiekbriefjes
  • DSA volledig formulier

    De term DSA staat voor Datastructuren en algoritmen , in de context van computerwetenschappen.

    Wat is DSA?

    Datastructuren en algoritmen (DSA) verwijzen naar de studie van methoden voor het organiseren en opslaan van gegevens en het ontwerp van procedures (algoritmen) voor het oplossen van problemen, die op deze datastructuren werken.



    Hoe DSA leren?

    Het eerste en belangrijkste is het verdelen van de totale procedure in kleine stukjes die opeenvolgend moeten worden uitgevoerd. Het volledige proces om DSA helemaal opnieuw te leren kan in 5 delen worden opgesplitst:

    1. Leer minstens één programmeertaal (dit laten we aan jouw keuze over.)
    2. Leer datastructuren
    3. Leer algoritmen
    4. Leer meer over de complexiteit van tijd en ruimte
    5. Oefenproblemen met DSA
    Hoe DSA leren?

    Hoe DSA leren?

    In de hoop dat je een programmeertaal naar keuze hebt geleerd, gaan we verder met de volgende stap om DSA te leren in deze DSA-tutorial.



    Hier komt de belangrijkste en meest verwachte fase van de routekaart voor het leren van de datastructuur en het algoritme: de fase waarin je begint te leren over DSA. Het onderwerp DSA bestaat uit twee delen:

    • Data structuren
    • Algoritmen

    Hoewel het twee verschillende dingen zijn, zijn ze sterk met elkaar verbonden, en het is erg belangrijk om het juiste spoor te volgen om ze zo efficiënt mogelijk te leren. Als u niet zeker weet welke u het eerst moet leren, raden we u aan onze gedetailleerde analyse over dit onderwerp door te nemen: Hier hebben we de stroom gevolgd van het leren van een datastructuur en vervolgens de meest gerelateerde en belangrijke algoritmen die door die datastructuur worden gebruikt.

    Leer datastructuren

    Data structuren zijn essentiële componenten die helpen bij het efficiënt organiseren en opslaan van gegevens in het computergeheugen. Ze bieden een manier om gegevens effectief te beheren en te manipuleren, waardoor snellere toegang, invoeging en verwijdering mogelijk zijn. Veel voorkomende datastructuren omvatten arrays, gekoppelde lijsten, stapels, wachtrijen, bomen en grafieken , die elk specifieke doeleinden dienen, gebaseerd op de vereisten van het betreffende probleem. Het begrijpen van datastructuren is van fundamenteel belang voor het ontwerpen van efficiënte algoritmen en het optimaliseren van softwareprestaties.

    Array is een lineaire datastructuur die een verzameling elementen van hetzelfde gegevenstype opslaat. Elementen krijgen aaneengesloten geheugen toegewezen, waardoor constante toegang mogelijk is. Elk element heeft een uniek indexnummer.

    • Bewerkingen op array:
      • Traversaal : Itereren door de elementen van een array.
      • Plaatsing : Een element toevoegen aan de array op een specifieke index.
      • Verwijdering : Een element uit de array verwijderen op een specifieke index.
      • Zoeken : Een element in de array zoeken op basis van zijn waarde of index.
    • Soorten arrays :
      • Eendimensionale array : Een eenvoudige array met één dimensie.
      • Multidimensionale array : Een array met meerdere dimensies, zoals een matrix.
    • Toepassingen van Array :
      • Gegevens op een sequentiële manier opslaan
      • Wachtrijen, stapels en andere datastructuren implementeren
      • Vertegenwoordigen van matrices en tabellen
    • Gerelateerde onderwerpen over Array:
      • Arrays-zelfstudie
      • Top 50 arraycoderingsproblemen voor interviews
      • Oefen problemen op arrays

    2. Snaar

    A snaar is een reeks tekens, die doorgaans wordt gebruikt om tekst weer te geven. Het wordt beschouwd als een gegevenstype dat de manipulatie en verwerking van tekstgegevens in computerprogramma's mogelijk maakt.

    • Bewerkingen op String :
      • Aaneenschakeling : Het samenvoegen van twee snaren.
      • Vergelijking : Twee strings lexicografisch vergelijken.
      • Subtekenreeks extractie : Een subtekenreeks uit een tekenreeks extraheren.
      • Zoekopdracht : zoeken naar een subtekenreeks binnen een tekenreeks.
      • Wijziging : tekens binnen een tekenreeks wijzigen of vervangen.
    • Toepassingen van String :
      • Tekstverwerking
      • Patroonaanpassing
      • Gegevensvalidatie
      • Database management
    • Gerelateerde berichten:
      • String-tutorial
      • Top 50 stringcoderingsproblemen voor interviews
      • Oefen problemen op String

    3. Gekoppelde lijsten

    A gekoppelde lijst is een lineaire datastructuur die gegevens opslaat in knooppunten, die met elkaar zijn verbonden door pointers. In tegenstelling tot arrays worden gekoppelde lijsten niet opgeslagen op aaneengesloten geheugenlocaties.

    • Kenmerken van gekoppelde lijst:
      • Dynamisch : Gekoppelde lijsten kunnen eenvoudig worden vergroot of verkleind door knooppunten toe te voegen of te verwijderen.
      • Niet-aangrenzend : Knooppunten worden opgeslagen op willekeurige geheugenlocaties en verbonden door pointers.
      • Sequentiële toegang : Knooppunten zijn alleen opeenvolgend toegankelijk, beginnend vanaf de kop van de lijst.
    • Bewerkingen op de gekoppelde lijst:
      • Creatie : Een nieuwe gekoppelde lijst maken of een nieuw knooppunt toevoegen aan een bestaande lijst.
      • Traversaal : Door de lijst bladeren en toegang krijgen tot elk knooppunt.
      • Plaatsing : Een nieuw knooppunt toevoegen op een specifieke positie in de lijst.
      • Verwijdering : Een knooppunt uit de lijst verwijderen.
      • Zoekopdracht : een knooppunt zoeken met een specifieke waarde in de lijst.
    • Soorten gekoppelde lijsten :
      • Afzonderlijk gekoppelde lijst : elk knooppunt verwijst naar het volgende knooppunt in de lijst.
      • Dubbel gekoppelde lijst : elk knooppunt verwijst naar zowel het volgende als het vorige knooppunt in de lijst.
      • Circulaire gekoppelde lijst : Het laatste knooppunt wijst terug naar het eerste knooppunt en vormt een cirkelvormige lus.
    • Toepassingen van gekoppelde lijst :
      • Gekoppelde lijsten worden in verschillende toepassingen gebruikt, waaronder:
      • Het implementeren van wachtrijen en stapels
      • Vertegenwoordigt grafieken en bomen
      • Geordende gegevens bijhouden
      • Geheugen management
    • Gerelateerde onderwerpen:
      • Gelinkte lijst-tutorial
      • Top 50 problemen op de gekoppelde lijst voor interviews
      • Oefen problemen op gekoppelde lijsten

    4. Matrix/raster

    A Matrix is een tweedimensionale reeks elementen, gerangschikt in rijen en kolommen. Het wordt weergegeven als een rechthoekig raster, waarbij elk element zich op het snijpunt van een rij en kolom bevindt.

    • Sleutelconcepten:
      • Rijen : Horizontale lijnen van elementen in een matrix.
      • Kolommen : Verticale lijnen van elementen in een matrix.
      • Dimensies : Het aantal rijen en kolommen in een matrix (een matrix van 3×4 heeft bijvoorbeeld 3 rijen en 4 kolommen).
      • Element Toegang : Elementen zijn toegankelijk via rij- en kolomindexen (M[2][3] verwijst bijvoorbeeld naar het element in rij 2, kolom 3).
    • Toepassingen van Matrix/Grid :
      • Afbeelding verwerken
      • Gegevensanalyse
      • Optimalisatieproblemen
    • Gerelateerde berichten:
      • Matrix/raster-tutorial
      • Top 50 problemen met matrix/raster voor interviews
      • Oefenproblemen op Matrix/Grid

    5. Stapel

    Stapel is een lineaire gegevensstructuur die een bepaalde volgorde volgt waarin de bewerkingen worden uitgevoerd. De volgorde kan zijn LIFO (Laatste in, eerst uit) of FILO (Eerste In Laatste Uit) . LIFO houdt in dat het element dat als laatste wordt ingevoegd, als eerste naar buiten komt en RIJ houdt in dat het element dat als eerste wordt ingevoegd, als laatste naar buiten komt.

    • Bewerking op stapel :
      • Duw : Voegt een element toe aan de bovenkant van de stapel
      • Knal : Verwijdert het element bovenaan de stapel en plaatst het terug
      • Kijkje : Geeft het element bovenaan de stapel terug zonder het te verwijderen
      • Maat : Geeft het aantal elementen in de stapel terug
      • Is leeg : Controleert of de stapel leeg is
    • Toepassingen van stapel :
      • Functieoproepen
      • Evaluatie van expressie
      • Terugkeren
      • Bewerkingen ongedaan maken/opnieuw uitvoeren
    • Gerelateerde onderwerpen op Stack:
      • Stapel-tutorial
      • Top 50 problemen op Stack voor interviews
      • Oefen problemen op Stack

    6. Wachtrij

    A Wachtrij Datastructuur is een fundamenteel concept in de computerwetenschappen dat wordt gebruikt voor het opslaan en beheren van gegevens in een specifieke volgorde. Het volgt het principe van Als eerste erin, als eerste eruit ( FIFO ), waarbij het eerste element dat aan de wachtrij wordt toegevoegd, het eerste is dat wordt verwijderd

    • Bewerking in wachtrij :
      • In de wachtrij plaatsen : Voegt een element toe aan de achterkant van de wachtrij
      • Overeenkomstig : Verwijdert een element van de voorkant van de wachtrij
      • Kijkje : Haalt het frontelement terug zonder het te verwijderen
      • Is leeg : Controleert of de wachtrij leeg is
      • Is vol : Controleert of de wachtrij vol is
    • Type wachtrij :
      • Circulaire wachtrij : Laatste element sluit aan op het eerste element
      • Dubbele wachtrij (Deque) : Bewerkingen kunnen vanaf beide kanten worden uitgevoerd
      • Prioriteits-rij : Elementen worden gerangschikt op basis van prioriteit
    • Toepassingen van wachtrij :
      • Taakplanning
      • Berichtenwachtrij
      • Simulatiemodellering
      • Gegevensbuffering
    • Gerelateerde onderwerpen:
      • Wachtrij-tutorial
      • Top 50 problemen met wachtrijen voor interviews
      • Oefen problemen in de wachtrij

    7. Hoop

    A Hoop is een volledige binaire boomdatastructuur die voldoet aan de heap-eigenschap: voor elk knooppunt is de waarde van zijn kinderen kleiner dan of gelijk aan zijn eigen waarde. Heaps worden meestal gebruikt om te implementeren wachtrijen met prioriteit , waarbij het kleinste (of grootste) element zich altijd aan de wortel van de boom bevindt.

    • Operaties van Heap :
      • Invoegen : Voegt een nieuw element toe aan de heap terwijl de heap-eigenschappen behouden blijven.
      • Extract-Max/Extract-Min : Verwijdert het rootelement en herstructureert de heap.
      • Verhogen/verlagen-toets : werkt de waarde van een knooppunt bij en herstructureert de heap.
    • Soorten hoop :
      • Max-hoop : Het hoofdknooppunt heeft de maximale waarde onder zijn onderliggende knooppunten.
      • Min-hoop : Het hoofdknooppunt heeft de minimumwaarde onder zijn onderliggende knooppunten.
    • Toepassingen van Heap :
      • Prioriteitswachtrijen
      • Sorteren
      • Grafiekalgoritmen (bijvoorbeeld het algoritme van Dijkstra)
    • Gerelateerde berichten:
      • Heap-zelfstudie
      • Top 50 problemen op Heap voor interviews
      • Oefen problemen op Heap

    8. Hasj

    Hashing is een techniek die een uitvoer van vaste grootte (hashwaarde) genereert uit een invoer van variabele grootte met behulp van wiskundige formules die worden genoemd hash-functies . Hashing wordt gebruikt om een ​​index of locatie te bepalen voor het opslaan van een item in een datastructuur, waardoor efficiënt ophalen en invoegen mogelijk is.

    • Sleutelbegrippen:
      • Hash-functie : Een wiskundige functie die een invoer toewijst aan een hashwaarde.
      • Hash-tabel : een gegevensstructuur waarin sleutel-waardeparen worden opgeslagen, waarbij de sleutel een hashwaarde is en de waarde de feitelijke gegevens.
      • Botsing : Wanneer twee verschillende sleutels dezelfde hashwaarde produceren.
    • Soorten hashfuncties :
      • Verdeelmethode : Deelt de invoer door een constante en gebruikt de rest als hashwaarde.
      • Midden Vierkant Methode: Kwadraat van de invoer en neemt de middelste cijfers als hashwaarde.
      • Vouwmethode : Verdeelt de invoer in blokken van gelijke grootte en telt deze bij elkaar op om de hashwaarde te verkrijgen.
      • Vermenigvuldigingsmethode : Vermenigvuldigt de invoer met een constante en neemt het fractionele deel als hashwaarde.
    • Technieken voor het oplossen van botsingen :
      • Afzonderlijke ketening (open hashing) : slaat botsende elementen op in een gekoppelde lijst met de overeenkomstige hashwaarde.
      • Open adressering (gesloten hashing) : Gebruikt verschillende strategieën om een ​​alternatieve locatie te vinden voor botsende elementen binnen de hashtabel.
    • Toepassingen van hashing :
      • Efficiënt opslaan en ophalen van gegevens in databases en bestandssystemen.
      • Wachtwoorden en digitale handtekeningen verifiëren.
      • Het distribueren van verzoeken over meerdere servers.
      • Veilige hashes genereren voor gegevensintegriteit en authenticatie.
    • Gerelateerde berichten:
      • Hash-tutorial
      • Oefen problemen met hashen

    9. Boom

    A boom is een niet-lineaire hiërarchische gegevensstructuur die bestaat uit knooppunten die met elkaar zijn verbonden door randen, waarbij een bovenste knooppunt de wortel wordt genoemd en knooppunten met onderliggende knooppunten. Het wordt in de informatica gebruikt om gegevens efficiënt te organiseren.

    Java bijwerken
    • Doorkruising van de boom : Boomtraversal-methoden worden gebruikt om knooppunten in een boomdatastructuur te bezoeken en te verwerken. De drie gebruikelijke traversal-methoden zijn:
      • In volgorde : Bezoek de linker subboom, het huidige knooppunt en vervolgens de rechter subboom.
      • Voorafgaande bestelling : Bezoek het huidige knooppunt, de linker subboom en vervolgens de rechter subboom.
      • Postbestelling : Bezoek de linker subboom, de rechter subboom en vervolgens het huidige knooppunt.
    • Classificaties van bomen:
      • Classificaties van Bomen verwijzen naar het groeperen van bomen op basis van bepaalde kenmerken of criteria. Dit kan inhouden dat bomen worden gecategoriseerd op basis van hun balansfactor, aantal knooppunten, ordeningseigenschappen, enz. Hieronder staan ​​enkele belangrijke classificaties van bomen.
    Classificatie Beschrijving

    Type

    Beschrijving

    Per graad

    Bomen kunnen worden geclassificeerd op basis van het maximale aantal kinderen dat elk knooppunt kan hebben.

    Binaire boom

    Elk knooppunt heeft maximaal twee kinderen.

    Ternaire boom

    Elk knooppunt heeft maximaal drie kinderen.

    N-ary Boom

    Elk knooppunt heeft maximaal N kinderen.

    Door te bestellen

    Bomen kunnen worden geclassificeerd op basis van de volgorde van knooppunten en subbomen

    Binaire zoekboom (BST)

    Linker kind

    Hoop

    Gespecialiseerde binaire boom met de heap-eigenschap.

    Door balans

    Bomen kunnen worden geclassificeerd op basis van hoe goed gebalanceerd ze zijn.

    Evenwichtige boom

    De hoogte van subbomen verschilt maximaal één. Voorbeelden hiervan zijn AVL-bomen en rood-zwarte bomen.

    Onevenwichtige boom

    De hoogte van substructuren kan aanzienlijk verschillen, wat de prestaties bij bewerkingen zoals zoeken en invoegen beïnvloedt.

    • Toepassingen van bomen:
      • Bestandssystemen
      • Databases
      • XML-documenten
      • Kunstmatige intelligentie
    • Gerelateerde berichten:
      • Boom zelfstudie
      • Top 50 problemen met boomcodering
      • Oefen problemen op Tree

    10. Grafiek

    A Grafiek is een niet-lineaire datastructuur die bestaat uit een eindige reeks hoekpunten (of knooppunten) en een reeks randen die een paar knooppunten verbinden.

    Leer algoritmen

    Zodra je de concepten van hebt gewist Data structuren , nu is het tijd om je reis door de Algoritmen . Op basis van het type aard en gebruik zijn de algoritmen gegroepeerd in verschillende categorieën, zoals hieronder weergegeven:

    1. Zoekalgoritme

    Algoritmen zoeken worden gebruikt om specifieke gegevens binnen een grotere reeks gegevens te lokaliseren. Het helpt bij het vinden van de aanwezigheid van een doelwaarde binnen de gegevens. Er zijn verschillende soorten zoekalgoritmen, elk met hun eigen aanpak en efficiëntie.

    • Meest voorkomende zoekalgoritmen:
      • Lineair zoeken : Iteratief zoeken van het ene uiteinde naar het andere.
      • Binaire zoekopdracht : Verdeel-en-heers-zoekopdracht op een gesorteerde array, waarbij de zoekruimte bij elke iteratie wordt gehalveerd.
      • Ternaire zoekopdracht : Verdeel-en-heers-zoekopdracht op een gesorteerde array, waarbij de zoekruimte bij elke iteratie in drie delen wordt verdeeld.
    • Andere zoekalgoritmen:
      • Sprong zoeken
      • Interpolatie zoeken
      • Exponentieel zoeken
    • Gerelateerde onderwerpen:
      • Oefen problemen met het zoekalgoritme

    2. Sorteeralgoritme

    Sorteeralgoritmen worden gebruikt om de elementen van een lijst in een specifieke volgorde te rangschikken, zoals numeriek of alfabetisch. Het organiseert de items op een systematische manier, waardoor het gemakkelijker wordt om naar specifieke elementen te zoeken en deze te openen.

    Er zijn veel verschillende soorten sorteeralgoritmen. Enkele veelgebruikte algoritmen zijn:

    Sorteeralgoritme Beschrijving
    Bellen sorteren Vergelijkt iteratief aangrenzende elementen en verwisselt ze als ze niet in de juiste volgorde staan. Bij elke passage komt het grootste element naar het einde van de lijst.
    Selectie Sorteren Zoekt het minimumelement in het ongesorteerde gedeelte van de lijst en verwisselt dit met het eerste element. Herhaalt dit proces totdat de hele lijst is gesorteerd.
    Invoegsortering Bouwt de gesorteerde lijst element voor element op door elk ongesorteerd element op de juiste positie in het gesorteerde gedeelte in te voegen.
    Snel sorteren Een verdeel-en-heers-algoritme dat een spilelement selecteert, de lijst in twee sublijsten verdeelt op basis van de spil, en hetzelfde proces recursief op de sublijsten toepast.
    Sortering samenvoegen Een ander verdeel-en-heers-algoritme dat de lijst recursief in kleinere sublijsten verdeelt, deze sorteert en ze vervolgens weer samenvoegt om de gesorteerde lijst te verkrijgen.

    Gerelateerde onderwerpen:

    • Sorteeralgoritme-zelfstudie
    • Topsortering van sollicitatievragen en -problemen
    • Oefen problemen met het sorteeralgoritme

    3. Verdeel en heers-algoritme

    Verdeel en heers algoritmen volgen een recursieve strategie om problemen op te lossen door ze in kleinere deelproblemen te verdelen, die deelproblemen op te lossen en de oplossingen te combineren om de uiteindelijke oplossing te verkrijgen.

    Stappen:

    1. Verdeling : Verdeel het probleem in kleinere, onafhankelijke deelproblemen.
    2. Veroveren : Los elk deelprobleem recursief op.
    3. Combineren : Voeg de oplossingen van de deelproblemen samen om de uiteindelijke oplossing te verkrijgen.

    Voorbeelden:

    • Sorteren samenvoegen: Verdeelt de array in twee helften, sorteert elke helft recursief en voegt de gesorteerde helften samen.
    • Snel sorteren: Selecteert een pivot-element, verdeelt de array in twee subarrays op basis van de pivot, en sorteert elke subarray recursief.
    • Binair zoeken: Verdeelt de zoekruimte herhaaldelijk in tweeën totdat het doelelement is gevonden of de zoekruimte is uitgeput.

    Gerelateerde artikelen:

    • Verdeel en heers-tutorial
    • Oefen problemen met het verdeel en heers-algoritme

    4. Hebzuchtige algoritmen

    Zoals de naam doet vermoeden, bouwt dit algoritme de oplossing stuk voor stuk op en kiest het volgende stuk dat het meest voor de hand liggende en onmiddellijke voordeel oplevert, d.w.z. wat op dat moment de meest optimale keuze is. Dus de problemen waarbij het kiezen van lokaal optimaal ook leidt tot mondiale oplossingen passen het beste bij Greedy.

    np waar

    Enkele belangrijke problemen van hebzuchtige algoritmen zijn:

    Algoritme Beschrijving
    Fractionele knapzak Vind de maximale totale waarde van items die in de knapzak kunnen worden geplaatst, waarbij gedeeltelijke opname van items mogelijk is.
    Het algoritme van Dijkstra Vindt het kortste pad van een bronhoekpunt naar alle andere hoekpunten in een gewogen grafiek.
    Het algoritme van Kruskal Vindt de minimaal opspannende boom van een gewogen grafiek.
    Huffman-codering Creëert een optimale prefixcode voor een set symbolen, waardoor de totale coderingslengte wordt geminimaliseerd.

    Gerelateerde artikelen:

    • Hebzuchtige algoritme-tutorial
    • Oefen problemen met het Greedy-algoritme

    5. Recursie

    Herhaling is een programmeertechniek waarbij een functie zichzelf binnen zijn eigen definitie aanroept. Het wordt meestal gebruikt om problemen op te lossen die kunnen worden opgesplitst in kleinere exemplaren van hetzelfde probleem. Bijvoorbeeld: Torens van Hanoi (TOH) , Factoriële berekening En Fibonacci-reeks enz.

    Stappen :

    • Hoofdzaak : definieer een voorwaarde die de recursieve oproepen stopt en een oplossing biedt.
    • Recursief geval : Definieer de stappen om het probleem op te splitsen in kleinere instanties en recursieve aanroepen uit te voeren.
    • Opbrengst : Retourneer de oplossing van de recursieve aanroepen en combineer ze om het oorspronkelijke probleem op te lossen.

    Het punt dat Recursie tot een van de meest gebruikte algoritmen maakt, is dat het de basis vormt voor vele andere algoritmen, zoals Boomdoorgangen , Grafiekovergangen , Verdeel en heers algoritmen En Backtracking-algoritmen .

    Gerelateerde onderwerpen:

    6. Backtracking-algoritme

    Zoals eerder vermeld, de Terugkeren Het algoritme is afgeleid van het Recursie-algoritme, met de mogelijkheid om terug te keren als een recursieve oplossing faalt, d.w.z. als een oplossing mislukt, gaat het programma terug naar het moment waarop deze faalde en bouwt voort op een andere oplossing. Dus eigenlijk probeert het alle mogelijke oplossingen uit en vindt de juiste.

    Enkele belangrijke en meest voorkomende problemen bij het backtracken van algoritmen, die u moet oplossen voordat u verder gaat, zijn:

    Probleem Beschrijving
    Riddertourprobleem Het vinden van een reeks zetten van een paard op een schaakbord, zodat het elk vakje precies één keer bezoekt.
    Rat in een doolhof Een pad vinden vanaf de startpositie naar de uitgang in een doolhof, met obstakels weergegeven als muren.
    N-Queen-probleem Het plaatsen van N koninginnen op een N×N schaakbord, zodat geen twee koninginnen elkaar aanvallen.
    Subsetsomprobleem Bepalen of er een subset van de gegeven set bestaat met een gegeven som.
    Sudoku Het oplossen van een 9×9 rasterpuzzel met getallen van 1 tot en met 9, zodat elke rij, kolom en 3×3 subraster alle cijfers bevat zonder herhaling.

    Gerelateerd artikel:

    • Backtracking-tutorial
    • Oefen problemen met het Backtracking-algoritme

    7. Dynamisch programmeren

    Dynamisch programmeren is een methode die in de wiskunde en informatica wordt gebruikt om complexe problemen op te lossen door ze op te splitsen in eenvoudiger deelproblemen. Door elk deelprobleem slechts één keer op te lossen en de resultaten op te slaan, worden overbodige berekeningen vermeden, wat leidt tot efficiëntere oplossingen voor een breed scala aan problemen.

    Sleutelconcepten:

    • Optimale onderbouw : De optimale oplossing voor een probleem kan worden opgebouwd uit de optimale oplossingen voor de deelproblemen ervan.
    • Overlappende deelproblemen : Subproblemen worden vaak herhaald in het grotere probleem, wat leidt tot redundante berekeningen.
    • Memoriseren / Tabel : Het opslaan van de oplossingen voor subproblemen om herberekening te voorkomen.

    Enkele belangrijke en meest voorkomende problemen van dynamische programmeeralgoritmen, die u moet oplossen voordat u verder gaat, zijn:

    Probleem Beschrijving
    Fibonacci-reeks Genereren van Fibonacci-getallen met behulp van dynamisch programmeren om overbodige berekeningen te voorkomen.
    Langste gemeenschappelijke vervolgreeks Het vinden van de langste deelreeks die twee reeksen gemeen hebben.
    Langste stijgende vervolgreeks Het vinden van de langste deelreeks van een gegeven reeks waarin de elementen in oplopende volgorde zijn gesorteerd.
    0/1 Knapzakprobleem Het bepalen van de maximale waarde die kan worden verkregen door items met bepaalde gewichten en waarden te selecteren, terwijl een gespecificeerde gewichtslimiet niet wordt overschreden.
    Probleem met staafsnijden Maximaliseren van de winst door een staaf van een bepaalde lengte in stukken te snijden en deze tegen een bepaalde prijs te verkopen.
    Probleem met het wisselen van munten Het bepalen van het aantal manieren om wisselgeld te geven voor een bepaald bedrag met behulp van een gegeven set muntdenominaties.
    Afstand bewerken Het vinden van het minimumaantal bewerkingen (invoegen, verwijderen, vervangen) dat nodig is om de ene tekenreeks in de andere om te zetten.
    Subsetsomprobleem Bepalen of er een deelverzameling van een bepaalde verzameling bestaat met een bepaalde som.
    Langste palindrome vervolgreeks Het vinden van de langste deelreeks van een bepaalde reeks die een palindroom is.
    Maximale subarraysom Het vinden van de aangrenzende subarray met de grootste som binnen een gegeven eendimensionale array.
    Partitie Gelijke Subset Som Bepalen of het mogelijk is een gegeven verzameling in twee deelverzamelingen met gelijke som te verdelen.
    Minimale kostenpad Het vinden van het minimale kostenpad van de linkerbovenhoek naar de rechterbenedenhoek van een bepaald raster.
    Maximale productsubarray Het vinden van de aaneengesloten subarray met het grootste product binnen een gegeven eendimensionale array.

    Gerelateerde artikelen:

    • Tabelleren versus memoriseren
    • Hoe los ik een dynamisch programmeerprobleem op?
    • Dynamische programmeerhandleiding
    • Top 50 dynamische programmeercoderingsproblemen voor interviews
    • Oefen problemen met het dynamische programmeeralgoritme

    8. Grafiekalgoritmen :

    Grafiekalgoritmen in datastructuren en algoritmen (DSA) is een reeks technieken en methoden die worden gebruikt om problemen op te lossen die verband houden met grafieken, die een verzameling knooppunten en randen zijn. Deze algoritmen zijn ontworpen om verschillende bewerkingen op grafieken uit te voeren, zoals zoeken, doorkruisen, het kortste pad vinden , en bepalen connectiviteit . Ze zijn essentieel voor het oplossen van een breed scala aan problemen in de echte wereld, waaronder netwerkroutering, analyse van sociale netwerken en toewijzing van middelen.

    Onderwerp

    Onderwerpbeschrijving

    Algoritme Beschrijving van het algoritme
    Grafiek Traversal

    Technieken voor het bezoeken van alle hoekpunten in een grafiek.

    Diepte-eerst zoeken (DFS) Verkent zo ver mogelijk langs elke tak voordat hij terugkeert.
    Breedte-eerst zoeken (BFS) Onderzoekt aangrenzende hoekpunten voordat hij naar het volgende niveau van hoekpunten gaat.

    Minimale overspanning van bomen

    Minimum Spanning Trees zijn de kleinste bomen die alle knooppunten in een grafiek met elkaar verbinden zonder cycli te vormen, bereikt door het toevoegen van de kortst mogelijke randen.

    Het algoritme van Kruskal

    Er wordt een minimale opspannende boom gevonden voor een verbonden gewogen grafiek. Het voegt de kleinste gewichtsrand toe die geen cyclus vormt.

    Het algoritme van Prim

    Er wordt ook een minimale opspannende boom gevonden voor een verbonden gewogen grafiek. Het voegt de kleinste gewichtsrand toe die twee bomen met elkaar verbindt.

    Topologische sortering

    Topologische sortering is een lineaire ordening van de hoekpunten in een gerichte acyclische grafiek (DAG), zodat voor elke gerichte rand van hoekpunt u tot hoekpunt v, u vóór v komt in de volgorde.

    Het algoritme van Kahn Het algoritme van Kahn vindt een topologische ordening van een gerichte acyclische grafiek (DAG).
    Op DFS gebaseerd algoritme Op DFS gebaseerd algoritme gebruikt Depth-First Search om topologische sortering uit te voeren in een gerichte acyclische grafiek (DAG).

    Kortste weg

    Een kortste pad in een grafiek is het pad tussen twee hoekpunten in een grafiek dat de minimale som van de gewichten langs de randen heeft vergeleken met alle andere paden tussen dezelfde twee hoekpunten.

    Het algoritme van Dijkstra

    Hebzuchtig algoritme om het kortste pad tussen alle knooppunten in O(E * V logV) tijd te vinden.

    Floyd-Warshall-algoritme

    Vindt het kortste pad tussen alle paren knooppunten in O(V^3) tijd.

    Bellman Ford-algoritme

    Vindt het kortste pad vanuit één bron in O(V * E) tijd.

    Johnson-algoritme

    Vindt de kortste paden tussen alle paren hoekpunten in O(V^2 logV + V * E) tijd.

    Sterk verbonden componenten

    Een sterk verbonden component (SCC) van een gerichte graaf is een maximale set hoekpunten, zodat er een pad is van elk hoekpunt in de set naar elk ander hoekpunt in de set.

    Het algoritme van Kosaraju

    Het algoritme van Kosaraju is een algoritme met twee doorgangen dat efficiënt de sterk verbonden componenten (SCC's) van een gerichte graaf vindt.

    Het algoritme van Tarjan

    Het algoritme van Tarjan is een ander efficiënt algoritme voor het vinden van SCC's in een gerichte grafiek

    Gerelateerde onderwerpen:

    • Grafiek-zelfstudie
    • Top 50 problemen met grafiekcodering voor interviews
    • Oefenprobleem met grafiekalgoritmen

    9 . Patroon zoeken

    Patroon zoeken is een fundamentele techniek in DSA die wordt gebruikt om het voorkomen van een specifiek patroon binnen een bepaalde tekst te vinden.

    Hieronder staan ​​enkele standaard algoritmen voor het zoeken naar patronen:

    Algoritme Beschrijving Tijdcomplexiteit
    Brute kracht Het vergelijkt het patroon met elke subtekenreeks van de tekst O(mn)
    Knuth-Morris-Pratt Het maakt gebruik van een vooraf berekende foutfunctie om onnodige vergelijkingen over te slaan O(m + n)
    Boyer-Moore Het vergelijkt het patroon van rechts naar links, waarbij tekens worden overgeslagen op basis van de laatste mismatch O(mn)
    Rabin-Karp Het maakt gebruik van hashing om snel te controleren op mogelijke overeenkomsten O(m + n)

    Gerelateerde onderwerpen:

    • Handleiding voor het zoeken naar patronen
    • Oefenprobleem aan Patroon zoeken

    10 . Wiskundige algoritmen

    Wiskundige algoritmen zijn een klasse algoritmen die problemen oplossen die verband houden met wiskundige concepten. Ze worden veel gebruikt op verschillende gebieden, waaronder computergraphics, numerieke analyse, optimalisatie en cryptografie.

    Algoritme Beschrijving
    GCD En LCM Zoek de grootste gemene deler en het kleinste gemene veelvoud van twee getallen.
    Ontbinding in priemfactoren Ontleed een getal in zijn priemfactoren.
    Fibonacci-getallen Genereer de Fibonacci-reeks, waarbij elk getal de som is van de twee voorgaande.
    Catalaanse cijfers Tel het aantal geldige uitdrukkingen met een bepaald aantal paren haakjes.
    Modulaire rekenkunde Voer rekenkundige bewerkingen uit op getallen modulo een bepaalde waarde.
    Euler Totient-functie Tel het aantal positieve gehele getallen kleiner dan een bepaald getal die er relatief priem voor zijn.
    nCr-berekeningen Bereken de binominale coëfficiënt, die het aantal manieren vertegenwoordigt om r elementen te kiezen uit een reeks van n elementen.
    Priemgetallen en priemgetallentests Bepaal of een bepaald getal een priemgetal is en vind op efficiënte wijze priemgetallen.
    Zeef algoritmen Vind alle priemgetallen tot een bepaalde limiet.

    Gerelateerde onderwerpen:

    • Oefenprobleem met wiskundig algoritme

    11. Geometrische algoritmen

    Geometrische algoritmen zijn een klasse algoritmen die problemen met betrekking tot geometrie oplossen. Geometrische algoritmen zijn essentieel voor het oplossen van een breed scala aan problemen in de informatica, zoals:

    Algoritme Beschrijving
    Bolle romp Vindt de kleinste convexe veelhoek die een reeks punten bevat.
    Dichtstbijzijnde paar punten Vindt de twee punten in een set die het dichtst bij elkaar liggen.
    Lijn kruispunt Bepaalt of twee lijnen elkaar snijden en, zo ja, vindt het snijpunt.
    Punt in veelhoek Bepaalt of een bepaald punt zich binnen of buiten een veelhoek bevindt.

    Gerelateerde onderwerpen:

    • Oefenprobleem met geometrische algoritmen

    12. Bitsgewijze algoritmen

    Bitsgewijze algoritmen zijn algoritmen die op individuele bits van getallen werken. Deze algoritmen manipuleren de binaire representatie van getallen om taken uit te voeren zoals bitmanipulatie, bitsgewijze logische bewerkingen (AND, OR, XOR), bitjes verschuiven , En instelling of specifieke bits wissen binnen een getal. Bitwise-algoritmen worden vaak gebruikt in programmeer-, cryptografie- en optimalisatietaken op laag niveau waar efficiënte manipulatie van individuele bits vereist is.

    Onderwerp Beschrijving
    Beetje verschuiven Verschuift bits naar links of rechts met een opgegeven aantal posities.
    Links verschuiven (<<) Verschuift bits naar links, waardoor het getal effectief met 2 wordt vermenigvuldigd.
    Rechterverschuiving (>>) Verschuift bits naar rechts, waardoor het getal feitelijk door 2 wordt gedeeld.
    Stukjes extraheren Maskers gebruiken om specifieke bits uit een geheel getal te extraheren.
    Bits instellen Maskers gebruiken om specifieke bits op 1 in een geheel getal in te stellen.
    Beetjes opruimen Maskers gebruiken om specifieke bits in een geheel getal op 0 te zetten.
    Bits wisselen XOR (^) gebruiken om specifieke bits in een geheel getal te schakelen.
    Tellen Stel bits in Het tellen van het aantal ingestelde bits (1s) in een geheel getal.

    Gerelateerde onderwerpen:

    • Bitwise algoritmen-tutorial
    • Oefenprobleem met bitsgewijze algoritmen

    13. Gerandomiseerde algoritmen

    Gerandomiseerde algoritmen zijn algoritmen die willekeur gebruiken om problemen op te lossen. Ze maken gebruik van willekeurige input om hun doelen te bereiken, wat vaak leidt tot eenvoudigere of efficiëntere oplossingen.

    wat is directoryverzending

    Soorten gerandomiseerde algoritmen:

    • Las Vegas : Geeft altijd een correct resultaat, maar de looptijd is willekeurig.
    • Monte Carlo : Kan met een kleine waarschijnlijkheid een onjuist resultaat opleveren, maar de looptijd is meestal sneller.

    Belangrijke algoritmen die gebruik maken van randomisatie-algoritmen:

    Algoritme Beschrijving
    Snel sorteren Een gerandomiseerd sorteeralgoritme met een gemiddelde tijdscomplexiteit van O(n log n).
    Lijst overslaan Een gerandomiseerde gegevensstructuur die snelle zoek- en invoegbewerkingen mogelijk maakt.
    Bloeifilter Een probabilistische datastructuur voor het efficiënt testen van setlidmaatschappen.

    14. Vertakkings- en gebonden algoritme

    De Tak- en gebonden algoritme is een methode die wordt gebruikt bij combinatorische optimalisatieproblemen om systematisch naar de beste oplossing te zoeken. Het werkt door het probleem op te delen in kleinere deelproblemen, of vertakkingen, en vervolgens bepaalde vertakkingen te elimineren op basis van de grenzen van de optimale oplossing. Dit proces gaat door totdat de beste oplossing is gevonden of alle branches zijn verkend.

    Standaardproblemen met vertakkings- en gebonden algoritmen:

    Uniek probleem Beschrijving
    0/1 Knapzak met Branch and Bound Implementatiedetails van de branch and bound-aanpak voor het oplossen van het 0/1 Knapzakprobleem.
    0/1 Knapzak met Least Cost Branch en Bound Het 0/1 Knapzakprobleem oplossen met behulp van de goedkoopste branch-and-bound-techniek.
    8 puzzelproblemen met Branch and Bound Toepassing van vertakking en gebonden aan het oplossen van het 8-puzzelprobleem, een populair schuifpuzzelspel.
    N Queen Probleem met Branch en Bound Gebruik makend van branch en op zoek naar oplossingen voor het N Queens-probleem, een klassiek schaakprobleem.

    Gerelateerde onderwerpen:

    • Tutorial voor vertakkingen en gebonden algoritmen

    Leer meer over complexiteiten

    Bij Data Structures and Algorithms (DSA) is het hoofddoel het effectief en efficiënt oplossen van problemen. Om de efficiëntie van een programma te bepalen, kijken we naar twee soorten complexiteiten:

    1. Tijdcomplexiteit : Dit vertelt ons hoeveel tijd het kost om onze code uit te voeren.
    2. Ruimtecomplexiteit : Dit vertelt ons hoeveel geheugen onze code gebruikt.

    Asymptotische notatie :

    Om de efficiëntie van algoritmen te vergelijken, gebruiken we asymptotische notatie, een wiskundig hulpmiddel dat schat tijd gebaseerd op invoergrootte zonder de code uit te voeren. Het richt zich op het aantal basisbewerkingen in het programma.

    Notatie Beschrijving
    Grote O (Ο) Beschrijft het worstcasescenario en biedt een maximale tijdslimiet voor het algoritme.
    Omega-waarde (Ω) Beschrijft het best-case scenario en biedt een lagere tijdslimiet voor het algoritme.
    Theta (θ) Vertegenwoordigt de gemiddelde complexiteit van een algoritme of algoritme.

    De meest gebruikte notatie voor codeanalyse is Big O-notatie , wat een bovengrens biedt voor de looptijd of het geheugengebruik met betrekking tot de invoergrootte.

    Gerelateerde onderwerpen:

    Oefen probleem-spiekbriefjes:

    Samengestelde lijsten met problemen uit onderstaande artikelen:

    • DSA-routekaart door Sandeep Jain
    • SDE SHEET – Een complete gids voor SDE-voorbereiding
    • techcodeview.com Master Sheet - Lijst met alle Cheat Sheets