Español
Fuente/ Codesnippets

Boyer Horspool Knut Moore Morris Pratt Suchalgorithmen Sunday

 

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




Michael
W.
Oh, stand como "Schlagworte"? Hab Yo entonces wohl übersehen...
 
XProfan X3
System: 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
 
28.12.2014  
 




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



Zum Quelltext


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

5.960 Views

Untitledvor 0 min.
p.specht20.11.2021
E.T.20.11.2021
Manfred Barei19.11.2021
Wilfried Friebe17.11.2021
Más...

Themeninformationen

Dieses Thema ha 3 subscriber:

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


Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie