Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОМП. НАУКИ_1сем.doc
Скачиваний:
6
Добавлен:
05.11.2018
Размер:
902.14 Кб
Скачать
    1. Поиск заданного элемента в массиве

Задача поиска состоит в том, чтобы определить индекс элемента, значение которого равно заданному аргументу поиска. Решение этой задачи зависит от того, упорядочен массив или нет:

  • линейный поиск используется в неупорядоченных массивах;

  • бинарный поиск можно применять только в упорядоченных массивах.

Анализ методов поиска по количеству операций сравнения

Линейный поиск в массиве из N элементов:

  • в среднем требует [N/2] сравнений значений элементов массива с искомым значением,

  • в худшем случае N сравнений (когда искомый элемент является последним элементом массива).

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

  • в худшем случае требует [log2 N] сравнений.

const n=50; //Глобальная константа, используется во всех подпрограммах type vector=array[1..n] of integer;// Пусть задан для примера такой тип одномерных массивов

function LinSearch(const V: vector; B:integer):integer;

// ЛИНЕЙНЫЙ ПОИСК индекса первого из элементов, удовлетворяющих условию поиска.

// Последовательно проверяются все элементы массива. Если элемент не найден, функция возвращает -1

var i, n:integer;

begin

Result:=-1; //Пока элемент не найден

i:=1;

repeat

if (V[i]=B) then Result:=i //Запомним индекс первого найденного элемента

i:=i+1

until (i>n) or (Result>0) //Выход либо по концу массива, либо найден элемент

end;

function BinSearch(const V:array of integer; b:integer):integer;

// БИНАРНЫЙ ПОИСК индекса первого из элементов, удовлетворяющих условию поиска.

//Бинарный поиск применим только в упорядоченных массивах, для определенности пусть массив не убывает.

//Массив делится пополам, средний элемент массива сравнивается с искомым значением.

//Если они равны, то поиск заканчивается.

//Если средний элемент меньше искомого, то все элементы левее его также меньше искомого, искать следует правее

//среднего элемента.

//Если средний элемент больше искомого, то все элементы правее его также больше искомого, искать следует левее

//среднего элемента.

//На каждом шаге зона поиска уменьшается вдвое.

//Поиск прекращается, когда либо элемент найден, либо массив исчерпан.

var i,L,R:integer;

begin

Result:=-1; //Пока элемент не найден

L:=1; //Левая текущая граница зоны поиска в массиве

R:=n; //Правая текущая граница зоны поиска в массиве

while (L<=R) and (Result=-1) do

begin

i:=(L+R) div 2; //Индекс среднего элемента

if V[i]=b then Result:=i //Элемент найден, его индекс равен i

else if V[i] < b //Если средний элемент меньше искомого,

then L:=i+1 //то будем искать правее среднего элемента

else R:=i-1 //иначе будем искать левее среднего элемента

end

end;

    1. Схема Горнера и ее применение для вычисления полиномов

Дан полином

f(x)=a0xn + a1xn-1 + a2xn-2 + … + an-2x2 + an-1x + an

Идея схемы Горнера – вынести за скобки все, что можно.

f(x)=(…(((a0x + a1)x + a2)x + a3)…)x + an

Вычисление происходит «изнутри»:

p1 = a0x + a1 p2 = p1x + a2 p3 = p2x + a3 … pn = pn-1 + an В результате pn = f(x)

Коэффициенты полинома ai поместим в массив с индексами от 0 до n. Массив опишем с запасом.

program Polinom;

Const m=100;

var n : integer; //Степень полинома

A : array[0..m] of real; //Массив коэффициентов полинома

f : real; //Значение полинома

begin

// 1. Ввод степени полинома

repeat

write(‘Степень полинома=’); readln(n)

until n <=m;

// 2. Ввод коэффициентов полинома

for i:=0 to n do

read(A[i]);

// 3. Ввод значения x

write(‘x=’); readln(x);

// 4. Вычисление значения полинома в точке x

f := A[0];

for i:=1 to n do

f:=f*x + A[i];

writeln(’Значение полинома=’, f:8:3)

end.

Пример. Подсчитать S – общее количество секунд, если дано:

A[0] – количество секунд, A[1] – количество минут, A[2] – количество часов, A[3] – количество полных суток

A[4] – количество недель.

S= A[4]*7*24*60*60 + A[3]*24*60*60 + A[2]*60*60 + A[1]*60 + A[0]

Это выражение содержит 14 операций.

Вычисление по схеме Горнера требует 8 операций:

S = (((A[4]*7 + A[3])*24 + A[2])*60 + A[1])*60 + A[0]