Лабораторна робота № 4
Тема: прості алгоритми пошуку.
Мета: одержати навички та закріпити знання при виконанні операцій пошуку.
Теми для попередньої роботи:
набори даних: масиви, лінійні списки;
алгоритми пошуку:
лінійний:
лінійний з бар’єром;
двійковий.
Загальні відомості
Пошук полягає в тому, щоб у фіксованому наборі даних одного типу знайти заданий елемент – ключ пошуку. Серед простих алгоритмів пошуку відомі такі: лінійний, лінійний з бар’єром, двійковий.
При порівнянні різних алгоритмів важливо знати, як їх складність залежить від обсягу вхідних даних – це так звана складність алгоритму за часом. При визначенні складності алгоритмів пошуку за часом визначають насамперед кількість операцій порівнянь та присвоювань.
Типове завдання
Реалізувати алгоритм лінійного пошуку ключа в масиві цілих чисел.
Текст програми
#include <iostream>
#include <conio.h>
using namespace std;
int linearSearch(int[],int,int);
int main(void)
{ system("chcp 1251 > nul"); // для роботи з кирилицею
const int arraySize=100;
int a[arraySize],searchKey,element;
for (int x=0;x<arraySize;x++)
a[x]=2*x;
cout<<"Введіть ключ пошуку - ціле число: ";
cin>>searchKey;
element=linearSearch(a,searchKey,arraySize);
if (element!=-1)
cout<<"Знайдено значення в елементі "<<element<<endl;
else
cout<<"Значення не знайдено"<<endl;
getch();
return 0;
}
int linearSearch(int array[],int key,int sizeOfArray)
{ for (int n=0; n<sizeOfArray;n++)
if (array[n]==key)
return n;
return -1;
}
Результат роботи програми
Введіть ключ пошуку - ціле число: 98
Знайдено значення в елементі 49
Для продолжения нажмите любую клавишу . . .
Введіть ключ пошуку - ціле число: 17
Значення не знайдено
Для продолжения нажмите любую клавишу . . .
Індивідуальні завдання
Розробити та налагодити програму, в якій реалізувати два алгоритми пошуку по числовому ключу у відповідності до завдання. На етапі тестування для кожного з алгоритмів визначити кількість порівнянь у наборі даних з різною кількістю елементів (20, 100, 1000, 10000) визначити час пошуку, заповнити таблицю по формі табл. 4.1, побудувати графіки, зробити висновки.
У завданнях 1-9 передбачена робота з цілими числами; наступні 9 завдань (номери 10-18) вимагають роботу з дійсними числами.
Двійковий та лінійний пошуки у масиві.
Двійковий та лінійний пошуки у лінійному списку.
Лінійний з бар’єром та двійковий пошуки у масиві.
Лінійний з бар’єром та двійковий пошуки у лінійному списку.
Лінійний та лінійний з бар’єром пошуки у масиві.
Лінійний та лінійний з бар’єром пошуки у лінійному списку.
Лінійний пошук у масиві та лінійному списку.
Лінійний пошук з бар’єром у масиві та лінійному списку.
Двійковий пошук у масиві та лінійному списку.
Таблиця 4.1 – Результати тестування алгоритмів пошуку
|
|
20 |
100 |
1000 |
10000 |
|
Кількість порівнять |
|
|
|
|
|
Час пошуку |
|
|
|
|
Контрольні питання
Що визначає складність алгоритму?
Яка умова повинна виконуватися при пошуку ключа цілого типу?
Яка умова повинна виконуватися при пошуку ключа дійсного типу?
В алгоритмі лінійного пошуку з бар’єром, що є бар’єром?
Перерахуйте усі відомі прості алгоритми пошуку по числовому ключу в порядку зменшення їх середнього часу пошуку.
Які обмеження накладаються на набір даних при лінійному пошуку з бар’єром та без нього?
Які обмеження накладаються на набір даних при двійковому пошуку?
Поясніть, як виконується двійковий пошук?
Реалізація якого алгоритма наведена в наступному фрагменті програмного коду?
{ while(m[i]!= key && i<N) i++;
if( m[i]== key) return i; else return –1;
}
Реалізація якого алгоритма наведена в наступному фрагменті програмного коду?
{ while(m[i]!= key) i++;
if( i!= N) return i; else return –1;
}
Накресліть якісний графік залежності часу пошука від кількості елементів в наборі даних для лінійного, лінійного з бар’єром та двійкового алгоритмів пошуку. Дайте пояснення.
