Вверх ↑
Разработчик
Ответов: 26255
Рейтинг: 2140
#1: 2010-04-27 17:49:17 ЛС | профиль | цитата
Tad, последняя редакция функции, оптимизировал, дальше некуда. У меня результат умопомрачительный, на трех символах поиска ("08) время чтения всего 13 msec, причем, все остальные показываеют паршивый результат



Add(InlineCode,2508260,469,469)
{
@Hint=#15:New Boyer-Moore|
WorkPoints=#5:doPos|
EventPoints=#5:onPos|
DataPoints=#4:text|6:sbtext|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|9: public|33: onPos,text,sbtext:THI_Event;|5: |50: procedure doPos(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|71:function PosABM(const SubStr, S: string; Offset: Integer = 1): Integer;|3:var|22: lp, ls, i : integer;|12: chr: Char;|31: BMT: array[Char] of integer; |5:begin|18: ls := Length(S);|23: lp := Length(SubStr);|28: Result := Offset + lp - 1;|19: chr := SubStr[1];|8: |28: if Length(SubStr) > 1 then|7: begin|24: for i := 0 to 255 do|29: BMT[char(i)] := lp; |29: for i := 1 to (lp - 1) do|31: BMT[SubStr[i]] := lp - i;|0:|25: while Result <= ls do|9: begin|38: if (SubStr[lp] = S[Result]) then|35: for i := lp - 1 downto 1 do|51: if (SubStr[i] <> S[Result - lp + i]) then|17: Break|28: else if i = 1 then|15: begin|38: Result := Result - lp + 1;|17: Exit;|14: end;|40: Result := Result + BMT[S[Result]];|22: end; |7: end |6: else|25: while Result <= ls do|32: if (chr <> S[Result]) then|28: Result := Result + 1|11: else |13: Exit;|14: Result := 0;|4:end;|0:|28:procedure THiAsmClass.doPos;|3:var|16: sst,sb:string;|20: sp, ep, cnt:int64;|16: ps: integer; |5:begin|37: Sb := ReadString(_Data,sbtext,'');|36: Sst := ReadString(_Data,text,'');|31: QueryPerformanceCounter(sp);|26: Ps := PosABM(sb,sst,3);|31: QueryPerformanceCounter(ep);|34: QueryPerformanceFrequency(cnt);|26: cnt := cnt div 1000000;|76: _hi_onEvent(onPos, int2str(Ps) + ';' + int2str(integer((ep-sp) div cnt)));|4:end;|0:|4:end.|
AddHint(-103,46,100,13,@Hint)
}

карма: 22

0