2025 год. Фирма Microsoft представляет собой корпорацию-государство. Билл Гейтс удалился в мир иной, на собрании акционеров выступает новый глава корпорации Вольдемар В. Жириновский:
- Вас обманывают эти подонки из INTEL, в процессоре UltraProPentiumMMX&MCMIX-4 содержатся ошибки, масоны захватили Internet, от работы с "мышью" прогрессирует геморрой, но самое главное - в 1 гигабайте не 1024, а 1023 мегабайта!
function FoundByBinarySearch(
LowIdx,
HighIdx: LongInt;
var Result: LongInt;
const GoalIs: CompareFunc;
var Data;
var Goal
): Boolean;
var
CompVal: CompareResults;
begin
FoundByBinarySearch := FALSE;
if HighIdx < LowIdx then
Exit;
Result := LowIdx + ((HighIdx - LowIdx) div 2);
CompVal := GoalIs(Result, Data, Goal);
if CompVal = BinEqual then
FoundByBinarySearch := TRUEelseif (LowIdx < HighIdx) thenbeginif CompVal = BinLess then
HighIdx := Result - 1
else{CompVal = BinGreater}
LowIdx := Result + 1;
FoundByBinarySearch := FoundByBinarySearch(
LowIdx, HighIdx, Result, GoalIs, Data, Goal)
endelseif (CompVal = BinLess) then
Dec(Result)
end; { function FoundByBinarySearch }
Вот перевод текста на русский язык:
Это реализация алгоритма двоичного поиска в Pascal.
Result: переменная для хранения результата поиска.
GoalIs: функция обратного вызова, сравнивающая значение с цели (значения Data и Goal не определены здесь, но я предполагаю, что они будут переданы в виде аргументов).
Data и Goal: не определены в этом фрагменте кода, но, вероятно, это массив для поиска и целевое значение.
Проверяем, является ли диапазон поиска пустым (HighIdx < LowIdx). Если да, то выходим.
Вычисляем средний индекс диапазона с помощью целочисленного деления.
Сравниваем среднее значение с цели с помощью функции обратного вызова GoalIs. Храним результат в CompVal.
Если сравнениеyieldает точное совпадение (BinEqual), то устанавливаем FoundByBinarySearch в TRUE.
Если не, то корректируем диапазон поиска на основе результата сравнения:
Если среднее значение меньше цели (BinLess), то обновляем HighIdx до значения, которое на один меньше текущего Result.
Иначе, обновляем LowIdx до значения, которое на один больше текущего Result.
Вызываем рекурсивно функцию FoundByBinarySearch с обновленным диапазоном поиска.
Если сравнениеyieldает значение меньше цели (BinLess) и мы не в точном совпадении, то уменьшаем Result.
Замечания
Код предполагает, что функция обратного вызова GoalIs возвращает enum-значение, представляющее результат сравнения: BinEqual, BinLess или BinGreater.
Массив для поиска (Data) и целевое значение (Goal) не определены в этом фрагменте кода, поэтому вам нужно передать их в виде аргументов при вызове функции.
Эта реализация использует рекурсивный подход. Если вы обеспокоены ошибками стека для больших данных, 考虑 использовать итеративный подход вместо этого.
Функция бинарного поиска - алгоритм для нахождения значения в отсортированном массиве, реализованный на примере функции FoundByBinarySearch, которая ищет целевое значение Goal в диапазоне LowIdx-HighIdx с помощью сравнения с элементами массива Data.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.