logo

Patroonaanpassingsalgoritme in C

Pattern Matching wordt veel gebruikt in de informatica en vele andere vakgebieden. Pattern Matching-algoritmen worden gebruikt om naar patronen binnen een grotere tekst- of dataset te zoeken. Een van de meest populaire algoritmen voor patroonmatching is de Boyer-Moore algoritme, dat voor het eerst werd gepubliceerd in 1977. In dit artikel bespreken we Pattern Matching-algoritmen in C en hoe ze werken.

Wat is een patroonmatchingalgoritme?

Pattern Matching-algoritmen worden gebruikt om patronen te vinden binnen een grotere reeks gegevens of tekst. Deze algoritmen werken door een patroon te vergelijken met een grotere dataset of tekst en te bepalen of het patroon al dan niet aanwezig is. Pattern Matching-algoritmen zijn belangrijk omdat ze ons in staat stellen snel naar patronen in grote datasets te zoeken.

derde normaalvorm

Brute Force-patroonaanpassingsalgoritme:

Brute Force Pattern Matching is het eenvoudigste Pattern Matching-algoritme. Hierbij worden de karakters van het patroon één voor één vergeleken met de karakters van de tekst. Als alle tekens overeenkomen, retourneert het algoritme de startpositie van het patroon in de tekst. Als dit niet het geval is, gaat het algoritme naar de volgende positie in de tekst en herhaalt de vergelijking totdat er een overeenkomst is gevonden of het einde van de tekst is bereikt. De tijdscomplexiteit van het Brute Force-algoritme is O(MXN) , waar M geeft de lengte van de tekst aan en N geeft de lengte van het patroon aan.

Naïef algoritme voor patroonaanpassing:

Het Naive Pattern Matching-algoritme is een verbetering ten opzichte van het Brute Force-algoritme. Het vermijdt onnodige vergelijkingen door bepaalde posities in de tekst over te slaan. Het algoritme begint het patroon te vergelijken met de tekst op de eerste positie. Als de tekens overeenkomen, gaat het naar de volgende positie en herhaalt de vergelijking. Als de tekens niet overeenkomen, gaat het algoritme naar de volgende positie in de tekst en vergelijkt het patroon opnieuw met de tekst. De tijdscomplexiteit van het Naive-algoritme is dat ook O(MXN) , maar in de meeste gevallen is het sneller dan het Brute Force-algoritme.

Knuth-Morris-Pratt-algoritme:

De Knuth-Morris-Pratt (KMP) algoritme is een geavanceerder Pattern Matching-algoritme. Het is gebaseerd op de observatie dat wanneer er een mismatch optreedt, bepaalde informatie over de tekst en het patroon kan worden gebruikt om onnodige vergelijkingen te voorkomen. Het algoritme berekent vooraf een tabel die informatie over het patroon bevat. De tabel bepaalt hoeveel tekens van het patroon kunnen worden overgeslagen als er een mismatch optreedt. De tijdscomplexiteit van de KMP algoritme is O(M+N) .

Het Boyer-Moore-algoritme:

Een van de meest populaire Pattern Matching-algoritmen is de Boyer-Moore algoritme. Dit algoritme werd voor het eerst gepubliceerd in 1977 door Robert S. Boyer en J Strother Moore. De Boyer-Moore algoritme vergelijkt een patroon met een grotere set gegevens of tekst van rechts naar links in plaats van van links naar rechts, zoals bij de meeste andere algoritmen voor patroonvergelijking.

De Boyer-Moore algoritme heeft twee hoofdcomponenten: de slechte karakterregel en de goede achtervoegselregel. De regel voor slechte tekens werkt door het teken in het patroon te vergelijken met het overeenkomstige teken in de gegevens of tekst. Als de tekens niet overeenkomen, verplaatst het algoritme het patroon naar rechts totdat het een teken vindt dat wel overeenkomt. De goede achtervoegselregel vergelijkt het achtervoegsel van het patroon met het overeenkomstige achtervoegsel van de gegevens of tekst. Als de achtervoegsels niet overeenkomen, verplaatst het algoritme het patroon naar rechts totdat het een passend achtervoegsel vindt.

De Boyer-Moore algoritme staat bekend om zijn efficiëntie en wordt veel gebruikt in veel toepassingen. Het wordt beschouwd als een van de snelste beschikbare algoritmen voor patroonvergelijking.

Implementatie van het Boyer-Moore-algoritme in C:

Voor het implementeren van de Boyer-Moore algoritme in C, kunnen we beginnen met het definiëren van de slechte karakterregel. We kunnen een array gebruiken om de laatste keer dat elk teken in het patroon voorkomt op te slaan. Deze array kan bepalen hoe ver we het patroon naar rechts moeten verplaatsen als er een mismatch optreedt.

Hier is een voorbeeld van hoe we de slechte karakterregel in C kunnen implementeren:

quicksort-algoritme

C-code:

 void bad_character_rule(char *pattern, int pattern_length, int *bad_char) { int i; for (i = 0; i <no_of_chars; i++) bad_char[i]="-1;" for (i="0;" i < pattern_length; bad_char[(int) pattern[i]]="i;" } pre> <p>In this example, we first initialize the array to -1 for all characters. We then iterate through the pattern and update the array with the last occurrence of each character in the pattern.</p> <p>Next, we can implement the good suffix rule. We can use an array to store the length of the longest suffix of the pattern that matches a suffix of the data or text. This array can be used to determine how far we need to move the pattern to the right.</p> <hr></no_of_chars;>