Лабораторная 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;
}
