Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

САОД / Пример оформления отчета

.docx
Скачиваний:
21
Добавлен:
26.04.2015
Размер:
60.16 Кб
Скачать

Министерство образования и науки РФ

ФГБОУ ВПО «Восточно-Сибирский государственный университет технологий и управления»

Электротехнический университет

Кафедра систем информатики

Дисциплина «Структуры и алгоритмы обработки данных»

ОТЧЕТ

по лабораторной работе № 1

на тему «Методы поиска»

Выполнил: Андреев С.В. студент гр.660

Проверила: Бильгаева Л.П. к.т.н., доцент

Улан-Удэ

2011

  1. Словесная постановка: Исследование быстродействия методов поиска:

  1. ЛИНЕЙНОГО (ПОСЛЕДОВАТЕЛЬНОГО)

  2. БЫСТРОГО ЛИНЕЙНОГО

  3. ДИХОТОМИЧЕСКОГО (БИНАРНОГО)

  1. Алгоритмы методов:

  1. Линейный поиск.

  1. Быстрый линейный поиск.

  1. Бинарный поиск.

  1. Листинг программы

#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();

  1. Таблица результатов в случае удачного завершения поиска

Изменяя количество элементов в массиве, находим его последний элемент и измеряем затраченное на поиск время. Полученные данные представлены в таблице:

Кол-во элементов

последовательный

Быстрый последовательный

Бинарный

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

  1. Таблица результатов в случае неудачного завершения поиска

Изменяя количество элементов в массиве, пытаемся найти элемент, которого точно нет в нем, и измеряем затраченное на поиск время. Тем самым получаем результаты неудачного поиска. Они занесены в таблицу:

Кол-во элементов

последовательный

Быстрый последовательный

Бинарный

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

  1. График зависимости времени t от количества элементов последовательности в случае удачного завершения

  1. График зависимости времени t от количества элементов последовательности в случае неудачного завершения

  1. Сравнение рассмотренных методов и анализ результатов исследования

  • Анализ последовательного поиска:

Достоинства: Самый просто реализуемый вид поиска.

Недостатки: Намного медлительней быстрого последовательного, так как каждый раз в цикле проверяется условие окончания массива, тем самым замедляется сам поиск.

  • Анализ быстрого последовательного поиска:

Достоинства: Так как в конец массива добавляется искомое число К, то не требуется проверять условие окончания массива, так как даже если в самом массиве искомого элемента не будет, то он будет в конце, тем самым поиск не выйдет за пределы массива. В дальнейшем найден элемент или нет, будет проверять дополнительное условие, не относящееся к самому поиску.

Недостатки: Относительно бинарного поиска, быстрый последовательный намного медлительней.

  • Анализ бинарного поиска:

Достоинства: Этот вид поиска наиболее эффективен для использования в массивах большого размера, так как сам поиск занимает относительно мало времени в сравнении с последовательным и быстрым последовательным.

Недостатки: Недостаток бинарного поиска заключается в необходимости последовательного хранения списка, что усложняет операции добавления и исключения элементов . Так же недостаток бинарного поиска состоит в том, что если искомый элемент находится в начале массива, поиск займет больше времени чем в быстром последовательном