English
Source / code snippets

Boyer Horspool Knut Moore Morris Pratt Suchalgorithmen Sunday

 

Michael
W.
Suchalgorithmen Knuth-Morris-Pratt, Boyer-Moore, Horspool, Sunday

here time a couple Suchroutinen
CompileMarkSeparation
' 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]);pattern

                                EndWhile

                                Print "\nENDE - Button drücken"
                                WaitKey
                                End

P.s.:
The Headline becomes but durchgekaut - auweia
 
System: Windows 8/10, XProfan X4
Programmieren, das spannendste Detektivspiel der Welt.
12/28/14  
 



Balphaetisch sortiert, Schlagworte should indicated go, no cover - thatswhy too Fürwortelöschung etc.
 
12/28/14  
 




Michael
W.
Oh, stood there "Schlagworte"? Have I then well overlooking...
 
XProfan X3
System: Windows 8/10, XProfan X4
Programmieren, das spannendste Detektivspiel der Welt.
12/28/14  
 



No, stood and standing there not.

having it of course time here and there declared as functions but the wars then already.

If you one Snip have with the Worten: olpha, pheta and comma,
then Better get going einsortiert the Topic with:

olpha pheta comma
pheta olpha comma
comma olpha pheta

Virtually any Wortekombinationen durchgenudelt sodasses findbar is with alike welchem word.

meaningfully with so Dingensen How:

Festplatte straighten up and temporary Files delete

Can then find with

straighten up, Festplatte temporary Files delete
Files, Festplatte straighten up temporary delete
Festplatte, straighten up temporary Files delete
delete, Festplatte straighten up temporary Files
temporary, Festplatte straighten up Files delete
 
12/28/14  
 




p.specht

Knut has nothing with the loves Eisbärbaby To do, the then verendete, separate with Prof.em.Dr.Dr.Drhc. Donald Knuth - with h hinten, DEM Algorithmenpapst!!!!!!

Boyer-Moore, Morris-Pratt are Algorithmentitel. Boyer alone has what integrally other made. hyphen would but one Doppelnamen, question: Gibt´s not one not-trennendes space for such Cases? how'bout ersatzweise with the Unterstrich _ ?
 
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
06/12/21  
 




p.specht

Proc-part for XProfan-11.2a or. free verdaubar made:
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 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
06/12/21  
 



Zum Quelltext


Topictitle, max. 100 characters.
 

Systemprofile:

no Systemprofil laid out. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Please register circa a Posting To verfassen.
 

Topic-Options

5.956 Views

Untitledvor 0 min.
p.specht11/20/21
E.T.11/20/21
Manfred Barei11/19/21
Wilfried Friebe11/17/21
More...

Themeninformationen

this Topic has 3 subscriber:

p.specht (2x)
iF (2x)
Michael W. (2x)


Admins  |  AGB  |  Applications  |  Authors  |  Chat  |  Privacy Policy  |  Download  |  Entrance  |  Help  |  Merchantportal  |  Imprint  |  Mart  |  Interfaces  |  SDK  |  Services  |  Games  |  Search  |  Support

One proposition all XProfan, The there's!


My XProfan
Private Messages
Own Storage Forum
Topics-Remember-List
Own Posts
Own Topics
Clipboard
Log off
 Deutsch English Français Español Italia
Translations

Privacy Policy


we use Cookies only as Session-Cookies because of the technical necessity and with us there no Cookies of Drittanbietern.

If you here on our Website click or navigate, stimmst You ours registration of Information in our Cookies on XProfan.Net To.

further Information To our Cookies and moreover, How You The control above keep, find You in ours nachfolgenden Datenschutzerklärung.


all rightDatenschutzerklärung
i want none Cookie