Вы находитесь на странице: 1из 15

1 ПО СТАНОВКА ЗАДАЧИ

1. Изучить алгоритмы поиска:


1) в неупорядоченном массиве:
а) линейный;
б) быстрый линейный;
2) в упорядоченном массиве:
а) быстрый линейный;
б) бинарный;
в) блочный.
2. Разработать и программно реализовать средство для проведения
экспериментов по определению временных характеристик алгоритмов
поиска.
3. Провести эксперименты по определению временных характеристик
алгоритмов поиска. Результаты экспериментов представить в виде таблиц 1 и
2. Клетки таблицы 1 содержат максимальное количество операций сравнения
при выполнении алгоритма поиска, а клетки таблицы 2 – среднее число
операций сравнения.

1
2 ЛИСТИНГИ ПРОГРАММ
1.а) Линейный поиск в неупорядоченном массиве
#include <iostream>
#include <ctime>
#include <conio.h>
#include <iomanip>
#include <math.h>

using namespace std;

void zapolniSluch(int *a, int n)


{
int i;
for (i = 0; i < n; i++)
a[i] = rand() % 1001 - 500;
}
int findlin(int *R, int n, int r, int *sravn)
{
int i;
*sravn = 0;
for (i = 0; i < n; i++)
if (R[i] == r)
return i + 1;
else
(*sravn)++;
return 0;
}
{
i = findlin(a, n[k], fel, &sravn);
cout << "Линейный поиск" << endl;
if (i == 0)
cout << "элемента " << fel << " в массиве нет"
<< endl;
else
cout << "элемент " << fel << " в позиции " <<
i << endl;
}

1.б) Быстрый линейный поиск в неупорядоченном массиве


#include <iostream>
#include <ctime>
#include <conio.h>
#include <iomanip>
#include <math.h>

using namespace std;

void zapolniSluch(int *a, int n)


{
int i;
for (i = 0; i < n; i++)
a[i] = rand() % 1001 - 500;

2
}
int findlinb(int *R, int n, int r, int *sravn, bool is_upor)
{
int i;
R[n] = r;
i = 0;
*sravn = 0;
while (R[i] != r)
{
(*sravn)++;
if (is_upor)
if (r < R[i])
{
i = n;
break;
}
i++;
}
if (i < n)
return i + 1;
else
return 0;
}
{i = findlinb(a, n[k], fel, &sravn, false);
cout << "Быстрый линейный поиск" << endl;
if (i == 0)
cout << "элемента " << fel << " в массиве нет"
<< endl;
else
cout << "элемент " << fel << " в позиции " <<
i << endl;
}

2.а) Быстрый линейный поиск в упорядоченном массиве


#include <iostream>
#include <ctime>
#include <conio.h>
#include <iomanip>
#include <math.h>

using namespace std;

void SortPV(a, n[k]);


{
int i;
for (i = 0; i < n; i++)
a[i] = rand() % 1001 - 500;
}
int findlinb(int *R, int n, int r, int *sravn, bool is_upor)
{
int i;
R[n] = r;
i = 0;
*sravn = 0;
while (R[i] != r)
{

3
(*sravn)++;
if (is_upor)
if (r < R[i])
{
i = n;
break;
}
i++;
}
if (i < n)
return i + 1;
else
return 0;
}
{
i = findlinb(a, n[k], fel, &sravn, true);
cout << "Быстрый линейный поиск" << endl;
if (i == 0)
cout << "элемента " << fel << " в массиве нет"
<< endl;
else
cout << "элемент " << fel << " в позиции " <<
i << endl;

2.б) Бинарный поиск в упорядоченном массиве


#include <iostream>
#include <ctime>
#include <conio.h>
#include <iomanip>
#include <math.h>

using namespace std;

void zapolniSluch(int *a, int n)


{
int i;
for (i = 0; i < n; i++)
a[i] = rand() % 1001 - 500;
}
int findbin(int *R, int n, int r, int *sravn)

{
int found = 0;
int high = n - 1, low = 0;
int m = (high + low) / 2;
*sravn = 0;
while (found == 0 && high >= low)
{
if (r == R[m])
{
(*sravn)++;
found = 1;
break;
}

4
else
if (r < R[m])
{
(*sravn)++;
high = m - 1;
}
else
{
low = m + 1;
}
m = (high + low) / 2;
if (high < low)
break;
}
if (found == 1)
return m + 1;
else
return 0;
}
{i = findbin(a, n[k], fel, &sravn);
cout << "Бинарный поиск" << endl;
if (i == 0)
cout << "элемента " << fel << " в массиве нет"
<< endl;
else
cout << "элемент " << fel << " в позиции " <<
i << endl;

2.в) Блочный поиск в упорядоченном массиве


#include <iostream>
#include <ctime>
#include <conio.h>
#include <iomanip>
#include <math.h>

using namespace std;

int findblock(int *R, int n, int r, int *sravn)

{
int startRange, endRange, h;
h = int(sqrt(double(n)));
startRange = h - 1;
endRange = n - 1;
*sravn = 0;
if (r > R[n - 1] || r < R[0])
return 0;
while (1)
{
if (startRange > endRange)
{
if (endRange <= startRange - h)
return 0;

5
else
{
startRange = startRange - h + 1;
h = int(sqrt(double(h)));
}
}
else
{
if (r > R[startRange])
{
(*sravn)++;
startRange = startRange + h;
continue;
}
if (r == R[startRange])
{
return startRange + 1;
}
if (r < R[startRange])
{
(*sravn)++;
endRange = startRange - 1;
startRange = startRange - h + 1;
h = int(sqrt(double(h)));
}
}
}
}
int rand_el(int *a, int n)
{
int i;
i = rand() % (n);
return a[i];
}
{i = findblock(a, n[k], fel, &sravn);
cout << "Блочный поиск" << endl;
if (i == 0)
cout << "элемента " << fel << " в массиве нет"
<< endl;
else
cout << "элемент " << fel << " в позиции " <<
i << endl;
}

6
3 БЛОК-СХЕМЫ ПРОГРАММ

findlin(R, n, r, sravn)

sravn = 0

i = 0, n - 1

да
R[i] = r

нет
sravn = sravn + 1

findlin = i + 1

findlin = 0

Конец

Рисунок 1- Блок - схема алгоритма линейного поиска

7
findlinb(R, n, r, sravn, is_upor)

sravn = 0
R[n] = r
i=0

R[i] ≠ r да

нет

sravn = sravn + 1

нет is_upor и
r < R[i]

да

i=n

i=i+1

нет
i<n

да
findlinb = i + 1

findlinb = 0

Конец

Рисунок 2- Блок - схема алгоритма быстрого линейного поиска

8
findbin(R, n, r, sravn)

found = 0
sravn = 0

low = 0
high = n - 1
m = (high + low) / 2

found = 0 и нет
high ≥ low

да
нет
r = R[m]

да

sravn = sravn + 1
found = 1

нет r < R[m]

да

sravn = sravn + 1
high = m - 1

low = m + 1

m = (high + low) / 2

high < low

9
1

нет
found = 1

да
findbin = m + 1

findbin = 0

Конец

Рисунок 3- Блок - схема алгоритма бинарного поиска

10
findblock(R, n, r, sravn)

h = int(sqrt(double(n)))
sravn = 0

startRange = h - 1
endRange = n - 1

нет r > R[n - 1] или


r < R[0]

да
findblock = 0

нет startRange >


endRange

да

нет endRange ≤
startRange - h

да
findblock = 0

startRange = startRange - h + 1
h = int(sqrt(double(h)))

r > R[startRange] нет

да

sravn = sravn + 1
startRange = startRange + h

2 3

11
1 2 3

нет
r = R[startRange]

да
findblock = startRange + 1;

нет
r < R[startRange]

да
endRange = startRange - 1
startRange = startRange - h + 1

h = int(sqrt(double(h)))
sravn = sravn + 1

Конец

Рисунок 4- Блок - схема алгоритма блочного поиска

12
ГРАФИКИ ЗАВИСИМО СТЕЙ ФВС
Максимальное количество операций сравнения

Алгоритмы по- Количество элементов в массиве


иска (см.п.1) 50 100 150 200 250 300 350 400 450
1.а 100 200 300 400 500 600 700 800 900
1.б 51 101 151 201 251 301 351 401 451
2.а 50 100 150 200 250 300 350 400 450
2.б 16 19 22 22 22 25 25 25 25
2.в 16 21 25 29 33 36 38 41 44

13
Среднее количество операций сравнения

Алгоритмы по- Количество элементов в массиве


иска (см.п.1) 50 100 150 200 250 300 350 400 450
1.а 78 165 253 327 407 494 573 650 738
1.б 39 78 116 156 196 235 272 310 355
2.а 25 47 76 99 121 153 173 202 225
2.б 12 14 16 17 17 18 19 19 19
2.в 10 14 17 20 22 23 25 27 29

14
ВЫВОДЫ ПО РАБОТЕ
В результате выполнения работы на тему «Алгоритмы поиска» была
достигнута поставленная цель - изучены алгоритмы поиска элемента в
массиве.
Были рассмотрены следующие алгоритмы поиска:
 линейный;
 быстрый линейный;
 бинарный;
 блочный.
Изучены теоретические основы поиска элементов в массивах,
разработаны соответствующие алгоритмы.
Разработана программа на языке С++, реализующая указанные
алгоритмы как для неупорядоченных, так и для упорядоченных массивов.
Выполнено тестирование программы на случайных массивах
различной размерности. Для каждой размерности была проведена серия
испытаний с подсчетом выполненного числа сравнений. По полученным
результатам можно сделать выводы:
 наибольшей скоростью поиска обладает бинарный поиск;
 наименьшая скорость у быстрого линейного поиска.
Скорость бинарного и блочного поиска практически не зависит от
размера массива.

15

Оценить