有个问题我百思不得其解,望高手指教(100分)

看你的//比较两个字串函数有点糊涂

01 和 01 返回是2 还是1?

后面那个空格算不算呢?
 
看看数据结构里的改进kmp算法好吗?
 
我觉的即使是相同的算法delphi的都要比vc的慢
 
to 东问西答,
看看数据结构里的改进kmp算法好吗?

好的 我看看

to: codehunter008,
先不管出来的结果是什么,就是要比较这么多次

to SS2000
这三句是最耗时间的,在两个循环体内,所以,必须优化他们,少一句代码也是好的。
首先,再不大改的基础上,优化为一句
N:=bijiao(TAA.Strings,TBB.Strings);

这样改后可以提高一点点 ,不到5%



 
大数据量可以模拟啊

一个文本文件 每行都弄成1234567890,弄个几万行
另外一个也弄个几万行

可以试试效率
 
你操作的是TStringS,当然很慢了。 我建议你直接用字符串或字符数组。
我曾经用Delphi写过一个语法解析的东西,速度比VC得快上许多。这主要得益于Delphi
对字符串的强大支持。一般100K以内的文本语法解析绝不超过1秒钟。
 
to:wr960204,
改成字符串数组,速度是快了将近50%
但离我同事的VC还差不少,算法是一样的

原来用tstrings, 一个 700行 和一个 60000行的文本比较需要 40秒,每行字符串是15个字符
现在用数组来保存字符串, 比较需要 23秒

继续啊,兄弟们 我一定要打败我同事的VC, 我得目标是 1-5秒搞定这个运算
 
绝对是比较函数不行。里面充满了冗余操作。
 
to:kimfeng,
帮我改改啊
 
function bijiao(const S1, S2: string): integer;
var
I, R: integer;
l: integer;
begin
I := 1;
R := 0;
l:=length(S2);//////这里
while I <= l do
begin
if (S1 = S2) then
Inc(R);
Inc(I);
end;
Result := R;
end;
 
我试过换成数组后
l:=length(S2);//////这里
while I <= l do

又可以 缩短 25% 的 时间
 
问题都没说清楚[:(!]
 
procedure TForm1.Button2Click(Sender: TObject);

var
TAA: array of pchar;
TBB: array of pchar;

I, J, ST, ET, N, NA, NB: integer;
S1, S2: string;
function bijiao(const S1, S2: pchar): integer;
var
I, R: integer;
l: integer;
begin
I := 1;
R := 0;
while s2 <>#0 do
begin
if (S1 = S2) then
Inc(R);
Inc(I);
end;
Result := R;
end;

begin

setlength(TAA, 700);
setlength(TBB, 60000);
for i := 0 to 699 do
TAA := 'fdlknjglkfdnglndflkgnkldf';

for j := 0 to 59999 do
TBB[j] := 'fdlknjglkfdnglndflkgnkldf';

ST := gettickcount;
NA := length(TAA);
NB := length(TBB);

for I := 0 to NA - 1 do
begin
for J := 0 to NB - 1 do
begin
N := bijiao(Taa, Tbb[j]);
end;
Edit3.Text := formatfloat('0%', I / NA * 100);
application.ProcessMessages;
end;
ET := gettickcount;
Edit3.Text := InttoStr(ET - ST) + '毫秒';

end;

十秒以内
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
TAA, TBB: tstringlist;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
I, J, ST, ET, N, NA, NB: integer;
S1, S2: string;
function bijiao(const S1, S2: string): integer;
var
I, R: integer;
begin
I := 1;
R := 0;
while I <= length(S2) do
begin
if (S1 = S2) then
Inc(R);
Inc(I);
end;
Result := R;
end;

begin

ST := gettickcount;
NA := TAA.Count;
NB := TBB.Count;
for I := 0 to NA - 1 do
begin
for J := 0 to NB - 1 do
begin
S1 := TAA.Strings;
S2 := TBB.Strings[J];
N := bijiao(S1, S2);
end;
Edit3.Text := formatfloat('0%', I / NA * 100);
application.ProcessMessages;
end;
ET := gettickcount;
Edit3.Text := InttoStr(ET - ST) + '毫秒';

end;

procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
TAA := tstringlist.Create;
TBB := tstringlist.Create;
for i := 1 to 700 do
TAA.Add('fdlknjglkfdnglndflkgnkldf');

for i := 1 to 60000 do
TBB.Add('fdlknjglkfdnglndflkgnkldf');

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
freeandnil(TAA);
freeandnil(TBB);

end;

procedure TForm1.Button2Click(Sender: TObject);

var
TAA: array of pchar;
TBB: array of pchar;

I, J, ST, ET, N, NA, NB: integer;
S1, S2: string;
function bijiao(const S1, S2: pchar): integer;
var
I, R: integer;
l: integer;
begin
I := 1;
R := 0;
while s2 <>#0 do
begin
if (S1 = S2) then
Inc(R);
Inc(I);
end;
Result := R;
end;

begin

setlength(TAA, 700);
setlength(TBB, 60000);
for i := 0 to 699 do
TAA := 'fdlknjglkfdnglndflkgnkldf';

for j := 0 to 59999 do
TBB[j] := 'fdlknjglkfdnglndflkgnkldf';

ST := gettickcount;
NA := length(TAA);
NB := length(TBB);

for I := 0 to NA - 1 do
begin
for J := 0 to NB - 1 do
begin
N := bijiao(Taa, Tbb[j]);
end;
Edit3.Text := formatfloat('0%', I / NA * 100);
application.ProcessMessages;
end;
ET := gettickcount;
Edit3.Text := InttoStr(ET - ST) + '毫秒';

end;

end.


object Form1: TForm1
Left = 134
Top = 193
Width = 544
Height = 375
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnClose = FormClose
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 232
Top = 72
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
object Edit1: TEdit
Left = 40
Top = 88
Width = 121
Height = 21
TabOrder = 1
Text = 'Edit1'
end
object Edit2: TEdit
Left = 40
Top = 120
Width = 121
Height = 21
TabOrder = 2
Text = 'Edit2'
end
object Edit3: TEdit
Left = 40
Top = 160
Width = 121
Height = 21
TabOrder = 3
Text = 'Edit3'
end
object Button2: TButton
Left = 232
Top = 112
Width = 75
Height = 25
Caption = 'Button2'
TabOrder = 4
OnClick = Button2Click
end
end


 
to: wlmmlw,
哪里不清楚?
 
你最初的代码 Button1 34540毫秒
5638毫秒 Button2
 
//比较两个字串
function bijiao(const S1,S2:string):integer;
var
I:integer;
begin
Result:= 0;
for i := 1 to length(S2) do
if S1 = S2 then
Inc(Result)
else
break;//一定要加,不要做无谓的计算
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
TAA:=tstringlist.Create;
TBB:=tstringlist.Create;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TAA.Free;
TBB.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if opendialog1.Execute then
TAA.LoadFromFile(opendialog1.FileName);
Edit1.Text:=inttoStr(TAA.Count);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if opendialog1.Execute then
TBB.LoadFromFile(opendialog1.FileName);
Edit2.Text:=inttoStr(TBB.Count);
end;


procedure TForm1.Button3Click(Sender: TObject);
var
I,J,ST,ET,N,NA,NB:integer;
S1,S2:string;
begin

ST:=gettickcount;
NA:=TAA.Count;
NB:=TBB.Count;
for I:=0 to NA-1 do
begin
S1:=TAA.Strings;
for J:=0 to NB-1 do
begin
S2:=TBB.Strings[J];
N:=bijiao(S1,S2);
end;
Edit3.Text:=formatfloat('0%',I/NA*100);
application.ProcessMessages;
end;
ET:=gettickcount;
Edit3.Text:=InttoStr(ET-ST)+'毫秒';
end;
 
to: hfghfghfg,

我得电脑 19秒 是PIII 1G
同样的vc程序在我的电脑上 只要几秒
 
sorry 写错了一处

function bijiao(const S1, S2: pchar): integer;
var
I, R: integer;
l: integer;
begin
I := 1; //这里应为0
R := 0;
 
to songmk:

我的机子还不如你的呢!
不会吧,把你的代码贴出来

 

Similar threads

回复
0
查看
864
不得闲
D
回复
0
查看
920
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部