Een algoritme is een reeks instructies die in een vooraf bepaalde volgorde worden uitgevoerd om een probleem op te lossen of een werk te voltooien. Een functie is een codeblok dat vanuit andere delen van het programma kan worden aangeroepen en uitgevoerd.
Een reeks instructies voor het oplossen van een probleem of het uitvoeren van een bepaalde activiteit. In de informatica worden algoritmen gebruikt voor een breed scala aan bewerkingen, van fundamentele wiskunde tot ingewikkelde gegevensverwerking.
Een van de veelgebruikte algoritmen in C is het sorteeralgoritme. Een sorteeralgoritme rangschikt een verzameling items in een bepaalde volgorde, bijvoorbeeld numeriek of alfabetisch.
Er zijn veel sorteeralgoritmen, elk met voor- en nadelen. De meest voorkomende sorteeralgoritmen in C zijn quicksort, merge en sort.
Een van de belangrijkste kenmerken van C is pointer-ondersteuning. Dit maakt efficiënte manipulatie van datastructuren zoals arrays, wachtrijen enz. mogelijk. Dit maakt het geschikt voor het implementeren van algoritmen die complexe datamanipulatie vereisen, zoals sorteren en algoritmisch zoeken.
Een van de bekende voorbeelden van een softwarebibliotheek die in C is geïmplementeerd, is de Standard Template Library (STL). Deze bibliotheek biedt een grote verscheidenheid aan algoritmen voor taken zoals het sorteren, zoeken en manipuleren van datastructuren.
Kenmerken van het algoritme
Het definieert verschillende belangrijke kenmerken van het algoritme, waaronder:
Algoritmeanalyse
Algoritmische analyse is het proces waarbij de prestaties van algoritmen worden geëvalueerd in termen van efficiëntie, complexiteit en andere criteria. Meestal wordt dit gedaan om veel algoritmen te evalueren en de optimale oplossing voor een bepaald probleem of software te selecteren.
Bij analyse van algoritmen wordt meestal de tijd- en ruimtecomplexiteit ervan gemeten.
Net als bij ruimtecomplexiteit, die de hoeveelheid geheugen of schijfruimte beschrijft die nodig is, beschrijft tijdcomplexiteit hoe lang een algoritme besluit een taak uit te voeren.
Er zijn verschillende manieren om de tijdscomplexiteit van algoritmen te analyseren, zoals de Big O- en Omega-notatie. Het Omega-symbool geeft een bovengrens aan voor de tijdscomplexiteit van het algoritme, terwijl het Omega-symbool een ondergrens geeft.
Naast het meten van tijd- en ruimtecomplexiteit omvat algoritmeanalyse ook andere criteria zoals stabiliteit, parallellisme en schaalbaarheid.
Ze omvatten twee soorten analyses.
zij zijn:-
- Voorafgaande analyse.
- Achterste analyse.
Voorafgaande analyse
wat betekent dit xd
Prior is een methode voor algoritmeanalyse die zich richt op het schatten van de prestaties van een algoritme op basis van zijn wiskundige eigenschappen, zonder het algoritme daadwerkelijk uit te voeren.
Met deze aanpak kunt u de tijd- en ruimtecomplexiteit van algoritmen en andere statistieken analyseren zonder dat u de algoritmen hoeft te implementeren en uit te voeren.
Achterste analyse
Posterieure analyse daarentegen is een methode voor algoritmeanalyse die het algoritme daadwerkelijk uitvoert en de prestaties ervan meet.
Deze aanpak biedt nauwkeurigere en gedetailleerdere informatie over de prestaties van het algoritme, maar vereist de implementatie en uitvoering van het algoritme.
Complexiteit van algoritmen
Algoritmische complexiteit is een maatstaf om de efficiëntie en prestaties van het algoritme te meten. Algoritmen worden doorgaans geëvalueerd in termen van de tijd en ruimte die nodig zijn om een probleem op te lossen of een specifiek doel te bereiken.
Er worden twee factoren gebruikt bij de complexiteit van het algoritme.
zij zijn:-
- Tijdfactor.
- Ruimtefactor.
Tijdfactor
- De hoeveelheid tijd die een algoritme nodig heeft om een taak uit te voeren, wordt tijdscomplexiteit genoemd. Deze wordt meestal gemeten aan de hand van het aantal bewerkingen of stappen dat een algoritme moet uitvoeren om een probleem op te lossen.
- De tijdscomplexiteit van een algoritme is belangrijk omdat het bepaalt hoe lang het duurt om uit te voeren en een aanzienlijke impact kan hebben op de programma- en systeemprestaties.
- De tijdscomplexiteit van een algoritme kan worden uitgedrukt met behulp van de Big O-notatie, een manier om een bovengrens voor de tijdscomplexiteit van een algoritme uit te drukken.
- Een algoritme met tijdscomplexiteit O(n) betekent dat de tijd die nodig is om het algoritme uit te voeren direct evenredig is met de grootte van de invoergegevens (n).
- Andere veel voorkomende tijdscomplexiteiten zijn O(n^2) kwadratische complexiteit en O(log n) logaritmische complexiteit.
Ruimteanalyse
- Aan de andere kant verwijst ruimtecomplexiteit naar de hoeveelheid geheugen of opslagruimte die nodig is om het algoritme uit te voeren.
- Dit is belangrijk omdat het het aantal bronnen bepaalt dat nodig is om algoritmen uit te voeren die de algehele prestaties van uw applicatie of systeem kunnen beïnvloeden.
- Als de ruimtecomplexiteit van het algoritme O(n) is, gebruikt het een hoeveelheid geheugen die lineair groeit met de grootte van de invoer.
- Als het algoritme O(1)-ruimtecomplexiteit heeft, gebruikt het een vaste hoeveelheid geheugen, ongeacht de grootte van de invoer.
Hoe een algoritme te schrijven
1. Definieer eerst het probleem dat u door het algoritme wilt laten oplossen.
Stel dat we bijvoorbeeld een algoritme willen schrijven om de maximale waarde uit een lijst met getallen te vinden.
2. Deel het probleem op in kleinere, beheersbare stappen.
- Initialiseer de variabele 'max' naar de eerste waarde in de lijst.
- Vergelijk voor elke volgende waarde in de lijst met 'max'.
- Als de waarde groter is dan 'max', stelt u 'max' in op die waarde.
- Blijf dit doen totdat elke waarde in de lijst is vergeleken.
- Retourneert de uiteindelijke 'max'-waarde.
3. Schrijf uw algoritme in pseudocode of een programmeertaal.
Algoritme geschreven in pseudocode:
MAX (list) max = list[0] For i = 1 the length of the list list IF[i] > max max = list[i] End for Maximum return Maximum end
4. Test uw algoritme om er zeker van te zijn dat het correct en efficiënt is.
U kunt het algoritme testen door verschillende lijsten met getallen in te voeren en te controleren of het de maximale correcte waarde retourneert. U kunt ook de tijdscomplexiteit van uw algoritme analyseren om te bepalen hoe goed het kan worden geschaald voor grotere invoer.
Voorbeeld:-
converteren van char naar int java
Invoer: [1, 5, 2, 7, 3]
Uitgang: 7.
Uitleg: 7 is de maximale waarde in de lijst.
5. Optimaliseer het algoritme.
Zoek naar manieren om algoritmen te optimaliseren, zodat ze sneller en efficiënter worden. Dit kan het wijzigen van pseudocode inhouden of het implementeren van efficiëntere datastructuren of algoritmen.
Basisschrijven van algoritmen
Voorbeeld: - De som van twee gehele getallen.
Stap 1 - Begin
Stap 2 - Verklaar drie gehele getallen a, b, c
Stap 3 - Definieer de waarden van a en b
Stap 4 - Voeg de waarden van a en b toe
Stap 5 - Bewaar de uitvoer van stap 4 in c
Stap 6 - Afdrukken c
Stap 7 - Stop
Type algoritmen gebruikt in C-taal.
1. Sorteeralgoritmen
C biedt een rijke set gegevenstypen en operatoren die kunnen worden gebruikt om verschillende sorteeralgoritmen te implementeren, zoals bellensortering, invoegsortering en snelle sortering.
Deze algoritmen zijn nuttig in veel toepassingen omdat ze kunnen worden gebruikt om gegevens van verschillende groottes en typen te sorteren.
Er zijn verschillende sorteeralgoritmen.
zij zijn:-
(i) Bellensoort: Een ongecompliceerd sorteeralgoritme dat componenten in de buurt herhaaldelijk vergelijkt en deze uitschakelt als ze niet in orde zijn.
Het algoritme voor het sorteren van bellen is: -
- Begin met een ongesorteerde lijst met elementen.
- Vergelijk de eerste twee elementen in de lijst. Als het eerste element groter is dan het tweede element, verwissel ze dan.
- Ga verder met het volgende paar elementen en herhaal stap 2 totdat het einde van de lijst is bereikt.
- Herhaal voor elk item op de lijst stap 2 en 3 nog een keer. dat worden pasjes genoemd.
- Herhaal stap 2-4 voor de hele lijst. Terwijl u de passen herhaalt, 'borrelen' de elementen naar de juiste positie in de gesorteerde lijst.
- Zodra een pass is voltooid en er geen swaps zijn uitgevoerd, wordt de lijst gesorteerd en kan het algoritme stoppen.
- De uiteindelijk gesorteerde lijst wordt geretourneerd.
(ii) Invoegsoort : een sorteermethode die een gesorteerde lijst creëert, met één individueel element tegelijk, door elk element op de juiste plek te plaatsen.
Het algoritme voor het sorteren van invoegingen is: -
- Initialiseer een lege gesorteerde lijst en een ongesorteerde lijst van de te sorteren elementen.
- Het eerste lid uit de ongesorteerde lijst moet worden genomen en op de juiste positie in de gesorteerde lijst worden geplaatst.
- Herhaal stap 2 voor elk volgend element in de ongesorteerde lijst.
- Vergelijk het huidige element met de elementen in de gesorteerde lijst, te beginnen met het element direct links.
- Verwissel de twee elementen als het huidige element kleiner is dan het element links ervan.
- Als het huidige element groter is dan het element links ervan, plaatst u het op de juiste positie in de gesorteerde lijst.
- Herhaal stap 4-6 voor elk volgend element in de ongesorteerde lijst.
- Zodra alle elementen zijn verwerkt, bevat de gesorteerde lijst alle elementen in de juiste volgorde.
- Het sorteerproces is voltooid.
(iii) Selectie sorteren : een sorteermethode waarbij de gesorteerde lijst consistent wordt gestart met het kleinste detail van de ongeordende lijst.
Het algoritme voor selectiesortering is: -
- Begin met het instellen van het primaire element van de lijst als het min-element.
- Herhaal dit voor de resterende items in de lijst en vergelijk ze allemaal met het huidige minimum.
- Stel een nieuw minimum in als blijkt dat een element kleiner is dan het bestaande.
- Wijzig het huidige minimum in het eerste element van de lijst wanneer de conclusie wordt bereikt.
- Voor het resterende ongesorteerde deel van de lijst herhaalt u stap 2-4, maar begint u met het tweede item in de lijst (aangezien het eerste element al is gesorteerd).
- Ga door met het sorteren van de lijst op deze manier totdat alles gesorteerd is.
(iv) Snel sorteren : Een verdeel-en-heers-sorteeralgoritme dat een spilelement kiest en de lijst opsplitst in sublijsten, afhankelijk van of de elementen minder of meer zijn dan het spilelement. Daarna worden de sublijsten herhaaldelijk gesorteerd totdat de volledige lijst is gesorteerd.
Het algoritme voor snel sorteren is: -
- Kies een draaielement uit de lijst. Dit is doorgaans het eerste element, maar het kan ook een willekeurig element of de mediaan van de lijst zijn.
- Verdeel de lijst in twee sublijsten: één met elementen die kleiner zijn dan de spil en één met elementen die groter zijn dan de spil.
- Sorteer recursief de sublijst die elementen bevat die kleiner zijn dan de spil, met hetzelfde proces.
- Gebruik dezelfde procedure om de sublijst met items die groter zijn dan het draaipunt recursief te sorteren.
- Voeg de gesorteerde sublijsten samen met het draaielement ertussen om een volledig gesorteerde lijst te vormen.
- Retourneer de volledig gesorteerde lijst.
(v) Lot gaat : Het verdeel-en-heers-sorteeralgoritme verdeelt de lijst in twee helften, sorteert elke helft en voegt vervolgens de twee helften in gesorteerde volgorde samen.
Algoritme voor samenvoegen en sorteren:
- Maak twee sublijsten uit de lijst: één met elementen onder het draaipunt en één met elementen boven het draaipunt.
- Produceert een nieuwe gesorteerde sublijst door sublijsten iteratief samen te voegen totdat er nog maar één sublijst bestaat. Dit wordt je gesorteerde lijst.
- Stappen om twee submappen samen te voegen: -
- Maak een lege lijst met de gesorteerde elementen.
- Vergelijkt het eerste element van elke sublijst.
- Voegt het kleinere element toe aan de nieuwe lijst en verwijdert het uit de bovenliggende sublijst.
- Herhaal stap 2 en 3 totdat een lijst helemaal leeg is.
- Voegt de resterende elementen uit andere sublijsten toe aan een nieuwe lijst.
- Vervangt de samengevoegde sublijst door de nieuwe gesorteerde lijst.
- Herhaal dit proces totdat alle sublijsten zijn samengevoegd tot één gesorteerde lijst.
(vi) Heap-sortering : Een sorteeralgoritme dat elementen sorteert met behulp van een gegevensstructuur die heap wordt genoemd.
Dit is het classificatie-algoritme:
- Stapel de rest van de elementen. Beginnend bij de root wordt elk knooppunt vergeleken met zijn onderliggende knooppunten, waarbij knooppunten worden verwisseld met hun oudere kinderen totdat aan de eigenschap max heap is voldaan.
- Herhaal stap 2 en 3 met de nieuw gestapelde elementen, behalve het laatste element op de juiste positie.
- Herhaal dit proces totdat er nog maar één element in de stapel overblijft. Dit is nu gesorteerd.
(vii) Radix-sortering : een sorteeralgoritme dat elementen sorteert op basis van de cijfers of cijfers van hun binaire representatie.
Het algoritme voor Radix-sortering is: -
Linux$home
- bepaal hoeveel cijfers het grootste element van de invoerlijst bevat.
- Initialiseer een variabele, bijvoorbeeld een cijferplaats, naar 1, wat de huidige cijferplaats vertegenwoordigt.
- Maak een lege lijst voor elke mogelijke cijferwaarde van 0 tot 9.
- Doorloop de invoerlijst en voeg elk element toe aan de juiste lijst op basis van de waarde van de huidige cijferplaats.
- Voeg alle lijsten samen om de nieuwe lijst te vormen in de volgorde van de cijferlijsten.
- Vermenigvuldig digitPlace met 10 om naar de volgende cijferplaats te gaan.
- Herhaal stap 4-6 voor elke cijferplaats totdat alle cijfers in het grootste element in aanmerking zijn genomen.
- De definitieve lijst wordt in oplopende volgorde gesorteerd op basis van de cijfers van de elementen.
- Retourneert de uiteindelijk gesorteerde lijst.
2. Zoekalgoritmen
C biedt ook de tools die nodig zijn om een verscheidenheid aan zoekalgoritmen te implementeren, zoals lineair zoeken en binair zoeken. Deze algoritmen kunnen snel specifieke items in een dataset vinden, waardoor ze bruikbaar zijn voor een breed scala aan toepassingen.
Er zijn veel soorten zoekalgoritmen.
Zij zijn:-
(i) Lineair zoeken : een basiszoekalgoritme dat elk item in de aanbieding één voor één onderzoekt totdat het gewenste item wordt gevonden.
Algoritme voor lineair zoeken: -
- Definieer de invoer voor het algoritme: De invoer voor een lineair zoekalgoritme is een lijst met elementen (of een array) en een doelelement waarnaar we zoeken.
- Initialiseer een variabele met de naam 'index' op -1: deze variabele wordt gebruikt om de index van het doelelement op te slaan als deze wordt gevonden.
- Loop door de lijst met elementen: Begin bij het eerste element en controleer elk element in de lijst één voor één.
- Vergelijk het huidige element met het gewenste element voor evaluatie: Bewaar de index van het huidige element in de indexvariabele en verlaat de lus als het moderne element en het doelelement identiek zijn.
- Retourneer de index van het doelelement: Nadat de lus is voltooid, retourneert u de waarde die is opgeslagen in de indexvariabele. Als het doelelement niet wordt gevonden, is de waarde van de index -1.
(ii) Binair zoeken : Een zoekalgoritme dat werkt door de vermelding in helften te splitsen en binnen deze helften te zoeken, zal het element waarschijnlijk eerder bevatten.
Algoritme voor binair zoeken: -
- Invoer: een gesorteerde lijst van n elementen en een doelelement x.
- Variabelen initialiseren: Stel de lage index in op 0, de hoge index op n-1 en midden op (laag+hoog)/2.
- Start een lus: Terwijl de lage index kleiner is dan of gelijk is aan de hoge index, herhaalt u de volgende stappen.
- Vergelijk het middenelement met x: Als het middenelement gelijk is aan x, retourneert u de middenindex.
- Update de lage of hoge index: Als x groter is dan het middelste element, stel dan de lage index in op midden + 1. Anders stelt u de hoge index in op midden - 1.
- Update de middenindex: Midden = (laag+hoog)/2.
- Einde van de lus: Als de lage index groter is dan de hoge index, staat x niet in de lijst en retourneert het algoritme een fout.
- Uitvoer: de index van x in de lijst of het foutbericht.
(iii) Diepte-eerst zoeken : Een zoekalgoritme dat elke tak zo ver mogelijk onderzoekt voordat hij zich omdraait.
De volgende richtlijnen zijn van toepassing op diepte-eerst zoeken:
- selecteer het startpunt of -knooppunt van de grafiek om mee te beginnen.
- Voeg een bezoekmarkering toe aan het eerste hoekpunt.
- Plaats het beginpunt direct in een stapel.
- Herhaal de volgende acties totdat de stapel leeg is: -
- Verwijder het bovenste hoekpunt van de stapel.
- Markeer als bezocht en plaats elke niet-bezochte buur van het uitgevallen hoekpunt in de stapel.
- Ga door met dit proces totdat alle hoekpunten in de grafiek zijn bezocht.
- Zodra alle hoekpunten zijn bezocht, is het algoritme voltooid en wordt er eerst op de diepte gezocht in de grafiek.
(iv) Zoeken in de breedte : een zoekalgoritme dat alle buren van een knooppunt verkent voordat het naar het volgende niveau gaat.
Het algoritme voor de breedte-eerst-zoekopdracht is: -
- Begin met het hoofdknooppunt of de beginstatus.
- Voeg het hoofdknooppunt toe aan een wachtrij.
- Controleer of de wachtrij leeg is; Zo ja, beëindig dan het algoritme.
- Neem het eerste element uit de wachtrij en markeer het als bezocht.
- Versterk het hedendaagse knooppunt door alle niet-bezochte buren aan de wachtrij toe te voegen.
- Herhaal stap 3 tot en met 5 totdat het gewenste knooppunt is gevonden of de wachtrij leeg is.
- Retourneer het pad van de voorlopige status naar de doelstatus als het doelknooppunt wordt gevonden.
- Beëindig de set regels en rapporteer dat de doelstatus niet is geïdentificeerd als de wachtrij leeg is.
(v) Zoeken op interpolatie : een zoekalgoritme dat de waarden van de gezochte elementen gebruikt om de positie in de index te schatten.
datalinklaagprotocollen
Het is belangrijk dat de array gelijkmatig verdeeld is. Anders is het een algoritme.
Het werkt zoals verwacht.
Het algoritme kan als volgt worden samengevat.
- Haal de invoerlijst en sleutelwaarde op om te zoeken.
- Initialiseer de onderste en bovenste variabelen op de eerste en laatste indices van de lijst.
- Als de lagere waarde kleiner is dan of gelijk is aan de hogere waarde, dan: -
- Bereken de geschatte locatie met behulp van de volgende formule:
pos = laag + ((hoog - laag) / (arr[hoog] - arr[laag])) * (x - arr[laag]). - Retourneert de positie als de geschatte positiewaarde een sleutelwaarde is.
- c) Als de geschatte positiewaarde kleiner is dan de sleutelwaarde, stelt u deze lager in.
Positie + 1. - d) Als de waarde van de geschatte positie groter is dan de sleutel Instelwaarde, positie - 1 omhoog.
- Bereken de geschatte locatie met behulp van de volgende formule:
- Als de sleutelwaarde niet wordt gevonden, retourneert u -1 om aan te geven dat de waarde niet in de lijst staat.
(vi) Sprongzoeken : Een zoekmethode die de lijst in stappen van constante lengte doorloopt totdat het relevante element wordt gevonden of wordt vastgesteld dat het niet langer aanwezig is.
Het sprongzoekalgoritme is als volgt:
- Stel eerst de spronggrootte in op de vierkantswortel van het aantal array-elementen.
- Stelt een variabele met de naam 'current' in op het eerste element van de array.
- Itereert over de array door te springen op spronggrootte, terwijl een variabele met de naam 'jump' wordt verhoogd.
- Ga verder met de volgende sprong als het bestaande element kleiner is dan het gewenste element.
- Als het huidige element groter is dan het doelelement, voert u een lineaire zoekopdracht uit tussen het huidige element en het vorige sprongelement om het doelelement te vinden.
- Als het doelelement niet in de array wordt gevonden, retourneert het -1 om aan te geven dat het niet in de array aanwezig is.
- Als het element wordt gevonden, retourneert het de index van het element in de array.
3. Grafiekalgoritmen
De ondersteuning van C voor pointers en datastructuren zoals arrays en gekoppelde lijsten maakt het geschikt voor het implementeren van algoritmen die grafieken manipuleren, zoals het vinden van het kortste pad tussen twee knooppunten in een grafiek.
Er zijn verschillende soorten grafiekalgoritmen.
zij zijn:-
4. Cryptografische algoritmen
C ondersteunt bewerkingen op laag niveau en efficiënte gegevensmanipulatie, waardoor het ideaal is voor het implementeren van algoritmen die in cryptografie worden gebruikt, zoals gegevenscodering en decoderingsalgoritmen.
Er zijn verschillende soorten versleutelingsalgoritmen.
Zij zijn:-
Voordelen van het algoritme
Algoritmen hebben veel voordelen.
zij zijn:-
Nadelen van het algoritme
Algoritmen zijn erg handig bij het programmeren, maar algoritmen hebben nadelen.
zij zijn:-