>>合并到一个字符串会导致搜索的时间增加,因为不需要搜索Value。
太简单了:将字符串匹配算法进行改进,改成“跳跃匹配”即可。实际上,只要能够保证
Names的元素长度相同,就可以使用“跳跃匹配”,只将Names合并即可,Values仍然使用数
组(即使Names元素长度不等,我们仍然可以通过在末尾补空格的方法使之等长)。
跳跃匹配算法大致思路:
SubStr: 'ab ,' (length:4)
Str: '123,4 ,aA*,ab ,def,' (length: StrCount*4)
//辅助变量
P1,P2,P01,P02,PStrEnd
Char;
Len,c:Integer;
//init:
Len:=Length(SubStr);
P01:=@SubStr[1];
P02:=@Str[1];
PStrEnd:=@Str[Length(Str)];
repeat
c=0
//匹配计数器清零
P1:=P01
//SubStr指针复位
P2:=P02
//头指针 -> 指针
Inc(P02,Len)
//完成头指针跳跃
while P1^=P2^ do //匹配
begin
Inc(c);
if c=Len then
break;
Inc(P1);
Inc(P2);
end;
if P02>=PStrEnd then //结尾判断
break;
until c=Len;
if c=Len then
Result:=(Integer(PC02)-Integer(PC01)) div Len //成功匹配,返回序号 (>=1)
else
Result:=0
//匹配失败,返回0
算法的平均时间复杂度仅为O(StrCount*K+SubStrLength)(注:K是一个介于1和SubStrLength
之间的系数,它反映了平均要经过多少次匹配才能判定匹配失败,eg:'abc'和'123'只要一
次比较,而'abc'和'abd'则要等到第三位才能发现它们并不匹配。我认为在一般情况下,K
的值应该在1到SubStrLength/3之间)。对于上面的例子字符串,我的算法只要进行8次比较
就可以得到结果。
楼主的意思我始终不明白:又要“尽可能的快”,又要“尽可能少占内存”(这还可以理
解),又强调“次数多不是很多,所以不想用高效容器”——??!!——如果你只是准备
到隔壁房间打三五个来回,你有没有必要为了买什么跑鞋才能跑得更快而大伤脑经??