Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на вопросы по информатике.doc
Скачиваний:
85
Добавлен:
10.05.2014
Размер:
594.94 Кб
Скачать

23 Алгоритмы поиска и выборки элементовиз массивов данных. Двоичный (бинарный) поиск элемента в массиве

Если у нас есть массив, содержащий упорядоченную последовательность данных, то очень эффективен двоичный поиск.

Переменные Lb и Ub содержат, соответственно, левую и правую границы отрезка массива, где находится нужный нам элемент. Мы начинаем всегда с исследования среднего элемента отрезка. Если искомое значение меньше среднего элемента, мы переходим к поиску в верхней половине отрезка, где все элементы меньше только что проверенного. Другими словами, значением Ub становится (M – 1) и на следующей итерации мы работаем с половиной массива. Таким образом, в результате каждой проверки мы вдвое сужаем область поиска. Так, в нашем примере, после первой итерации область поиска – всего лишь три элемента, после второй остается всего лишь один элемент. Таким образом, если длина массива равна 6, нам достаточно трех итераций, чтобы найти нужное число.

Двоичный поиск - очень мощный метод. Если, например, длина массива равна 1023, после первого сравнения область сужается до 511 элементов, а после второй - до 255. Легко посчитать, что для поиска в массиве из 1023 элементов достаточно 10 сравнений.

Function BinSearch (a:array;Lb,Ub:integer;Key:integer);

Var done:Boolean;

M:integer;

Begin

While not done do

Begin

M:= round((Lb + Ub)/2);

If (key<a[m] then

Ub:=m-1

Else if (key>a[m]) then

Lb:=m+1

Else BinSearch:=m;

If (Lb>Ub) then done:=true;

end;

End;

Интерполяционный поиск элемента в массиве

Представьте себе, что Вы ищете слово в словаре. Маловероятно, что Вы сначала загляните в середину словаря, затем отступите от начала на 1/4 или 3/4 и т.д, как в бинарном поиске.

Если нужное слово начинается с буквы 'А', вы наверное начнете поиск где-то в начале словаря. Когда найдена отправная точка для поиска, ваши дальнейшие действия мало похожи на рассмотренные выше методы.

Если Вы заметите, что искомое слово должно находиться гораздо дальше открытой страницы, вы пропустите порядочное их количество, прежде чем сделать новую попытку. Это в корне отличается от предыдущих алгоритмов, не делающих разницы между 'много больше' и 'чуть больше'.

Мы приходим к алгоритму, называемому интерполяционным поиском: Если известно, что К лежит между KlиKu, то следующую пробу делаем на расстоянии (u-l)(K-Kl)/(Ku-Kl) отl, предполагая, что ключи являются числами, возрастающими приблизительно в арифметической прогрессии.

Интерполяционный поиск работает за loglogNопераций, если данные распределены равномерно. Как правило, он используется лишь на очень больших таблицах, причем делается несколько шагов интерполяционного поиска, а затем на малом подмассиве используется бинарный или последовательный варианты.

// Поиск в массиве K[1..N] числа X интерполяционным поиском

find:=false;

FindPos:=-1;

L:=1; u:=N;

while(u>=l)

begin

i=L+(u-L)*(X-K[l])/(K[u]-K[L]);

if(X<K[i]) then u=i-1

else if(X>K[i]) then l=i+1

else begin

find:=true;

FindPos:=I;

End;

24 Алгоритмы сортировки данных. Критерии эффективности работы алгоритма .Сортировка выбором. Сортировка пузырьком. Сортировка простыми вставками. Сортировка Шелла. Сортировка пирамидальная. Сортировка быстрая. Сортировка поразрядная.

Алгоритм сортировки — это алгоритм для упорядочения элементов в списке. В случае, когда элемент списка имеет несколько полей, поле, служащее критерием порядка, называется ключом сортировки. На практике, в качестве ключа часто выступает число, а в остальных полях хранятся какие-либо данные, никак не влияющие на работу алгоритма.

Соседние файлы в предмете Информатика