AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Knuth-Morris-Pratt Algorithmus
Thema durchsuchen
Ansicht
Themen-Optionen

Knuth-Morris-Pratt Algorithmus

Ein Thema von Görly · begonnen am 5. Apr 2008 · letzter Beitrag vom 10. Jun 2011
Antwort Antwort
Seite 3 von 3     123   
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#21

Re: Knuth-Morris-Pratt Algorithmus

  Alt 5. Apr 2008, 19:57
Hier noch ein paar gute Links:
1. Schrittweise Demonstration
2. Definition, Erklärung, Implementierung, Live-Demo
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Görly

Registriert seit: 5. Apr 2008
29 Beiträge
 
Delphi 7 Enterprise
 
#22

Re: Knuth-Morris-Pratt Algorithmus

  Alt 6. Apr 2008, 17:16
eine programdarstellung wie sie im 1. link erfolgt wäre natürlich wahnsinn zur verdeutlichung des kmp algorithmus. aber duch die umschreibung meines programms ist das nich zu schaffen, oder?

mfg görly
Remo
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
847 Beiträge
 
Delphi 11 Alexandria
 
#23

Re: Knuth-Morris-Pratt Algorithmus

  Alt 6. Apr 2008, 17:39
Eine Suchanimation ist auch mit Delphi machbar, allerdings ist das nicht mal eben gemacht. Für einen Vortrag hab ich mal ein kleines Programm geschrieben, was einige der gängigen Suchalgorithmen animiert und "gegeneinander antreten lässt". Knuth-Morris-Pratt ist da auch dabei.

Ich hab für hier mal ein kleines Label eingebaut, damit du nicht schummeln kannst
Angehängte Dateien
Dateityp: exe testprogrammsuche_440.exe (490,0 KB, 43x aufgerufen)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#24

Re: Knuth-Morris-Pratt Algorithmus

  Alt 6. Apr 2008, 17:46
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#25

Re: Knuth-Morris-Pratt Algorithmus

  Alt 6. Apr 2008, 17:49
@Gausi: Ein echt geiles Programm
  Mit Zitat antworten Zitat
Görly

Registriert seit: 5. Apr 2008
29 Beiträge
 
Delphi 7 Enterprise
 
#26

Re: Knuth-Morris-Pratt Algorithmus

  Alt 6. Apr 2008, 18:37
ou du bist n held ! geniale sache. aber die lehrerin würd mir eh niemals abkaufen das ich das allein geschrieben hätte hast ja gesehen wo meine probleme anfangen !

ein riesen dankeschön.

mal nebenbei, wie lange hast du gebraucht das prog. zu schreiben? und wie lange brauch man um solche erfahrung in sachen delphi zu erlangen. bin jetz auch voll im delphi-fieber

greetz görly
Remo
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
847 Beiträge
 
Delphi 11 Alexandria
 
#27

Re: Knuth-Morris-Pratt Algorithmus

  Alt 6. Apr 2008, 18:57
Wie lange ich dafür gebraucht habe, weiß ich nicht mehr. War aber nicht übermäßig lang - das ist auch mehr so nebenbei entstanden. Irgendwo hier schwirrt auch ein Thread mit ner frühen Version des Programms rum, was man da noch durch Mausbewegungen zum Absturz bringen konnte - Threadprogrammierung mit Bitmaps ist etwas doof.

(Und vielleicht kann es ja auch der nächste Vortragende gebrauchen - wo Knuth-Morris-Pratt vorkommt, ist Boyer-Moore meistens nicht weit weg. )
  Mit Zitat antworten Zitat
Görly

Registriert seit: 5. Apr 2008
29 Beiträge
 
Delphi 7 Enterprise
 
#28

Re: Knuth-Morris-Pratt Algorithmus

  Alt 6. Apr 2008, 19:22
na wirst es nich glauben ich muss beides erklähren daher bin ich so wahnsinnig begeistert!
Remo
  Mit Zitat antworten Zitat
Görly

Registriert seit: 5. Apr 2008
29 Beiträge
 
Delphi 7 Enterprise
 
#29

Re: Knuth-Morris-Pratt Algorithmus

  Alt 8. Apr 2008, 20:59
so wie gesagt das program ist ja fertig. soweit is das klasse. nur mir ist aufgefallen das wenn ich ein wort mehrmals im satz habe und dieses suche er mir nur die stelle des anfangsbuchstaben von 1. wort ausgibt. dazu kommt das ich bei diesem program automatisch die zeit messen lassen muss das hab ich wie folglich im quellcode zu sehen ist auch schon hinbekommen. doch da der satz nicht ausreichend lang ist gibt mir dieser zähler keinen wert aus, wenn ich nich vorher einen haltepunkt im quellcode festlege. meine lehrerin war der meinung das sei nicht anders lösbar und da dachte ich frag ich euch nochmal !
schauts euch einfach mal an:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Label3: TLabel;
    Edit3: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
function knuth_morris_pratt(const target, pattern : PChar; const lTarget, lPattern : integer) : integer;
var
        step : array[0..255] of integer;
        i,
        j : integer;
        begin
        result := -1;
        if ltarget * lpattern = 0 then exit;
        i := 0;
        j := -1;
        step[0] := -1;

        repeat
        if (j = -1) or (pattern[i] = pattern[j]) then
        begin
        inc(i);
        inc(j);
        if pattern[j] = pattern[i] then step[i] := step[j] else step[i] := j;
        end else j := step [j];
        until i = lpattern -1;
        j := -1;
        i := 0;

        while i < ltarget do
        begin
        if (j=-1) or (pattern[j] = target[i]) then
        begin
        inc(i);
        inc(j);
        if j >= lpattern then
        begin
        result := i-j+1;
        exit;
        end;
        end else j := step[j];
        end;
        end;


procedure TForm1.Button1Click(Sender: TObject);
var i, t:integer; s1,s2:string;
begin
  t := gettickcount;

s1:=edit1.Text;
s2:=edit2.Text;
i:=knuth_morris_pratt(pchar(s1),pchar(s2),length(s1),length(s2));
label2.Caption:=inttostr(i);

Edit3.Text := floattostrf((gettickcount-t)*0.001,fffixed,10,2);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  edit1.Text:= '';
  edit2.Text:= '';
  label2.Caption:= '';
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
edit1.text:= 'hallo liebe info freune! info mit frau müller macht sp.-spa.-sp (ach scheiß drauf, macht auf jeden fall iwas)';
edit2.Text:= 'frau müller';
end;

end.
Remo
  Mit Zitat antworten Zitat
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#30

AW: Knuth-Morris-Pratt Algorithmus

  Alt 10. Jun 2011, 21:15
Hallo DP,

der Thread ist ja schon etwas älter, aber ich beschäftige mich gerade mit Boyer-Moore & Co.

Habe mal die Fehler im KMP von oben behoben und die Funktion auf die Verwendung mit Strings umgeschrieben. Sollte jetzt auch am Textanfang funktionieren...vielleicht kann's ja der Eine oder Andere gebrauchen.

Delphi-Quellcode:
function TToolBox.PosKMP(const sSearch, sText : String) : Integer;
var
  step : array[1..1024] of Integer;
  i, j , lTarget, lPattern: Integer;
begin
  lTarget := Length(sText);
  lPattern := Length(sSearch);
  result := 0;
  if lTarget * lPattern = 0 then
    Exit;
  i := 1;
  j := 0;
  step[1] := 0;

  repeat
    if (j = 0) or (sSearch[i] = sSearch[j]) then
    begin
      inc(i);
      inc(j);
      if sSearch[j] = sSearch[i] then
        step[i] := step[j]
      else
        step[i] := j;
    end
    else
      j := step[j];
  until i >= lPattern - 1;

  j := 1;
  i := 1;

  while i <= lTarget do
  begin
    if (j = 0) or (sSearch[j] = sText[i]) then
    begin
      inc(i);
      inc(j);
      if j > lPattern then
      begin
        Exit(i - j + 1);
      end;
    end
    else
      j := step[j];
  end;
end;
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz