Академический Документы
Профессиональный Документы
Культура Документы
1
2 ЛИСТИНГИ ПРОГРАММ
1.а) Линейный поиск в неупорядоченном массиве
#include <iostream>
#include <ctime>
#include <conio.h>
#include <iomanip>
#include <math.h>
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;
}
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;
{
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;
{
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
Конец
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
Конец
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
да
sravn = sravn + 1
high = m - 1
low = m + 1
m = (high + low) / 2
9
1
нет
found = 1
да
findbin = m + 1
findbin = 0
Конец
10
findblock(R, n, r, sravn)
h = int(sqrt(double(n)))
sravn = 0
startRange = h - 1
endRange = n - 1
да
findblock = 0
да
нет endRange ≤
startRange - h
да
findblock = 0
startRange = startRange - h + 1
h = int(sqrt(double(h)))
да
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
Конец
12
ГРАФИКИ ЗАВИСИМО СТЕЙ ФВС
Максимальное количество операций сравнения
13
Среднее количество операций сравнения
14
ВЫВОДЫ ПО РАБОТЕ
В результате выполнения работы на тему «Алгоритмы поиска» была
достигнута поставленная цель - изучены алгоритмы поиска элемента в
массиве.
Были рассмотрены следующие алгоритмы поиска:
линейный;
быстрый линейный;
бинарный;
блочный.
Изучены теоретические основы поиска элементов в массивах,
разработаны соответствующие алгоритмы.
Разработана программа на языке С++, реализующая указанные
алгоритмы как для неупорядоченных, так и для упорядоченных массивов.
Выполнено тестирование программы на случайных массивах
различной размерности. Для каждой размерности была проведена серия
испытаний с подсчетом выполненного числа сравнений. По полученным
результатам можно сделать выводы:
наибольшей скоростью поиска обладает бинарный поиск;
наименьшая скорость у быстрого линейного поиска.
Скорость бинарного и блочного поиска практически не зависит от
размера массива.
15