zoukankan      html  css  js  c++  java
  • 因为效率的问题,写Delphi下的求子串的KMP&BM算法,为我的程序提速不少

    { Implementation of KMP&BM Algorithm In Delphi 7}
    unit Unit1;
    interface
    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls;
    type
     TForm1 = class(TForm)
       Button1: TButton;
       Edit1: TEdit;
       Edit2: TEdit;
       procedure Button1Click(Sender: TObject);
     private
      { Private declarations }
     public
      { Public declarations }
       function mypos(SubStr: string; MainStr: string): integer;
     end;
    var
     Form1: TForm1;
    implementation{$R *.dfm}
    function TForm1.mypos(SubStr: string; MainStr: string): integer;
    var
     StrNext: array of integer;
     i, j: integer;
     procedure get_next(SubStr: string);
     var
       tj, tk: integer;
     begin
       tj := 1; tk := 0;
       while tj < Length(SubStr) do
       begin
         if (tk = 0or (SubStr[tj] = SubStr[tk]) then
         begin
           tj := tj + 1; tk := tk + 1;
           StrNext[tj] := tk;
         end
         else tk := StrNext[tk];
       end;
     end;
    begin
     SetLength(StrNext, Length(SubStr) + 1);
     get_next(SubStr);
     Result := 0;
     i := 1; j := 1;
     while (i <= Length(MainStr)) and (j <= Length(SubStr)) do
     begin
       if (j = 0or (MainStr[i] = SubStr[j]) then
       begin
         i := i + 1; j := j + 1;
       end
       else j := StrNext[j];                                  //j:=StrNext.IndexOf(j)  ;
       if j > Length(SubStr) then Result := i - Length(SubStr);
     end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     ShowMessage(IntToStr(mypos(Edit1.text, Edit2.text)));
    end;
    end.
    { Implementation of BM Algorithm In Delphi 7}
    Function myPos(SubStr, MainStr: String): Integer;       //BM
    Var
      i, j, k, m, n: Integer;
      skip: Array[0..255Of Integer;
    Begin
      m := Length(SubStr);
      n := Length(MainStr);
      If (m = 0Or (n = 0Then
      Begin
        Result := 0;
        Exit;
      End;
      For k := 0 To 255 Do
        skip[k] := m; //*** Preprocessing ***
      For k := 1 To m - 1 Do
        skip[Ord(SubStr[k])] := m - k;
      Result := 0;
      k := m;
       //*** Searching ***
      While (k <= n) Do
      Begin
        i := k;
        j := m;
        While (j >= 1Do
          If MainStr[i] <> SubStr[j] Then
            j := -1
          Else
          Begin
            Dec(j);
            Dec(i);
          End;
        If j = 0 Then
        Begin
          Result := i + 1;
          Exit;
        End;
        Inc(k, skip[Ord(MainStr[k])]);
      End;
    End;
    
  • 相关阅读:
    jQuery笔记之工具方法—Ajax 优化回调地狱
    jQuery笔记之工具方法—高级方法Ajax
    jQuery笔记之 Ajax回调地狱
    jQuery笔记之工具方法extend插件扩展
    jQuery同时监听两个事件---实现同时操控两个按键
    jQuery笔记之工具方法
    肖sir_多测师 _高级讲师 第二个月21讲解jmeter性能测试之安装badboy(002)
    肖sir_多测师 _高级讲师 第二个月21讲解jmeter之实战性能测试(001)
    肖sir_多测师 _高级讲师 第二个月20讲解jmeter之实战操作mysql(004)
    肖sir_多测师 _高级讲师 第二个月20讲解jmeter接口之实战(003)
  • 原文地址:https://www.cnblogs.com/tulater/p/1280019.html
Copyright © 2011-2022 走看看