Алгоритм дихотомического поиска

Дихотомический поиск значительно быстрее, чем линейный поиск, который заключается в том, чтобы сравнивать с элементами в списке последовательно, если только список не очень короткий или если искомый элемент находится во главе списка, что обычно не предсказуемо.

Этот алгоритм работает на упорядоченном наборе и использует приказ для управления поиском. Слово дихотомия происходит от греческого διχοτόμηση что означает: разрезать пополам.

Язык C++ обеспечивает binary_search функцию в библиотеке STL.
У . NET Framework аналогичные функции в базовых библиотеках (System.Array).
Приведенный ниже общий код не должен вызывать проблем в других языках программирования.

Принцип алгоритма

Как быстро найти слово Untel в словаре? Открываем книгу посередине и попадаешь на слова, начинающиеся с м, буквы, которые находятся в центре словаря. Видно, что untel не может быть в первой половине, поэтому мы ограничиваем поиск второй, которая идет от m до z.
Поэтому мы откладываем первую половину и делаем те же рассуждения о второй и так далее по каждой новой части, мы постепенно сокращаем список, переходя либо в левую, либо в правую часть, чтобы неизбежно добраться до страницы, содержащей искомое слово.

Дихотомический принцип поиска может быть обобщен для любого типа проблем, поскольку объекты поля поиска могут сформировать последовательность и можно провести сравнение порядка в последовательности.

Реализовать алгоритм на компьютере легко благодаря рекурсивности, но и он может реализоваться итеративно.

Рекурсивная версия

Базовый код (скриптол):

array A = []

int binarySearch(int value, int starting, int ending)
  if ending < starting return -1
  int mid = (starting + ending)  / 2	
  if A[mid]
      = value :     return mid
      > value :     ending = mid - 1
      < value :     starting = mid + 1   
  /if	 
return  binarySearch(value, starting, ending)

Таблица A просматривается как глобальная переменная, что значительно ускоряет выполнение сценария, а переменные индекса запуска и ending используются для выбора постепенно уменьшенного фрагмента массива.

Применение к текстовой таблице

Код алгоритма:

int binarySearch(text value, int starting, int ending)
  if ending < starting return -1
  int mid = (starting + ending)  / 2
  int result = strcmp(value, A[mid])  	

  if result
  = 0 :  return mid
  < 0 :  ending = mid - 1
  > 0 :  starting = mid + 1   
  /if
return  binarySearch(value, starting, ending) 

Изменилась только функция сравнения. Функция strcmp возвращает 0, когда строки идентичны, число меньше 0, если первая классифицируется до второй, и больше 0, если нет.

Итеративная версия

Базовый код (скриптол):

int binarySearch(int value, array A)
  int starting = 0
  int ending = A.size() 
  int mid
  int length
  
  while forever  
      if starting > ending return -1   
      length = ending - starting 

      if length = 0
          if value = A[starting] return starting
          return -1 
       /if	 
      mid = starting + int(length / 2)

      if value 
          < A[mid] : ending = mid - 1
          > A[mid] : starting = mid + 1
      else
           return mid
      /if
  /while
return -1

Пример использует массив в качестве параметра функции, но его можно также использовать как глобальную переменную, как и рекурсивный алгоритм.