我如何高速判断 该字符串是否包含二个--> ?(100分)

  • 主题发起人 主题发起人 13708782004
  • 开始时间 开始时间
1

13708782004

Unregistered / Unconfirmed
GUEST, unregistred user!
35kV小寨变电站-->10kV
35kV小寨变电站-->35kV
35kV小寨变电站-->10kV-->10kV新城区线
35kV小寨变电站-->10kV-->10kV办事处线
35kV小寨变电站-->10kV-->10kV轧钢厂线
35kV小寨变电站-->10kV-->35kV#2主变10kV侧
35kV小寨变电站-->10kV-->10kV备用线024断路器
35kV小寨变电站-->10kV-->10kV石河线
35kV小寨变电站-->10kV-->10kV#2电容器
35kV小寨变电站-->10kV-->10kV分段
35kV小寨变电站-->10kV-->35kV#1主变10kV侧
35kV小寨变电站-->10kV-->10kVII段母线电压互感器
35kV小寨变电站-->10kV-->10kV园区线
35kV小寨变电站-->10kV-->10kV元泰钢铁线
35kV小寨变电站-->10kV-->10kVI段母线电压互感器
35kV小寨变电站-->10kV-->10kV#1电容器
35kV小寨变电站-->10kV-->10kV小铁厂线
35kV小寨变电站-->10kV-->10kV城北线
35kV小寨变电站-->10kV-->10kV大海消线
35kV小寨变电站-->35kV-->35kV#1主变
35kV小寨变电站-->35kV-->35kV母线电压互感器
35kV小寨变电站-->35kV-->35kV#2主变
35kV小寨变电站-->35kV-->站用变
35kV小寨变电站-->35kV-->35kV#2主变35kV侧
35kV小寨变电站-->35kV-->35kV#1主变35kV侧
35kV小寨变电站-->35kV-->35kV321线
35kV月望变电站-->35kV
35kV月望变电站-->10kV
35kV月望变电站-->10kV-->10kV竹园线
二级电站-->0.4kV
二级电站-->10kV
二级电站-->0.4kV-->400V#2号机组线
二级电站-->0.4kV-->0.4kV4071线
一级电站-->0.4kV-->400V#4机组线
一级电站-->0.4kV-->400V#2机组线

我如何高速判断 该字符串是否包含二个--> ?
 
posEx函数 。
 
想出两种算法,不一定高速,
第一种用Pos判断出第一个,然后删掉第一个-->和前面的所有字符,再从剩下的字串中判断是否有第二个
第二种利用字符串是数组的原理,三个字符三个字符的判断,循环次数为字符串的字符个数-2,这种方法感觉相对会快些
 
function judge_dup(str:string):boolean;
var
s:string;
n:integer;
begin
n:=0;
s:='-->';
while pos(s,str)>0 do
begin
n:=n+1;
if n=2 then break;
delete(str,1,pos(s,str)+length(s)-1);
end;
if n=2 then result:=true else result:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(booltostr(judge_dup(二级电站-->0.4kV-->400V#2号机组线')));
end;

end.
 
好,呆我打上 时间断点,测试1000个数据,看看速度如何!是否比 下面的快点
function isTwo(S: string): boolean;
const ScriptCode = '-->';
begin
if pos(ScriptCode, copy(s, pos(ScriptCode, s) + length(ScriptCode), 255)) > 1 then
result := true
else
result :=false;
end;
 
本着寻根问底的精神,发现delphi ,pos 函数效率已经不低了!
procedure _Pos{ substr : ShortString; s : ShortString ) : Integer};
asm
{ ->EAX Pointer to substr }
{ EDX Pointer to string }
{ <-EAX Position of substr in s or 0 }

PUSH EBX
PUSH ESI
PUSH EDI

MOV ESI,EAX { Point ESI to substr }
MOV EDI,EDX { Point EDI to s }

XOR ECX,ECX { ECX = Length(s) }
MOV CL,[EDI]
INC EDI { Point EDI to first char of s }

PUSH EDI { remember s position to calculate index }

XOR EDX,EDX { EDX = Length(substr) }
MOV DL,[ESI]
INC ESI { Point ESI to first char of substr }

DEC EDX { EDX = Length(substr) - 1 }
JS @@fail { < 0 ? return 0 }
MOV AL,[ESI] { AL = first char of substr }
INC ESI { Point ESI to 2'nd char of substr }

SUB ECX,EDX { #positions in s to look at }
{ = Length(s) - Length(substr) + 1 }
JLE @@fail
@@loop:
REPNE SCASB
JNE @@fail
MOV EBX,ECX { save outer loop counter }
PUSH ESI { save outer loop substr pointer }
PUSH EDI { save outer loop s pointer }

MOV ECX,EDX
REPE CMPSB
POP EDI { restore outer loop s pointer }
POP ESI { restore outer loop substr pointer }
JE @@found
MOV ECX,EBX { restore outer loop counter }
JMP @@loop

@@fail:
POP EDX { get rid of saved s pointer }
XOR EAX,EAX
JMP @@exit

@@found:
POP EDX { restore pointer to first char of s }
MOV EAX,EDI { EDI points of char after match }
SUB EAX,EDX { the difference is the correct index }
@@exit:
POP EDI
POP ESI
POP EBX
end;
 
只能循环了。速度应该和硬件有关
 
用COPY和POS函数即可实现。
 
速度=够大的内存,加上够快的CPU,够稳的主板,够转的硬盘
 

Similar threads

I
回复
0
查看
769
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
700
import
I
后退
顶部