logo

Mønstertilpasningsalgoritme i C

Pattern Matching er mye brukt innen informatikk og mange andre felt. Mønstertilpasningsalgoritmer brukes til å søke etter mønstre i et større tekst- eller datasett. En av de mest populære algoritmene for mønstermatching er Boyer-Moore algoritme, som først ble publisert i 1977. I denne artikkelen vil vi diskutere Pattern Matching-algoritmer i C og hvordan de fungerer.

Hva er en mønstertilpasningsalgoritme?

Mønstertilpasningsalgoritmer brukes til å finne mønstre innenfor et større sett med data eller tekst. Disse algoritmene fungerer ved å sammenligne et mønster med et større datasett eller tekst og avgjøre om mønsteret er tilstede eller ikke. Mønstertilpasningsalgoritmer er viktige fordi de lar oss søke etter mønstre i store datasett raskt.

bfs og dfs

Brute Force Pattern Matching Algoritme:

Brute Force Pattern Matching er den enkleste Pattern Matching Algorithm. Det innebærer å sammenligne tegnene i mønsteret med tegnene i teksten én etter én. Hvis alle tegnene samsvarer, returnerer algoritmen startposisjonen til mønsteret i teksten. Hvis ikke, flytter algoritmen seg til neste posisjon i teksten og gjentar sammenligningen til en treff blir funnet eller slutten av teksten er nådd. Tidskompleksiteten til Brute Force Algorithm er O(MXN) , hvor M angir lengden på teksten og N angir lengden på mønsteret.

Naiv mønstertilpasningsalgoritme:

Algoritmen for Naive Pattern Matching er en forbedring i forhold til Brute Force-algoritmen. Den unngår unødvendige sammenligninger ved å hoppe over noen posisjoner i teksten. Algoritmen begynner å sammenligne mønsteret med teksten i den første posisjonen. Hvis tegnene samsvarer, flyttes den til neste posisjon og gjentar sammenligningen. Hvis tegnene ikke stemmer, flytter algoritmen seg til neste posisjon i teksten og sammenligner mønsteret med teksten på nytt. Tidskompleksiteten til den naive algoritmen er også O(MXN) , men det er raskere enn Brute Force-algoritmen i de fleste tilfeller.

Knuth-Morris-Pratt Algoritme:

De Knuth-Morris-Pratt (KMP) Algoritme er en mer avansert mønstertilpasningsalgoritme. Den er basert på observasjonen at når en mismatch oppstår, kan noe informasjon om teksten og mønsteret brukes for å unngå unødvendige sammenligninger. Algoritmen forhåndsberegner en tabell som inneholder informasjon om mønsteret. Tabellen bestemmer hvor mange tegn i mønsteret som kan hoppes over når det oppstår feil. Tidskompleksiteten til KMP algoritmen er O(M+N) .

Boyer-Moore-algoritmen:

En av de mest populære Pattern Matching-algoritmene er Boyer-Moore algoritme. Denne algoritmen ble først publisert i 1977 av Robert S. Boyer og J Strother Moore. De Boyer-Moore algoritme sammenligner et mønster med et større sett med data eller tekst fra høyre til venstre i stedet for venstre mot høyre, som med de fleste andre mønstertilpasningsalgoritmer.

De Boyer-Moore Algoritmen har to hovedkomponenter: regelen for dårlig karakter og regelen for god suffiks. Regelen for dårlige tegn fungerer ved å sammenligne tegnet i mønsteret med det tilsvarende tegnet i dataene eller teksten. Hvis tegnene ikke stemmer, flytter algoritmen mønsteret til høyre til den finner et tegn som passer. Regelen for gode suffiks sammenligner suffikset til mønsteret med det tilsvarende suffikset til dataene eller teksten. Hvis suffiksene ikke stemmer overens, flytter algoritmen mønsteret til høyre til den finner et samsvarende suffiks.

De Boyer-Moore Algoritmen er kjent for sin effektivitet og er mye brukt i mange applikasjoner. Det regnes som en av de raskeste mønstertilpasningsalgoritmene som er tilgjengelige.

Implementering av Boyer-Moore-algoritmen i C:

For å implementere Boyer-Moore algoritmen i C, kan vi starte med å definere regelen for dårlig karakter. Vi kan bruke en matrise til å lagre den siste forekomsten av hvert tegn i mønsteret. Denne matrisen kan bestemme hvor langt vi må flytte mønsteret til høyre når en mismatch oppstår.

Her er et eksempel på hvordan vi kan implementere regelen for dårlig karakter i C:

forskjellen mellom middag og kveldsmat

C-kode:

 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;>