Quelltexte/ Codesnippets | | | | Michael W. | Suchalgorithmen Knuth-Morris-Pratt, Boyer-Moore, Horspool, Sunday
Hier mal ein paar Suchroutinen KompilierenMarkierenSeparieren' 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
Print "\nENDE - Taste drücken"
WaitKey
End
P.S.: Die Überschrift wird aber durchgekaut - auweia |
| | | System: Windows 8/10, XProfan X4 Programmieren, das spannendste Detektivspiel der Welt. | 28.12.2014 ▲ |
| |
| | | Balphaetisch sortiert, Schlagworte sollen angegeben werden, kein Titel - drum auch Fürwortelöschung etc. |
| | | | |
| | Michael W. | Oh, stand da "Schlagworte"? Hab ich dann wohl übersehen... |
| | | XProfan X3System: Windows 8/10, XProfan X4 Programmieren, das spannendste Detektivspiel der Welt. | 28.12.2014 ▲ |
| |
| | | Nein, stand und steht da nicht.
Hatte es zwar mal hier und da erklärt wie es funktioniert aber das wars dann auch schon.
Wenn Du ein Snip hast mit den Worten: olpha, pheta und komma, dann wirds einsortiert das Thema bei:
olpha pheta komma pheta olpha komma komma olpha pheta
Quasi alle Wortekombinationen durchgenudelt sodasses findbar ist bei egal welchem Wort.
Sinnvoll bei so Dingensen wie:
Festplatte aufräumen und temporäre Dateien löschen
Kann man dann finden bei
aufräumen, Festplatte temporäre Dateien löschen Dateien, Festplatte aufräumen temporäre löschen Festplatte, aufräumen temporäre Dateien löschen löschen, Festplatte aufräumen temporäre Dateien temporäre, Festplatte aufräumen Dateien löschen |
| | | | |
| | p.specht
| Knut hat nix mit dem lieben Eisbärbaby zu tun, das damals verendete, sondern mit Prof.em.Dr.Dr.Drhc. Donald Knuth - mit h hinten, DEM Algorithmenpapst!!!!!!
Boyer-Moore, Morris-Pratt sind Algorithmentitel. Boyer allein hat was ganz anderes gemacht. Bindestrich wäre aber ein Doppelnamen, Frage: Gibt´s nicht ein nicht-trennendes Leerzeichen für solche Fälle? Wie wäre es ersatzweise mit dem 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 für XProfan-11.2a bzw. free verdaubar gemacht:
Proc BoyerMoore_Search
Parameters SourceStart&,SourceLen&,PatternStart&,PatternLen&,MaxTreffer&,BadTab&[],GoodTab&[]
Declare TrefferTab&[],i&,j&,Treffer&,v11&
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
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
Return TrefferTab&[]
EndProc
|
| | | XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 12.06.2021 ▲ |
| |
|
Zum QuelltextThemenoptionen | 5.947 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |