
- •Цель работы.
- •Изучение и программирование стандартного алгоритма «бинарного поиска».
- •Задание.
- •Задан вектор исходных данных S(N) отсортированный по возрастанию значений его элементов, и алгоритм бинарного поиска индекса Nq, устанавливающего элемент массива S(Nq) = KEY.
- •2. Вставить комментарии к операторам программы;
- •4. Проверить программу Matlab на векторе исходных данных S(10);
- •5. Определить количество вызовов функции binary_search, используя глобальный счетчик (CM);
- •6. Получить листинг, включающий: вектор S(10), значение глобального счетчика CM и время решения задачи;
- •7. Модифицировать программу Matlab, задав исходный вектор S(100). Для этого установить размерность массива N=100;
- •10. Рассчитать коэффициент пропорциональности А между логарифмом размерности вектора и количеством вызовов функции binary_search (CM=А lg N), используя инструмент тренда Excel или другим удобным способом;
- •Таким образом, определили, что A = 3,32 (CM=3,32∙lgN)

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Санкт-Петербургский государственный электротехнический университет "ЛЭТИ"
Факультет электроники Кафедра радиотехнической электроники
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к лабораторной работе №5.2 по дисциплине "Информационные
технологии"
Доцент, к.т.н. |
И.А. Рябцев |
Студент гр.0207 |
Б.И. Маликов |
Санкт-Петербург
2021

Цель работы.
Изучение и программирование стандартного алгоритма «бинарного поиска».
Задание.
Задан вектор исходных данных S(N) отсортированный по возрастанию значений его элементов, и алгоритм бинарного поиска индекса Nq, устанавливающего элемент массива S(Nq) = KEY.
1.Реализовать алгоритм бинарного поиска для вектора исходных данных
S(10) в программе Matlab;
2.Вставить комментарии к операторам программы;
3.Вставить в программу стандартные функции tic, toc для оценки времени
2
решения задачи;
4.Проверить программу Matlab на векторе исходных данных S(10);
5.Определить количество вызовов функции binary_search, используя глобальный счетчик (CM);
6.Получить листинг, включающий: вектор S(10), значение глобального счетчика CM и время решения задачи;
7.Модифицировать программу Matlab, задав исходный вектор S(100). Для этого установить размерность массива N=100;
8.Определить зависимость количество вызовов функции binary_search и время выполнения программы (наибольшее из 20 прогонов программы)для векторов S(10), S(100), S(1000), S(104), S(105), S(106), S(107);
9.Составить таблицу из семи строк (i=1-7), включив столбики с размерностью вектора, логарифмом размерности вектора, временем выполнения сортировки и количеством вызовов функции binary_search;
10.Рассчитать коэффициент пропорциональности А между логарифмом размерности вектора и количеством вызовов функции binary_search (CM=А lg N), используя инструмент тренда Excel или другим удобным способом;
11.Оформить отчет, включив в него тексты программ Matlab, листинг отсортированного вектора S(10), таблицу зависимости количества вызовов функции binary_search и времени решения задачи от размерности вектора. В выводы включить закономерность изменения количества вызовов функции binary_search от логарифма размерности вектора;
Выполнение заданий.
1. Реализуем алгоритм бинарного поиска для вектора исходных данных S(10) в программе Matlab:
Бинарный поиск:
function[M]=binary_search(S, key, low, high) global CM
CM=CM+1; %вычисление вызова функции бинарного поиска
M=fix((low+high)/2);
if (low>high) %накладываем условие: если…, то повтор.
M=-1; return; end
if (S(M)==key) %накладываем условие: если…, то повтор. return;
end
if (S(M)>key)
M=binary_search (S,key,low,M-1); else
M=binary_search (S,key,M+1,high); end
3
end
Выполнение алгоритма:
clear all clc
global CM; %указываем исходные значения
CM=0;
N=10;
nd=2; %указываем значение шага low=1;
high=N;
key=N;
S=ones(1,N); for i=1:N S(i)=i*nd-1; end
tic; %начало отсчета времени
Nq=binary_search(S,key,low,high); toc; %конец отсчета времени disp (S); %вывод результатов disp('Nq=');
disp(Nq); disp('CM='); disp(CM);
Листинг результатов:
Elapsed time is 0.010448 seconds. Nq=
-1
CM=
4
2. Модифицируем программу:
clear all clc global CM CM=0; N=100; nd=2; low=1; high=N; key=N;
S=ones(1,N); for i=1:N S(i)=i*nd-1; end
tic; Nq=binary_search(S,key,low,high); toc;
disp('Nq='); disp(Nq);
4
disp('CM='); disp(CM);
Листинг результатов:
Elapsed time is 0.014646 seconds.
Nq=
-1
CM=
7
1) N=103
Листинг результатов:
Elapsed time is 0.020127 seconds.
Nq=
-1
CM=
10
2) N=104
Листинг результатов:
Elapsed time is 0.036543 seconds.
Nq=
-1
CM=
14
3) N=105
Листинг результатов:
Elapsed time is 0.040041 seconds.
Nq=
-1
CM=
17
4) N=106
5
Листинг результатов:
Elapsed time is 0.063581 seconds.
Nq=
-1
CM=
20
5) N=107
Листинг результатов:
Elapsed time is 0.083340 seconds.
Nq=
-1
CM=
24
3. Составим таблицу:
i |
N |
lg N |
t*10^4, c |
CM |
1 |
10 |
1 |
104,5 |
4 |
2 |
100 |
2 |
146,5 |
7 |
3 |
1000 |
3 |
201,3 |
10 |
4 |
104 |
4 |
365,4 |
14 |
5 |
105 |
5 |
400,4 |
17 |
6 |
106 |
6 |
635,8 |
20 |
7 |
107 |
7 |
833,4 |
24 |
4. Построим график зависимости:
6