Цитата:
Сообщение от madMonia
Специально проверил на этих убогих тестах (хотя и так был уверен в результате), и SubArrPos возвращает последовательно -1, 0, 39 и 3996. Видимо ты опять что-то сделал не так.
Ну и твое рукожопое поделие lArrayPos, никак не может быть быстрее SubArrPos, чтобы убедится в этом достаточно бросить взгляд на код. Ты и с таймингом похоже накосячил. Или смухлевал?
Между прочим, моя SubArrPos дважды взяла приз "лучшая функция для поиска по подмассиву байтов", в 2004 и 2005 на чемпионате мира и его окресностей среди функций. А чем может похвастаться твое исчадие?
|
На счёт того, кто мухлюет.
Почему вы, уважаемый, отредактировали на форуме исходник, но не сообщили об этом ? Не надо заниматься подлогом. У меня ваш исходник из поста с самого начала без изменений имеется. Я в нём ни чего не менял, ни одного пробела. Так почему же вы в тихую изменили свой исходник, умолчали об этом и продолжаете меня обвинять в якобы допущенных ошибках ?
Ваш код имел следующий вид.
Код:
function SubArrayPos(const SubArr, Arr: array of byte; Offset: Integer): Integer;
var
I, LIterCnt, L, J: Integer;
PSubStr, PS: PByte;
begin
L := Length(SubArr);
{ Calculate the number of possible iterations. Not valid if Offset < 1. }
LIterCnt := Length(Arr) - Offset - L;
{ Only continue if the number of iterations is positive or zero (there is space to check) }
if (LIterCnt >= 0) and (L > 0) then
begin
PSubStr := @SubArr[0];
PS := @Arr[0];
Inc(PS, Offset - 1);
for I := 0 to LIterCnt do
begin
J := 0;
while (J >= 0) and (J < L) do
begin
if PS[I + J] = PSubStr[J] then
Inc(J)
else
J := -1;
end;
if J >= L then
Exit(I + Offset);
end;
end;
Result := 0;
end;