Italia
Fonte/ Codesnippets

Boyer Horspool Knut Moore Morris Pratt Suchalgorithmen Sunday

 

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.
 
28.12.2014  
 




Michael
W.
Oh, stand da "Schlagworte"? Hab ich dann wohl übersehen...
 
XProfan X3
System: 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 File löschen

Kann man dann finden bei

aufräumen, Festplatte temporäre File löschen
File, Festplatte aufräumen temporäre löschen
Festplatte, aufräumen temporäre File löschen
löschen, Festplatte aufräumen temporäre File
temporäre, Festplatte aufräumen File löschen
 
28.12.2014  
 




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 per 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 per 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 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
12.06.2021  
 



Zum Quelltext


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

5.991 Views

Untitledvor 0 min.
p.specht20.11.2021
E.T.20.11.2021
Manfred Barei19.11.2021
Wilfried Friebe17.11.2021
Di più...

Themeninformationen

Dieses Thema hat 3 subscriber:

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


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie