Uploaded by reina.shotgun

Laboratornaya rabota 2.1

advertisement
Лабораторная работа №2
ИССЛЕДОВАНИЕ И ОЦЕНКА АЛГОРИТМОВ ПОИСКА
Цель работы. Разработка программ, реализующих различные алгоритмы
поиска, и оценка их временной и пространственной сложности.
Алгоритм линейного поиска
Наш код:
#include <iostream>
#include <ctime>
using namespace std;
int i, N;
//линейный поиск
int LineSearch(int A[], int key)
{
for (i = 0; i < N; i++)
if (A[i] == key) return i;
return -1;
}
long start = clock();
void main()
{
setlocale(LC_ALL, "Rus");
int key, A[1000];
srand(time(NULL));
cout << "Размер массива > "; cin >> N;
cout << "Искомый элемент > "; cin >> key;
cout << "Исходный массив: ";
for (i = 0; i < N; i++)
{
A[i] = rand() % 10;
cout << A[i] << " ";
}
if (LineSearch(A, key) == -1) cout << "\nЭлемент не найден";
else cout << "\nНомер элемента: " << LineSearch(A, key) + 1;
long end = clock(); //Конец отсчёта времени работы алгоритма
long traceTime = end - start;
cout << traceTime << " наносекунд " << endl;
system("pause>>void");
}
Словесное описание заданного алгоритма поиска:
• Начало алгоритма.
• Определяем переменные i, N.
• Задаём линейный поиск.
4.Заполняем массив случайными числами с помощью цикла for() и функции
rand() .
5. С помощью линейного метода поиска найдём искомый элемент в массиве.
6. Выводим результат.
7. Конец алгоритма.
Вообще для циклов вида:
Оценка пространственной (емкостной) сложности
Такая оценка выполняется аналогично временной. При этом если для
реализации алгоритма требуется дополнительная память для одной, двух или
трех переменных, то емкостная сложность алгоритма будет константной, т.е.
О(1). Такую сложность имеет, например, рассмотренный выше алгоритм
поиска максимума. Если дополнительная память пропорциональна n, то
пространственная сложность равна О(n) и т.д. Для всех рекурсивных
алгоритмов также важно понятие емкостной сложности. При каждом вызове
метод запрашивает небольшой объем памяти, но этот объем может
значительно увеличиваться в процессе рекурсивных вызовов. Так, при
вычислении факториала на первом этапе (разворачивания рекурсии)
значения сомножителей помещаются в стек. Их количество равно n. При
этом пространственная сложность алгоритма будет равна О(n). В других
случаях эта характеристика может быть еще больше. Таким образом, всегда
необходимо проводить анализ емкостной сложности рекурсивных процедур.
Временная и емкостная сложность взаимосвязаны. Это обусловлено тем, что
память современных ЭВМ имеет иерархическую структуру. При
выполнении программы процессор, прежде всего, работает с данными,
находящимися в быстрой кэшпамяти. Если массив данных имеет большую
размерность, то они могут не поместиться в кэше. При их обработке будут
происходить кэш-промахи, которые сильно замедляют выполнение
программы. Оценка временной сложности в таком случае должна
осуществляться экспериментально.
Результаты экспериментальной оценки временной и емкостной
сложности заданного алгоритма
п/№
n
t, наносекунд
O(log2n)
1
1000
5199
9,966
2
2000
5796
10,966
3
3000
3653
11,551
4
4000
5148
11,966
5
5000
4023
12,228
п/№
n
t, наносекунд
O(n)
1
1000
5199
1000
2
2000
5796
2000
3
3000
3653
3000
4
4000
5148
4000
5
5000
4023
5000
Download