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

Лабораторная 2

.pdf
Скачиваний:
3
Добавлен:
17.03.2023
Размер:
710.21 Кб
Скачать

МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра информационной безопасности

ОТЧЕТ по лабораторной работе №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;

}

Соседние файлы в предмете Алгоритмы и структуры данных