
САОД / Пример оформления отчета
.docxМинистерство образования и науки РФ
ФГБОУ ВПО «Восточно-Сибирский государственный университет технологий и управления»
Электротехнический университет
Кафедра систем информатики
Дисциплина «Структуры и алгоритмы обработки данных»
ОТЧЕТ
по лабораторной работе № 1
на тему «Методы поиска»
|
Выполнил: Андреев С.В. студент гр.660 |
|
Проверила: Бильгаева Л.П. к.т.н., доцент
|
Улан-Удэ
2011
-
Словесная постановка: Исследование быстродействия методов поиска:
-
ЛИНЕЙНОГО (ПОСЛЕДОВАТЕЛЬНОГО)
-
БЫСТРОГО ЛИНЕЙНОГО
-
ДИХОТОМИЧЕСКОГО (БИНАРНОГО)

-
Алгоритмы методов:
-
Линейный поиск.
-
Быстрый линейный поиск.

-
Бинарный поиск.
-
Листинг программы
#include "stdafx.h"
#include "conio.h"
#include "stdlib.h"
#include "locale.h"
#include "windows.h"
#define n 30001
void posled(int k); /*Функция последовательного поиска*/
void fastposled(int k); /*Функция быстрого последовательного поиска*/
void bin(int k); /*Функция бинарного поиска*/
int massiv[n],w=0,t;
void main()
{
for(int i=0;i<(n-1);i++)
massiv[i]=rand()%36000; /*заполняю массив случайными числами*/ setlocale(LC_ALL,"rus");
printf("Введите нужное число\n");
scanf("%d",&t);
posled(t);
w=0;
fastposled(t);
w=0;
bin(t);
getch();
}
void posled(int k)
{
int i=0;
LARGE_INTEGER start, finish, freq;
QueryPerformanceFrequency(&freq);
printf("\n");
setlocale(LC_ALL,"rus");
QueryPerformanceCounter(&start);
while (i<n-1 && k!=massiv[i])
{
i++;
}
if (k==massiv[i])
{
QueryPerformanceCounter(&finish);
printf("Последовательный поиск:\n\n");
printf("Элемент найден\n");
w=1;
double d = (finish.QuadPart-start.QuadPart)/(double)freq.QuadPart;
printf("Затрачено %f секунд.\n", d); /*Затраченное время при удачном поиске*/
}
if (w!=1)
{
QueryPerformanceCounter(&finish);
printf("Последовательный поиск:\n\n");
printf("Элемент не найден\n");
double d = (finish.QuadPart-start.QuadPart)/(double)freq.QuadPart;
printf("Затрачено %f секунд.\n", d);/*Затраченное время при неудачном поиске*/
}
}
void fastposled(int k)
{
int j=0;
LARGE_INTEGER start1,finish1, freq1;
QueryPerformanceFrequency(&freq1);
printf("\n");
setlocale(LC_ALL,"rus");
massiv[n-1]=k; /*помещаем ключ в конец массива*/
QueryPerformanceCounter(&start1);
while (k!=massiv[j])
{
j++;
}
if (massiv[n-1]==massiv[j])
if (j<n-1)
{
QueryPerformanceCounter(&finish1);
printf("Быстрый последовательный поиск:\n\n");
printf("Элемент найден\n");
double d = (finish1.QuadPart-start1.QuadPart)/(double)freq1.QuadPart;
printf("Затрачено %f секунд.\n", d);/*Затраченное время при удачном поиске*/
}
else
{
QueryPerformanceCounter(&finish1);
printf("Быстрый последовательный поиск:\n\n");
printf("Элемент не найден\n");
double d = (finish1.QuadPart-start1.QuadPart)/(double)freq1.QuadPart;
printf("Затрачено %f секунд.\n", d);/*Затраченное время при неудачном поиске*/
}
}
void bin(int k)
{
LARGE_INTEGER start2,finish2, freq2;
QueryPerformanceFrequency(&freq2);
printf("\n");
int mid,niz=0,verh=n-2;
setlocale(LC_ALL,"rus");
QueryPerformanceCounter(&start2);
while (niz<=verh)
{
mid=(niz+verh)/2;
if (k<massiv[mid])
verh=mid-1;
else
if (k>massiv[mid]) niz=mid+1;
else
{
QueryPerformanceCounter(&finish2);
printf("Бинарный поиск:\n\n");
printf("Элемент найден\n");
double d = (finish2.QuadPart-start2.QuadPart)/(double)freq2.QuadPart;
printf("Затрачено %f секунд.\n", d);/*Затраченное время при удачном поиске*/
w=1;
break;
}
}
if (w!=1)
{
QueryPerformanceCounter(&finish2);
printf("Бинарный поиск:\n\n");
printf("Элемент не найден\n");
double d = (finish2.QuadPart-start2.QuadPart)/(double)freq2.QuadPart;
printf("Затрачено %f секунд.\n", d);/*Затраченное время при неудачном поиске*/
}
}
Массив заполняется генератором случайных чисел, в роли коорого выступает функция rand();
-
Таблица результатов в случае удачного завершения поиска
Изменяя количество элементов в массиве, находим его последний элемент и измеряем затраченное на поиск время. Полученные данные представлены в таблице:
Кол-во элементов |
последовательный |
Быстрый последовательный |
Бинарный |
1000 |
0,000003 |
0,000002 |
0,000000 |
5000 |
0,000019 |
0,000014 |
0,000000 |
10000 |
0,000035 |
0,000027 |
0,000001 |
15000 |
0,000049 |
0,000043 |
0,000000 |
25000 |
0,000083 |
0,000062 |
0,000001 |
30000 |
0,000098 |
0,000083 |
0,000000 |
-
Таблица результатов в случае неудачного завершения поиска
Изменяя количество элементов в массиве, пытаемся найти элемент, которого точно нет в нем, и измеряем затраченное на поиск время. Тем самым получаем результаты неудачного поиска. Они занесены в таблицу:
Кол-во элементов |
последовательный |
Быстрый последовательный |
Бинарный |
1000 |
0,000003 |
0,000002 |
0,000000 |
5000 |
0,000016 |
0,000011 |
0,000000 |
10000 |
0,000037 |
0,000028 |
0,000000 |
15000 |
0,000054 |
0,000040 |
0,000000 |
25000 |
0,000092 |
0,000071 |
0,000000 |
30000 |
0,000109 |
0,000072 |
0,000001 |
-
График зависимости времени t от количества элементов последовательности в случае удачного завершения
-
График зависимости времени t от количества элементов последовательности в случае неудачного завершения
-
Сравнение рассмотренных методов и анализ результатов исследования
-
Анализ последовательного поиска:
Достоинства: Самый просто реализуемый вид поиска.
Недостатки: Намного медлительней быстрого последовательного, так как каждый раз в цикле проверяется условие окончания массива, тем самым замедляется сам поиск.
-
Анализ быстрого последовательного поиска:
Достоинства: Так как в конец массива добавляется искомое число К, то не требуется проверять условие окончания массива, так как даже если в самом массиве искомого элемента не будет, то он будет в конце, тем самым поиск не выйдет за пределы массива. В дальнейшем найден элемент или нет, будет проверять дополнительное условие, не относящееся к самому поиску.
Недостатки: Относительно бинарного поиска, быстрый последовательный намного медлительней.
-
Анализ бинарного поиска:
Достоинства: Этот вид поиска наиболее эффективен для использования в массивах большого размера, так как сам поиск занимает относительно мало времени в сравнении с последовательным и быстрым последовательным.
Недостатки: Недостаток бинарного поиска заключается в необходимости последовательного хранения списка, что усложняет операции добавления и исключения элементов . Так же недостаток бинарного поиска состоит в том, что если искомый элемент находится в начале массива, поиск займет больше времени чем в быстром последовательном