X
xysir001
Unregistered / Unconfirmed
GUEST, unregistred user!
我有这样一个程序:起循环次数超过10亿次,在循环过程中,有数据的读取、比较判断、数据的输出。(字符串)数据的读取和输出都是从Memo控件,没次循环都要经过这样的过程。
我曾经试验了一下,在一个有10多亿次的循环中,用了16个小时都没运算完?
请问:有什么方法能提高程序的运算速度?
请大家帮我优化优化。
代码如下:(是用的线程)
unit Unit2;
interface
uses
Classes, SysUtils, StrUtils;
type
ThrJS = class(TThread)
private
{ Private declarations }
protected
procedure Execute
override;
end;
implementation
uses Unit1;
{ ThrJS }
procedure ThrJS.Execute;
var
n,r,r1,r2,r3,r4,m,flag,gs,bznum:integer;
CombStr,UStr:string;
tmpStrings, tmpStrings1 : TStrings;
begin
FreeOnTerminate := true;
Form1.Animate1.Active := true;
r:=strtoint(Form1.edit2.Text);
gs:=strtoint(form1.Edit3.Text);
bznum:=strtoint(form1.edit4.text);
n:=form1.memo1.Lines.Count;
form1.Edit1.Text:=inttostr(form1.Memo1.Lines.Count);
tmpStrings := TStringList.Create;
tmpStrings := Form1.Memo1.Lines
//memo1中为原始数据,是一些字符串(后面参与组合)
tmpStrings1 := Form1.Memo4.Lines
//memo4中为标准数据,是一些字符串
begin
try
for r1:=n-1 downto r-1 do
for r2:=r1-1 downto r-2 do
for r3:=r2-1 downto r-3 do
for r4:=r3-1 downto 0 do
begin
CombStr:=tmpStrings[r1]+' '+tmpStrings[r2]+' '+tmpStrings[r3]+' '+tmpStrings[r4];
flag:=0;
UStr:='';
//上面这段代码为求一个C(n,r)的组合,其中参与组合的数据是一些字符串;n为500左右,r=4(在这里)
for m:=0 to bznum do
if flag<gs+1 then
if not AnsiContainsText(CombStr,tmpStrings1.Strings[m]) then
begin
UStr:=UStr+tmpStrings1.Strings[m]+' ';
inc(flag);
end;
//上面这段代码为:每个新组合的字符串与标准数据比较。
if flag=gs then
begin
UStr:=trimright(UStr);
if not AnsiContainsStr(Form1.Memo2.Lines.Text,UStr) then
form1.Memo2.Lines.Add(UStr);
end;
end;
//上面这段代码:如果flag=gs,再判断UStr是否已经在memo2中。如果存在,则不保存;如果不存在,则保存在//memo2中。(memo2中的数据是越来越多)
finally
Form1.Animate1.Active := false;
end;
end;
end;
end.
我曾经试验了一下,在一个有10多亿次的循环中,用了16个小时都没运算完?
请问:有什么方法能提高程序的运算速度?
请大家帮我优化优化。
代码如下:(是用的线程)
unit Unit2;
interface
uses
Classes, SysUtils, StrUtils;
type
ThrJS = class(TThread)
private
{ Private declarations }
protected
procedure Execute
override;
end;
implementation
uses Unit1;
{ ThrJS }
procedure ThrJS.Execute;
var
n,r,r1,r2,r3,r4,m,flag,gs,bznum:integer;
CombStr,UStr:string;
tmpStrings, tmpStrings1 : TStrings;
begin
FreeOnTerminate := true;
Form1.Animate1.Active := true;
r:=strtoint(Form1.edit2.Text);
gs:=strtoint(form1.Edit3.Text);
bznum:=strtoint(form1.edit4.text);
n:=form1.memo1.Lines.Count;
form1.Edit1.Text:=inttostr(form1.Memo1.Lines.Count);
tmpStrings := TStringList.Create;
tmpStrings := Form1.Memo1.Lines
//memo1中为原始数据,是一些字符串(后面参与组合)
tmpStrings1 := Form1.Memo4.Lines
//memo4中为标准数据,是一些字符串
begin
try
for r1:=n-1 downto r-1 do
for r2:=r1-1 downto r-2 do
for r3:=r2-1 downto r-3 do
for r4:=r3-1 downto 0 do
begin
CombStr:=tmpStrings[r1]+' '+tmpStrings[r2]+' '+tmpStrings[r3]+' '+tmpStrings[r4];
flag:=0;
UStr:='';
//上面这段代码为求一个C(n,r)的组合,其中参与组合的数据是一些字符串;n为500左右,r=4(在这里)
for m:=0 to bznum do
if flag<gs+1 then
if not AnsiContainsText(CombStr,tmpStrings1.Strings[m]) then
begin
UStr:=UStr+tmpStrings1.Strings[m]+' ';
inc(flag);
end;
//上面这段代码为:每个新组合的字符串与标准数据比较。
if flag=gs then
begin
UStr:=trimright(UStr);
if not AnsiContainsStr(Form1.Memo2.Lines.Text,UStr) then
form1.Memo2.Lines.Add(UStr);
end;
end;
//上面这段代码:如果flag=gs,再判断UStr是否已经在memo2中。如果存在,则不保存;如果不存在,则保存在//memo2中。(memo2中的数据是越来越多)
finally
Form1.Animate1.Active := false;
end;
end;
end;
end.