Показать сообщение отдельно
  #20  
Старый 27.03.2014, 19:26
Аватар для seeman_tm
seeman_tm seeman_tm вне форума
Новичок
 
Регистрация: 03.02.2011
Сообщения: 79
Репутация: -2306
По умолчанию

Цитата:
Сообщение от 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;
Ответить с цитированием