国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

在串中查找第i個子串的位置及效率評測

2019-11-18 18:05:12
字體:
來源:轉載
供稿:網(wǎng)友

lw549 取得字符串中指定子字符串出現(xiàn)第n次的位置,效率不高,勉強可用 。感上興趣,于是試上一試。
程序附在最后,這里是一些說明文字:
1、為快速寫好,沒有使用應當使用的控制臺方式,而是使用了GUI方式;
2、測試的樣例是查找包含有四處子串的字符串,四次分別查四個位置。這個在Button1Click方法中完成,它調用Tests來進行具體測試,以被測函數(shù)、第幾次出現(xiàn)、循環(huán)次數(shù)為參數(shù);
3、Tests依次在一個循環(huán)中重復調用每個具體的函數(shù),同時為了公平起見(也許前面的函數(shù)為后面的鋪了一些路——內(nèi)存、高速緩沖),這樣的測試進行TEST_COUNT次,最后輸出每次的平均時間;
4、經(jīng)過前期的測試,lw549 的代碼的確效率不高,所以單獨給它小一些的循環(huán)次數(shù)(一千次),以免造成程序假死現(xiàn)象;其它的為十萬次;
5、其它三個函數(shù)的思想為:
PosN_Pos: 使用Pos函數(shù)及Copy函數(shù);
PosN_PosEx: 使用Delphi 7中增加的PosEx函數(shù);
PosN_StrPos: 使用StrPos函數(shù)。

程序輸出:

Search "function GetNSubStringPos(N: Integer; SubString,AString: String): Integer;" for "String"
1:
substr index: 1; LOOP COUNT = 1000
GetNSubStringPos: return 17; Timing: 37.60 ms
substr index: 1; LOOP COUNT = 100000
PosN_Pos: return 17; Timing: 40.40 ms
PosN_PosEx: return 17; Timing: 15.60 ms
PosN_StrPos: return 22; Timing: 37.80 ms
2:
substr index: 2; LOOP COUNT = 1000
GetNSubStringPos: return 42; Timing: 96.80 ms
substr index: 2; LOOP COUNT = 100000
PosN_Pos: return 42; Timing: 81.20 ms
PosN_PosEx: return 42; Timing: 47.00 ms
PosN_StrPos: return 47; Timing: 53.00 ms
3:
substr index: 3; LOOP COUNT = 1000
GetNSubStringPos: return 50; Timing: 109.40 ms
substr index: 3; LOOP COUNT = 100000
PosN_Pos: return 50; Timing: 118.80 ms
PosN_PosEx: return 50; Timing: 53.00 ms
PosN_StrPos: return 55; Timing: 62.60 ms
4:
substr index: 4; LOOP COUNT = 1000
GetNSubStringPos: return 58; Timing: 128.20 ms
substr index: 4; LOOP COUNT = 100000
PosN_Pos: return 58; Timing: 162.60 ms
PosN_PosEx: return 58; Timing: 59.40 ms
PosN_StrPos: return 63; Timing: 74.80 ms

可以看出,測試的結果(效率)是:  PosN_PosEx > PosN_StrPos > PosN_Pos >> GetNSubStringPos 。
我本來期望的是 PosN_StrPos 最厲害,但結果不是。估計是 PosEx 優(yōu)化得比較厲害。

附代碼:

Unit1.pas:

unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, DB, DBTables;type  TPosNFunc = function (N: Integer; const SubString,AString: String): Integer;type  TForm1 = class(TForm)    Memo1: TMemo;    Button1: TButton;    PRocedure Button1Click(Sender: TObject);    procedure FormCreate(Sender: TObject);  private    procedure Tests(const funcs: array of TPosNFunc;      const funcnames: array of string; iStr: integer; loopcount: integer);  public  end;var  Form1: TForm1;implementationuses  StrUtils;{$R *.dfm}function GetNSubStringPos(N: Integer; SubString,AString: String): Integer;//返回第n個SubString在AString中出現(xiàn)的位置//如果沒找到,返回-1var  FindCount: Integer;  Pos: Integer;begin  Result := -1;  Pos := 0;  for FindCount := 1 to N do begin    Inc(Pos);    while MidStr(AString, Pos, Length(SubString)) <> SubString do begin      if Length(AString) < Length(SubString) + Pos then        Exit;//未找到      Inc(Pos);    end;  end;  Result := Pos;end;function PosN_Pos(N: Integer; SubString, AString: String): Integer;var  p: integer;  nSub: integer;  nSrc: integer;begin  nSub := Length( SubString );  nSrc := Length( AString );  result := -nSub;  while N>0 do  begin    p := Pos(SubString, AString);    if p=0 then      break;    Dec( N );    Inc( result, p+nSub );    AString := Copy( AString, p+nSub+1, nSrc-nSub-p-1 );    Dec( nSrc, nSub+p );  end;  if N>0 then    result := -1;end;function PosN_PosEx(N: Integer; SubString,AString: String): Integer;var  p: integer;  nSub: integer;begin  nSub := Length( SubString );  result := 0;  p := 0;  while N>0 do  begin    p := PosEx( SubString, AString, p+1 );    if p=0 then      break;    Dec( N );    result := p;    Inc( p, nSub );  end;  if N>0 then    result := -1;end;function PosN_StrPos(N: Integer; SubString, AString: String): Integer;var  pSub, pSrc, p: Pchar;  nSub: integer;begin  nSub := Length( SubString );  pSub := PChar(SubString);  pSrc := PChar(AString);  p := pSrc;  while (N>0) do  begin    p := StrPos( p, pSub );    if (p=nil) then      break;    Inc( p, nSub );    Dec( N );  end;  if (N=0) and (p<>nil) then    result := p - pSrc  else    result := 0;end;const  STR = 'function GetNSubStringPos(N: Integer; SubString,AString: String): Integer;';  SUBSTR = 'String';  TEST_COUNT = 5;procedure TForm1.Tests( const funcs: array of TPosNFunc;                        const funcnames: array of string;                        iStr: integer;                        loopcount: integer );var  i, j, k: Integer;  tm: LongWord;  func: TPosNFunc;  count: integer;  retv: array of integer;  results: array of Longword;begin  count := Length(funcs);  assert( count=Length(funcnames) );  Memo1.Lines.Add( Format('substr index: %d; LOOP COUNT = %d',                          [iStr, loopCount]) );  SetLength( retv, count );  SetLength( results, count );  for j:=0 to count-1 do    results[j] := 0;  for k:=1 to TEST_COUNT do  begin    for j:=0 to count-1 do    begin      func := funcs[j];      tm := GetTickCount;      for i:=1 to loopcount do        retv[j] := func( iStr, SUBSTR, str );      Inc( results[j], GetTickCount - tm );    end;  end;  for j:=0 to count-1 do  begin    Memo1.Lines.Add( Format( '%s: return %d; Timing: %n ms',                            [funcnames[j], retv[j],                            results[j]*1.0/TEST_COUNT ] ) );  end;end;procedure TForm1.Button1Click(Sender: TObject);var  i: integer;begin  for i:=1 to 4 do  begin    Memo1.Lines.Add( Format( '%d:', [i]) );    Tests( [@GetNSubStringPos], ['GetNSubStringPos'], i, 1000 );    Tests( [@PosN_Pos, @PosN_PosEx, @PosN_StrPos],           ['PosN_Pos', 'PosN_PosEx', 'PosN_StrPos'],           i, 100000 );  end;end;procedure TForm1.FormCreate(Sender: TObject);begin  Memo1.Clear;  Memo1.Lines.Add( Format( 'Search "%s" for "%s"', [STR, SUBSTR] ) );end;end.

Unit1.dfm:

object Form1: TForm1  Left = 243  Top = 164  Width = 578  Height = 516  AlphaBlendValue = 192  Caption = 'Form1'  Color = clBtnFace  Font.Charset = DEFAULT_CHARSET  Font.Color = clWindowText  Font.Height = -11  Font.Name = 'MS Sans Serif'  Font.Style = []  OldCreateOrder = False  Position = poDefaultPosOnly  OnCreate = FormCreate  DesignSize = (    570    489)  PixelsPerInch = 96  TextHeight = 13  object Memo1: TMemo    Left = 3    Top = 32    Width = 565    Height = 457    Anchors = [akLeft, akTop, akRight, akBottom]    Lines.Strings = (      'Memo1')    ScrollBars = ssVertical    TabOrder = 0  end  object Button1: TButton    Left = 3    Top = 6    Width = 75    Height = 25    Caption = 'Button1'    TabOrder = 1    OnClick = Button1Click  endend

上一篇:學習MySQL多表操作和備份處理

下一篇:borland工程師如何保證父類(TStream)的兩個overload的seek,至少有一個必須被override

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網(wǎng)友關注

主站蜘蛛池模板: 满洲里市| 南丹县| 乳源| 惠水县| 云浮市| 清流县| 阜平县| 乐至县| 淮北市| 蓝山县| 环江| 定州市| 旬邑县| 宁夏| 白城市| 岑巩县| 京山县| 霍邱县| 嵊州市| 景谷| 重庆市| 洪雅县| 宝山区| 邢台县| 泸水县| 双辽市| 平塘县| 南华县| 左云县| 永兴县| 禄丰县| 墨江| 和龙市| 汝阳县| 阳信县| 永兴县| 昌江| 周宁县| 银川市| 宜丰县| 北辰区|