Fuente/ Codesnippets | | | | Michael W. | Suchalgorithmen Knuth-Morris-Pratt, Boyer-Moore, Horspool, Sunday
Hier veces unos pocos Suchroutinen KompilierenMarcaSeparación' XProfan X2
' Suchalgorithmen
' - Knuth-Morris-Pratt (KMP)
' - Boyer-Moore
' - Horspool
' - Sunday
' Diese Algorithmen untersuchen erst den Suchbegriff und bilden eine
' oder mehrere Sprungtabellen, um den Suchbegriff schneller über den
' zu untersuchenden Text zu schieben.
' Wenn diese Prozedur vom eigentlichen Suchen getrennt wird, dann
' können mit EINER Sprungtabelle mehrere große Textteile nacheinander
' untersucht werden.
' Außerdem wird hier mit Adressen gearbeitet, um sowohl in einfachen
' Strings als auch in Bereichen suchen zu können.
' Die Routinen sind also geteilt in XXX_Tab und XXX_Search
Proc MinF
Parameters Float a,b
Return if(a<b,a,b)
EndProc
Proc MaxF
Parameters Float a,b
Return if(a>b,a,b)
EndProc
Proc MinQ
Parameters Quad a,b
Return if(a<b,a,b)
EndProc
Proc MaxQ
Parameters Quad a,b
Return if(a>b,a,b)
EndProc
Proc MatchesAt
Parameters Long SourceStart, SourceLen, PatternStart, PatternLen, Posi
Var Long j = 0
While (j < PatternLen) and (Char$(PatternStart,j,1) = Char$(SourceStart,Posi+j,1))
Inc j
EndWhile
Return (j = PatternLen)'volle Übereinstimmung
EndProc
' ==================================
' - Knuth-Morris-Pratt (KMP)
' untersucht den Suchbegriff und liefert ein dynamisches Array zurück
Proc KMP_Tab
Parameters Long PatternStart, PatternLen
Declare Long PreTab[]
Var Long i = 0
Var Long j = -1
PreTab[i] = j
While i < PatternLen
While (j >= 0) and (Char$(PatternStart,j,1) <> Char$(PatternStart,i,1))
j = PreTab[j]
EndWhile
Inc i
Inc j
PreTab[i] = j
EndWhile
Return PreTab[]
EndProc
' ----------------------------------
' - Knuth-Morris-Pratt (KMP)
' liefert ein dyn. Array mit den Fundstellen zurück
Proc KMP_Search
Parameters Long SourceStart, SourceLen, PatternStart, PatternLen, MaxTreffer, PrefixTab[]
Declare Long TrefferTab[]
Var Long Treffer = 0
Var Long i = 0
Var Long j = 0
While i < SourceLen
While (j >= 0) and (Char$(SourceStart,i,1) <> Char$(PatternStart,j,1))
j = PrefixTab[j]'Muster verschieben
EndWhile
Inc i : Inc j
If j = PatternLen
TrefferTab[Treffer] = i - PatternLen
Inc Treffer
j = PrefixTab[j]'Muster verschieben
EndIf
Case (MaxTreffer <> 0) and (Treffer >= MaxTreffer) : BREAK
EndWhile
Return TrefferTab[]
EndProc
' ==================================
' ==================================
' - Boyer-Moore
' untersucht den Suchbegriff und liefert ein dynamisches Array zurück
Proc BoyerMoore_Tab_Bad
Parameters Long PatternStart, PatternLen
Declare Long Bad_Tab[]
' die 'bad rule' des Boyer-Moore
Bad_Tab[PatternLen] = 0
WhileLoop 0,255
Bad_Tab[&loop] = -1
EndWhile
WhileLoop 0,PatternLen - 1
'Bad_Tab[&loop] = 0
Bad_Tab[Ord(Char$(PatternStart,&loop,1))] = &loop
EndWhile
Return Bad_Tab[]
EndProc
' - Boyer-Moore
' untersucht den Suchbegriff und liefert ein dynamisches Array zurück
Proc BoyerMoore_Tab_Good
Parameters Long PatternStart, PatternLen
Declare Long Good_Tab[], tmp[], i,j
' die 'good rule' des Boyer-Moore
' stufe 1
i = PatternLen - 1
j = PatternLen
tmp[i] = j
WhileLoop 0,PatternLen
Good_Tab[&loop] = 0
EndWhile
While i > 0
While (j < PatternLen) and (Char$(PatternStart,i-1,1) <> Char$(PatternStart,j-1,1))
Case Good_Tab[j] = 0 : Good_Tab[j] = j - i
j = tmp[j]
EndWhile
Dec i
Dec j
tmp[i] = j
EndWhile
' stufe 2
j = tmp[0]
WhileLoop 0,PatternLen-1
Case Good_Tab[&loop] = 0 : Good_Tab[&loop] = j
Case &loop = j : j = tmp[j]
EndWhile
Return Good_Tab[]
EndProc
' ----------------------------------
' - Boyer-Moore-Algorithmus
Proc BoyerMoore_Search
Parameters Long SourceStart, SourceLen, PatternStart, PatternLen, MaxTreffer, BadTab[], GoodTab[]
Declare Long TrefferTab[], i,j
Var Long Treffer = 0
Case PatternLen > SourceLen : Return TrefferTab[]
i = 0
While i <= (SourceLen - PatternLen)
j = PatternLen - 1
While (j >= 0) and (Char$(PatternStart,j,1) = Char$(SourceStart,i+j,1))
Dec j
EndWhile
If j < 0
TrefferTab[Treffer] = i
Inc Treffer
Inc i, GoodTab[0]
Else
Inc i, MaxQ( GoodTab[j + 1], j - BadTab[Ord(Char$(SourceStart,i + j,1))] )
EndIf
Case (MaxTreffer <> 0) and (Treffer >= MaxTreffer) : BREAK
EndWhile
Return TrefferTab[]
EndProc
' ==================================
' ==================================
' - Horspool
' untersucht den Suchbegriff und liefert ein dynamisches Array zurück
Proc Horspool_Tab
Parameters Long PatternStart, PatternLen
Declare Long PreTab[]
WhileLoop 0,255
PreTab[&loop] = -1
EndWhile
WhileLoop 0,PatternLen-2
PreTab[Ord(Char$(PatternStart,&loop,1))] = &loop
EndWhile
Return PreTab[]
EndProc
' ----------------------------------
' - Horspool
' liefert ein dyn. Array mit den Fundstellen zurück
Proc Horspool_Search
Parameters Long SourceStart, SourceLen, PatternStart, PatternLen, MaxTreffer, PrefixTab[]
Declare Long TrefferTab[], i,j
Var Long Treffer = 0
Case PatternLen > SourceLen : Return TrefferTab[]
i = 0
While i <= (SourceLen - PatternLen)
j = PatternLen - 1
While (j >= 0) and (Char$(PatternStart,j,1) = Char$(SourceStart,i+j,1))
Dec j
EndWhile
if (j < 0)
TrefferTab[Treffer] = i : Inc Treffer
EndIf
Inc i, (PatternLen - 1)
Dec i, PrefixTab[Ord(Char$(SourceStart,i,1))]
EndWhile
Return TrefferTab[]
EndProc
' ==================================
' ==================================
' - Sunday-Algorithmus
' untersucht den Suchbegriff und liefert ein dynamisches Array zurück
Proc Sunday_Tab
Parameters Long PatternStart, PatternLen
Declare Long PreTab[]
WhileLoop 0,255
PreTab[&loop] = -1
EndWhile
WhileLoop 0,PatternLen-1
PreTab[Ord(Char$(PatternStart,&loop,1))] = &loop
EndWhile
Return PreTab[]
EndProc
' ----------------------------------
' - Sunday-Algorithmus
' liefert ein dyn. Array mit den Fundstellen zurück
Proc Sunday_Search
Parameters Long SourceStart, SourceLen, PatternStart, PatternLen, MaxTreffer, PrefixTab[]
Declare Long TrefferTab[], i,j
Var Long Treffer = 0
Case PatternLen > SourceLen : Return TrefferTab[]
i = 0
While i <= (SourceLen - PatternLen)
If MatchesAt(SourceStart, SourceLen, PatternStart, PatternLen, i)
TrefferTab[Treffer] = i
Inc Treffer
EndIf
Inc i, PatternLen
Case i < SourceLen : Dec i,PrefixTab[Ord(Char$(SourceStart,i,1))]
EndWhile
Return TrefferTab[]
EndProc
' ==================================
' ----------------------------------
' Testbereich
' ----------------------------------
Declare Long Ergebnisse[],Tab1[],Tab2[], lauf, String Quelle, Muster
' - Knuth-Morris-Pratt (KMP)
Clear Ergebnisse[],Tab1[]
Quelle = "abababcbababcababcabababcabab"
Muster = "ababcabab"
Tab1[] = KMP_Tab(addr(Muster),len(Muster))
Ergebnisse[] = KMP_Search(addr(Quelle),len(Quelle),addr(Muster),len(Muster), 5, Tab1[] )
Print "\nKnuth-Morris-Pratt: ";
WhileLoop 0,SizeOf(Ergebnisse[])-1 : Print Ergebnisse[&loop]; ";"; : EndWhile : Print " "
WhileLoop 0,SizeOf(Ergebnisse[])-1
Print Tab(3);Quelle
Print Tab(3+Ergebnisse[&loop]);Muster
EndWhile
Clear Ergebnisse[],Tab1[]
Quelle = "reinesupersauersupesupersupe"
Muster = "supersupe"
' Wenn nur der zu durchsuchende Text sich ändert und
' das gleiche Suchmuster verwendet wird, dann braucht
' die Tabelle nicht erneuert zu werden.
' ---aber hier ändert sich auch der Suchwert---
Tab1[] = KMP_Tab(addr(Muster),len(Muster))
Ergebnisse[] = KMP_Search(addr(Quelle),len(Quelle),addr(Muster),len(Muster), 5, Tab1[] )
Print "\nKnuth-Morris-Pratt: ";
WhileLoop 0,SizeOf(Ergebnisse[])-1 : Print Ergebnisse[&loop]; ";"; : EndWhile : Print " "
WhileLoop 0,SizeOf(Ergebnisse[])-1
Print Tab(3);Quelle
Print Tab(3+Ergebnisse[&loop]);Muster
EndWhile
Print "\nnächster Algorithmus"
WaitInput
' -------------------------------
' - Boyer-Moore
Clear Ergebnisse[],Tab1[],Tab2[]
Quelle = "abababcbababcababcabababcabab"
Muster = "ababcabab"
Tab1[] = BoyerMoore_Tab_Bad(addr(Muster),len(Muster))
Tab2[] = BoyerMoore_Tab_Good(addr(Muster),len(Muster))
Ergebnisse[] = BoyerMoore_Search(addr(Quelle),len(Quelle),addr(Muster),len(Muster), 5, Tab1[],Tab2[] )
Print "\nBoyer-Moore: ";
WhileLoop 0,SizeOf(Ergebnisse[])-1 : Print Ergebnisse[&loop]; ";"; : EndWhile : Print " "
WhileLoop 0,SizeOf(Ergebnisse[&loop])-1
Print Tab(3);Quelle
Print Tab(3+Ergebnisse[&loop]);Muster
EndWhile
Clear Ergebnisse[],Tab1[],Tab2[]
Quelle = "reinesupersauersupesupersupe"
Muster = "supersupe"
' Wenn nur der zu durchsuchende Text sich ändert und
' das gleiche Suchmuster verwendet wird, dann braucht
' die Tabelle nicht erneuert zu werden.
' ---aber hier ändert sich auch der Suchwert---
Tab1[] = BoyerMoore_Tab_Bad(addr(Muster),len(Muster))
Tab2[] = BoyerMoore_Tab_Good(addr(Muster),len(Muster))
Ergebnisse[] = BoyerMoore_Search(addr(Quelle),len(Quelle),addr(Muster),len(Muster), 5, Tab1[],Tab2[] )
Print "\nBoyer-Moore: ";
WhileLoop 0,SizeOf(Ergebnisse[])-1 : Print Ergebnisse[&loop]; ";"; : EndWhile : Print " "
WhileLoop 0,SizeOf(Ergebnisse[])-1
Print Tab(3);Quelle
Print Tab(3+Ergebnisse[&loop]);Muster
EndWhile
Print "\nnächster Algorithmus"
WaitInput
' -------------------------------
' - Horspool
Clear Ergebnisse[],Tab1[]
Quelle = "abababcbababcababcabababcabab"
Muster = "ababcabab"
Tab1[] = Horspool_Tab(addr(Muster),len(Muster))
Ergebnisse[] = Horspool_Search(addr(Quelle),len(Quelle),addr(Muster),len(Muster), 5, Tab1[] )
Print "\nHorspool: ";
WhileLoop 0,SizeOf(Ergebnisse[])-1 : Print Ergebnisse[&loop]; ";"; : EndWhile : Print " "
WhileLoop 0,SizeOf(Ergebnisse[])-1
Print Tab(3);Quelle
Print Tab(3+Ergebnisse[&loop]);Muster
EndWhile
Clear Ergebnisse[],Tab1[]
Quelle = "reinesupersauersupesupersupe"
Muster = "supersupe"
' Wenn nur der zu durchsuchende Text sich ändert und
' das gleiche Suchmuster verwendet wird, dann braucht
' die Tabelle nicht erneuert zu werden.
' ---aber hier ändert sich auch der Suchwert---
Tab1[] = Horspool_Tab(addr(Muster),len(Muster))
Ergebnisse[] = Horspool_Search(addr(Quelle),len(Quelle),addr(Muster),len(Muster), 5, Tab1[] )
Print "\nHorspool: ";
WhileLoop 0,SizeOf(Ergebnisse[])-1 : Print Ergebnisse[&loop]; ";"; : EndWhile : Print " "
WhileLoop 0,SizeOf(Ergebnisse[])-1
Print Tab(3);Quelle
Print Tab(3+Ergebnisse[&loop]);Muster
EndWhile
Print "\nnächster Algorithmus"
WaitInput
' -------------------------------
' - Sunday-Algorithmus
Clear Ergebnisse[],Tab1[]
Quelle = "abababcbababcababcabababcabab"
Muster = "ababcabab"
Tab1[] = Sunday_Tab(addr(Muster),len(Muster))
Ergebnisse[] = Sunday_Search(addr(Quelle),len(Quelle),addr(Muster),len(Muster), 5, Tab1[] )
Print "\nSunday: ";
WhileLoop 0,SizeOf(Ergebnisse[])-1 : Print Ergebnisse[&loop]; ";"; : EndWhile : Print " "
While SizeOf(Ergebnisse[])-1
Print Tab(3);Quelle
Print Tab(3+Ergebnisse[&loop]);Muster
EndWhile
Clear Ergebnisse[],Tab1[]
Quelle = "reinesupersauersupesupersupe"
Muster = "supersupe"
' Wenn nur der zu durchsuchende Text sich ändert und
' das gleiche Suchmuster verwendet wird, dann braucht
' die Tabelle nicht erneuert zu werden.
' ---aber hier ändert sich auch der Suchwert---
Tab1[] = Sunday_Tab(addr(Muster),len(Muster))
Ergebnisse[] = Sunday_Search(addr(Quelle),len(Quelle),addr(Muster),len(Muster), 5, Tab1[] )
Print "\nSunday: ";
WhileLoop 0,SizeOf(Ergebnisse[])-1 : Print Ergebnisse[&loop]; ";"; : EndWhile : Print " "
WhileLoop 0,SizeOf(Ergebnisse[])-1
Print Tab(3);Quelle
Print Tab(3+Ergebnisse[&loop]);Muster
EndWhile
Imprimir "\nENDE - Taste drücken"
WaitKey
End
P.S.: El Überschrift se aber durchgekaut - auweia |
| | | System: Windows 8/10, XProfan X4 Programmieren, das spannendste Detektivspiel der Welt. | 28.12.2014 ▲ |
| |
| | | Balphaetisch sortiert, Schlagworte debería angegeben voluntad, kein Titel - tambor auch Fürwortelöschung etc. |
| | | | |
| | Michael W. | Oh, stand como "Schlagworte"? Hab Yo entonces wohl übersehen... |
| | | XProfan X3System: Windows 8/10, XProfan X4 Programmieren, das spannendste Detektivspiel der Welt. | 28.12.2014 ▲ |
| |
| | | Nein, stand y es como no.
Hatte lo zwar veces hier y como erklärt como funktioniert aber el wars entonces auch ya.
Si usted una Snip hast con el Worten: olpha, pheta y komma, entonces Será mejor que te va einsortiert el Thema en:
olpha pheta komma pheta olpha komma komma olpha pheta
Quasi todos Wortekombinationen durchgenudelt sodasses findbar es en egal welchem Wort.
Sinnvoll en así Dingensen como:
Festplatte aufräumen y temporäre Archivos löschen
Kann una continuación encontrar en
aufräumen, Festplatte temporäre Archivos löschen Archivos, Festplatte aufräumen temporäre löschen Festplatte, aufräumen temporäre Archivos löschen löschen, Festplatte aufräumen temporäre Archivos temporäre, Festplatte aufräumen Archivos löschen |
| | | | |
| | p.specht
| Knut ha nix con el lieben Eisbärbaby a tun, el damals verendete, pero con Prof.em.Dr.Dr.Drhc. Donald Knuth - con h hinten, DEM Algorithmenpapst!!!!!!
Boyer-Moore, Morris-Pratt son Algorithmentitel. Boyer allein ha algo muy más gemacht. Bindestrich wäre aber una Doppelnamen, Cuestión: Gibt´s no una no-trennendes Leerzeichen para solche Fälle? Como wäre lo ersatzweise con el Unterstrich _ ? |
| | | Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 12.06.2021 ▲ |
| |
| | p.specht
| Proc-Teil para XProfan-11.2a o. free verdaubar gemacht:
Proc BoyerMoore_Search
Parámetros SourceStart&,SourceLen&,PatternStart&,PatternLen&,MaxTreffer&,BadTab&[],GoodTab&[]
Declarar TrefferTab&[],i&,j&,Treffer&,v11&
Treffer& = 0
Case PatternLen& > SourceLen& : Volver TrefferTab&[]
i& = 0
Mientras que i& <= (SourceLen& - PatternLen&)
j& = PatternLen& - 1
Mientras que (j&>=0) and (Char$(PatternStart&,j&,1) = Char$(SourceStart&,i&+j&,1))
Dec j&
EndWhile
If j&<0
TrefferTab&[Treffer&] = i&
Inc Treffer&
Inc i&,GoodTab&[0]
Más
v11&=MaxL( GoodTab&[j&+1], j&-BadTab&[Ord(Char$(SourceStart&,i&+j&,1))] )
Inc i&,v11&
EndIf
if (MaxTreffer& <> 0) and (Treffer& >= MaxTreffer&)
BREAK
endif
EndWhile
Volver TrefferTab&[]
ENDPROC
|
| | | XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 12.06.2021 ▲ |
| |
|
Zum QuelltextThemeninformationenDieses Thema ha 3 subscriber: |