Ответить на комментарий

Скорый поиск

Январь 13, 2012 — Шарахов А.П.

Что может быть быстрее бинарного поиска? Другой бинарный поиск.

function Search4b(Val: integer; const Arr: IntegerArray; Right: integer): integer;
var
  Left: integer;
begin;
  Result:=Right shr 1;
  Left:=0;
  if Right>=0 then while true do begin;
    if Val>Arr[Result] then begin;
      Left:=Result+1;
      Result:=(Left + Right) shr 1;
      if Left<=Right then continue else break;
      end
    else if Val<Arr[Result] then begin;
      Right:=Result+(-1);
      Result:=(Left + Right) shr 1;
      if Left<=Right then continue else break;
      end
    else exit;
    end;
  Result:=-1;
  end;

Особенности этого шедевра человеческой мысли:

1. Левая и правая граница поиска включают первый и последний элементы массива, которые могут содержать искомое значение. Кто-то думал, что может быть иначе?
2. Как обычно, наш двоичный поиск содержит три ветки – так алгоритм выглядит проще. Второй переход все равно не предсказывается и на скорость практически не влияет.
3. Мы даже не пытаемся предварительно считать сравниваемый элемент из массива во временную переменную – пусть это сделает компилятор, если сможет.
4. При вычислении новой правой границы используется сложение, а не вычитание, чтобы лишний раз намекнуть компилятору на возможность использования инструкции LEA.
5. Индекс среднего элемента округляется, как принято, влево – в данном случае так проще и быстрее.
6. Вычисление очередного индекса среднего элемента начинается как можно раньше, еще до проверки окончания цикла.
7. Проверка окончания цикла выполняется отдельно для левой и правой ветки, чтобы уменьшить количество переходов.

на главную

Ответить

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <h1> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <pre>, <code>, <asm>, <c>, <cpp>, <delphi>, <drupal5>, <drupal6>, <java>, <javascript>, <php>, <python>, <ruby>, <mytext>. Beside the tag style "<foo>" it is also possible to use "[foo]".

Подробнее о форматировании

CAPTCHA
Ведите текст с изображения. (вводить еще раз после предпросмотра а то не добавится комментарий)
Image CAPTCHA
Copy the characters (respecting upper/lower case) from the image.