Лабораторная 2
.pdfМИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра информационной безопасности
ОТЧЕТ по лабораторной работе №2
по дисциплине «Алгоритмы и структуры данных» Тема: Алгоритмы поиска в линейных структурах данных
|
|
|
Афанасьев Д. К. |
Студенты гр. 1363 |
|
Владимиров П. А. |
|
Преподаватель |
|
|
Беляев А.В. |
Санкт-Петербург
2022
Теоретическая часть
Двоичный (бинарный) поиск:
Двоичный поиск применяется, если данные в анализируемом списке упорядочены по неубыванию или невозрастанию. В этом случае возможен эффективный поиск с оценкой сложности O(log2n) следующим способом.
1. Определение значения элемента в середине структуры данных.
Полученное значение сравнивается с ключом.
2.Если ключ меньше значения середины, то поиск осуществляется в первой половине элементов, иначе — во второй.
3.Поиск сводится к тому, что вновь определяется значение серединного элемента в выбранной половине и сравнивается с ключом.
4.Процесс продолжается до тех пор, пока не будет найден элемент со значением ключа или не станет пустым интервал для поиска.
Двоичное дерево поиска:
Двоичное дерево поиска представляет собой вспомогательную
структуру в виде дерева, каждый узел которого содержит значение узлового
элемента и три ссылки:
1.на «левое» поддерево, в котором находятся все элементы, строго меньшие текущего
2.на «правое» поддерево, в котором находятся все элементы, строго большие текущего
3.на цепочку ссылок (например, индексов записей в массиве), равных текущей.
Хэш-таблица:
Хеш-таблица представляет собой вспомогательную структуру в виде массива, каждая запись которого представляет собой указатель на цепочку записей, содержащих:
1.значение элемента
2.ссылку (например, индекс записи в массиве)
3. ссылку на следующую запись цепочки
Практическая часть
Программа для сортировки массива, дополненная алгоритмом двоичного поиска числа: смотреть Приложение 1;
Программа для построения двоичного дерева, поиска элементов в нём и вывода статистики: смотреть Приложение 2;
Программа для построения хэш-таблицы, поиска элементов в ней и вывода статистики: смотреть Приложение 2.
Таблица частот длин путей до узлов двоичного дерева
1 |
0 |
2 |
2 |
3 |
4 |
4 |
8 |
5 |
16 |
6 |
31 |
7 |
57 |
8 |
116 |
9 |
201 |
10 |
356 |
11 |
577 |
12 |
910 |
13 |
1442 |
14 |
2133 |
15 |
2970 |
16 |
4020 |
17 |
5076 |
18 |
6141 |
19 |
6914 |
20 |
7206 |
21 |
7099 |
22 |
6666 |
23 |
5858 |
24 |
4946 |
25 |
3952 |
26 |
3080 |
27 |
2304 |
28 |
1638 |
29 |
1110 |
30 |
746 |
31 |
488 |
32 |
272 |
33 |
156 |
34 |
84 |
35 |
50 |
36 |
24 |
37 |
13 |
38 |
6 |
39 |
2 |
Гистограмма частот длин путей до узлов двоичного дерева
Статистика дерева
8000
7000
6000
5000
4000
3000
2000
1000
0
1 |
3 |
5 |
7 |
9 |
11 |
13 |
15 |
17 |
19 |
21 |
23 |
25 |
27 |
29 |
31 |
33 |
35 |
37 |
39 |
Таблица частот длин цепочек за ячейками хеш-таблицы
0 |
28 |
1 |
0 |
2 |
719 |
3 |
6987 |
4 |
24273 |
Гистограмма частот длин цепочек за ячейками хеш-таблицы
Cтатистика хэша
30000
25000
20000
15000
10000
5000
0
1 |
2 |
3 |
4 |
5 |
Задание на лабораторную роботу
Теоретическая часть
Афанасьев Данила (Вариант 2)
1.
2.
Владимиров Пётр (Вариант 5)
1.
2.
Приложение 1
Файл main.c:
#include <iostream> #include "binary_search.h" #include <sys/time.h>
int main() { time_t t;
int l,o,low=0,h,m; t=time(NULL); srand(t);
struct timeval t1,t2;
int* arr,c_arr[100000]={0},a=0; int k=0;
cout<< endl<<"Enter the legth of an array: "; cin>>k;
arr=(int*)malloc((k)*sizeof(int)); for(int i=0;i<k;i++){
arr[i]=rand()%1000000;
}
cout<<"First 10 elements: "; for(int i=0;i<10;i++){
cout<<arr[i]<<" ";
}
cout<< endl<<"Last 10 elements: ";
for(int i=k-10;i<k;i++){ cout<<arr[i]<<" ";
}
cout<< endl; gettimeofday(&t1,NULL); for(int i=0;i<k;i++){
l=i;
for(int j=i+1;j<k;j++){ if(arr[j]<arr[l]){
o=arr[l];
arr[l]=arr[j];
arr[j]=o;
}
}
}
gettimeofday(&t2,NULL); cout<<"First 10 elements: "; for(int i=0;i<10;i++){
cout<<arr[i]<<" ";
}
cout<< endl<<"Last 10 elements:"; for(int i=k-10;i<k;i++){
cout<<arr[i]<<" ";
}
int el;
cout<< endl<<((t2.tv_sec*1000000+t2.tv_usec)- (t1.tv_sec*1000000+t1.tv_usec))/1000<<" msc."<< endl;
cout<<"Enter the searched element: "<< endl; cin>>el;
if(search(el,arr,k)!=1){
cout<<"Number of an element in the array: "<<search(el,arr,k);
}
else{
cout<<"There is no such element in this array"<< endl;
}
free(arr);
return 0;
}
Файл binary_search.h:
#ifndef BINARY_SEARCH_BINARY_SEARCH_H #define BINARY_SEARCH_BINARY_SEARCH_H
int search(int element,int* array,int array_length); #endif //BINARY_SEARCH_BINARY_SEARCH_H
Файл binary_search.cpp:
#include "binary_search.h"
int search(int element,int* array,int array_length){ int l,h,m;
l=0; h=array_length-1; while(l<=h){
m=((l+h)/2);
if(element<array[m]){ h=m-1;
}
else if(element>array[m]){ l=m+1;
}
else return m;
}
return -1;
}