4874

Поиск в массивах. Последовательный, бинарный и интерполяционный поиск

Лекция

Информатика, кибернетика и программирование

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

Русский

2012-11-28

48.5 KB

99 чел.

Поиск в массивах. Последовательный, бинарный и интерполяционный поиск.

Под поиском в массиве будем понимать задачу нахождения индекса, по которому в массиве располагается некоторый заданный элемент. Тривиальный алгоритм поиска заключается в последовательном переборе элементов массива до тех пор, пока не будет обнаружен искомый или не будут просмотрены все элементы массива. В случае, когда нет никакой дополнительной информации о характере расположения элементов в массиве, такой алгоритм представляется единственно возможным. Нетрудно подсчитать, что, в худшем случае, для поиска в массиве, состоящем из N элементов, потребуется N операций сравнения. Пример реализации такого алгоритма приведен ниже:

// Последовательный поиск

// A - указатель на массив

// N - размер массива

// d - искомый элемент

int serialSearch( double * A, int N, double d )

{

 // Индекс по умолчанию, при неудачном поиске

 int index = -1;

 

 for ( int i = 0; i < N; ++i )

 {

 // Нашли искомый элемент

 if ( A[i] == d )

 {

  index = i;

  break;

 }

}

 return index;

}

Если известно, что данные в массиве расположены упорядоченно (будем считать, что элементы отсортированы по возрастанию), то можно предложить намного более эффективный способ поиска элементов. Суть метода заключается в том, что после каждой операции сравнения элемента массива с искомым, диапазон поиска сужается по следующим правилам:

  •  если элемент массива оказался больше искомого, будем искать элемент в «левой» половине текущего диапазона;
  •  если элемент массива оказался меньше искомого, будем искать элемент в «правой» половине текущего диапазона;
  •  если элемент массива совпадает с искомым – поиск успешно завершается;
  •  если диапазон поиска на текущем шаге уменьшился до 1 – искомый элемент в массиве отсутствует, поиск завершается.

Понятно, что начинать поиск удобнее всего с элемента, находящегося в середине массива. Поскольку на каждом шаге поиска диапазон сужается в два раза, нетрудно посчитать, что в худшем случае, для поиска в массиве из N элементов потребуется  операций сравнения. Такой алгоритм поиска называют двоичным (или бинарным).

// Бинарный поиск

// A - указатель на массив

// N - размер массива

// d - искомый элемент

int binarySearch( double * A, int N, double d )

{

 // Индекс по умолчанию, при неудачном поиске

 int index = -1;

 

 // Индексы нижней и верхней границы диапазона поиска

 int lowerIndex = 0;

 int upperIndex = N-1;

 

 do

{

 // Середина текущего диапазона поиска

 int midIndex = ( upperIndex + lowerIndex ) / 2;

 // Определяем новый диапазон поиска

 if ( A[ midIndex ] > d )

  upperIndex = midIndex;

 else if ( A[ midIndex ] < d )

  lowerIndex = midIndex;

 else // искомый элемент - в середине текущего диапазона

 {

  index = midIndex;

  break;

 }

}

 while( upperIndex - lowerIndex > 1 );

 return index;

}

Алгоритм бинарного поиска обладает недостатком, связанным с тем, что при вычислении очередного «суженного» диапазона поиска никак не учитывается величина искомого элемента и величины элементов, находящихся на границах интервала. Если предположить, что данные в массиве не только упорядочены, но и распределены достаточно «равномерно», то можно значительно ускорить «сходимость» процесса поиска, осуществляя дробление интервала поиска из следующих неформальных соображений: если предположить, что элементы массива принимают значения от 1 до 1000 и нам необходимо найти число 10, то при первом шаге дробления всего диапазона поиска гораздо эффективнее делить его не пополам (учитывая предположение о «равномерности» распределения данных в массиве, новые интервалы будут содержать значения приблизительно 1-500 и 501-1000), а взять «левый» интервал более узким, т.к. предположительно, число 10 окажется гораздо ближе к левой границе исходного диапазона. Более строго, формулу для вычисления индекса, соответствующего разбиению интервала, можно вывести из следующих простых соображений:

Реализация интерполяционного алгоритма поиска приведена ниже.

// Интерполяционный поиск

// A - указатель на массив

// N - размер массива

// d - искомый элемент

int interpSearch( double * A, int N, double d )

{

 // Индекс по умолчанию, при неудачном поиске

 int index = -1;

 

 // Индексы нижней и верхней границы диапазона поиска

 int lowerIndex = 0;

 int upperIndex = N-1;

 

 do

{

 // Индекс разбиения текущего интервала

 int divIndex = lowerIndex;

 

 // Проверка на "вырожденный" случай

 if ( A[upperIndex] != A[lowerIndex] )

  divIndex = lowerIndex + ( upperIndex - lowerIndex ) * ( d - A[lowerIndex] ) / ( A[upperIndex] - A[lowerIndex] );

 else if ( A[lowerIndex ] != d )

  break;

 // Определяем новый диапазон поиска

 if ( A[ divIndex ] > d )

  upperIndex = divIndex;

 else if ( A[ divIndex ] < d )

  lowerIndex = divIndex;

 else // искомый элемент оказался в точке разбиения

 {

  index = divIndex;

  break;

 }

}

 while( upperIndex - lowerIndex > 1 );

 

 return index;

}


iL

R

iX

AL

AR

X

индексы

значения


 

А также другие работы, которые могут Вас заинтересовать

39444. Создание качественных каналов на направлении Витебск – Глубокое – Браслав 308.5 KB
  В состав аппаратуры входят: оборудование вторичного временного преобразования ВВГ оконечное оборудование линейного тракта ОЛТ необслуживаемые регенерационные пункты НРП а также комплект контрольноизмерительных приборов КИП. Оконечное оборудование линейного тракта обеспечивает согласование выхода оборудования ВВГ с линейным трактом дистанционное питание НРП телеконтроль и сигнализацию о состоянии линейного тракта служебную связь между оконечными и промежуточными пунктами. Оборудование НРП аппаратуры ИКМ120У включает в себя блоки...
39445. Разработка линии связи между ОП1 (Витебск) и ОП2 (Гродно) через ПВ (Лида) 409.5 KB
  Основные параметры системы передачи ИКМ480 Параметр Значение параметра Число организуемых каналов 480 Скорость передачи информации кбит с 34 368 Тип линейного кода КВП3 или ЧПИ Расчетная частота кГц 34 368 Номинальное затухание участка регенерации дБ 65 Номинальное значение тока ДП мА 200 Допустимые значения напряжения ДП В 1300 Максимальное расстояние ОРПОРП 201 км Максимальное число НРП между ОРП 66 Максимальное число НРП в полусекции ДП 33 Номинальная длина регенерационного участка км Комплекс аппаратуры ЦСП ИКМ480...
39447. Цифровая система передачи (ИКМ-120 или ИКМ-480) 397 KB
  В состав аппаратуры ИКМ120у входят аналогоцифровое оборудование формирования стандартных первичных цифровых потоков АЦО оборудование вторичного временного группообразования ВВГ оконечное оборудование линейного тракта ОЛТ необслуживаемые регенерационные пункты НРП. Оконечное оборудование линейного тракта обеспечивает согласование выхода оборудования ВВГ с линейным трактом дистанционное питание НРП телеконтроль и сигнализацию о состоянии линейного тракта служебную связь между оконечными и промежуточными пунктами. Оборудование НРП...
39450. Создание качественных каналов и связи на направлении МИНСК-ГОМЕЛЬ (через БОБРУЙСК) 393 KB
  Расчетная частота кГц 17186 Номинальное затухание участка регенерации дБ 65 Номинальное значение тока ДП мА 200 Допустимое отклонение тока ДП мА 10 Допустимые значения напряжения ДП В 401300В650В относительно земли Максимальное расстояние ОРПОРП 200 км Максимальное число НРП между ОРП 66 Максимальное число НРП в полу секции ДП 33 Комплекс аппаратуры третичной ЦСП ИКМ – 480 предназначен для организации на внутризоновых и магистральной сетях связи пучков каналов по кабелю МКТ – 4 с парами 12 46 мм. ВВГ – оборудование вторичного...
39451. ОПИСАНИЕ ПРИНЦИПА СТРУКТУРНОЙ ЭЛЕКТРИЧЕСКОЙ СХЕМЫ УСТРОЙСТВА СДВИГА ДВОИЧНЫХ ЧИСЕЛ 369.29 KB
  Операция сдвига широко используется в современной вычислительной технике для реализации умножения деления нормализации двоичных чисел с плавающей точкой и т. Поэтому даже в самых ранних ЭВМ использовались так называемые сдвигающие регистры. Такие регистры применяются и в новейших машинах но наряду с ними стали использоваться и комбинационные многоразрядные программируемые сдвигатели Целью данного курсового проекта является формирование начальных умений и навыков самостоятельного проектирования цифровых устройств углубление и...
39452. Создание ЦЛП на направлении Витебск – Бегомль – Лепель 348 KB
  В состав аппаратуры ИКМ120 входят: оборудование вторичного временного группооброзования ВВГ оконечное оборудование линейного тракта ОЛТ необслуживаемые регенерационные пункты НРП а также комплект контрольноизмерительных приборов КИП таких как пульт для испытания линейных трактов и регенераторов ПИЛТ пульт настройки и проверки регенераторов ПНПР пульт измерения затухания кабельной линии ИЗКЛ. Таблица 1 – Основные параметры системы передачи Параметр Значение параметра Число организуемых каналов 120 Скорость передачи информации...