Скачиваний:
5
Добавлен:
15.08.2023
Размер:
22.53 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»

(СПбГУТ)

Факультет инфокоммуникационных Сетей и систем (иксс)

кафедра программной инженерии и вычислительной техники (пиивт)

Лабораторная работа №7

«Поиск кратчайшего пути на графах»

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

Выполнили: Студент группы ИКПИ-92 Козлов Никита

Тюришев Матвей

Принял: к.т.н., доцент кафедры ПИиВТ

Дагаев А.В.

Пример работы

Дана последовательность символов a[6] = {'v','o','l','v','o','\0'};

На каждом шаге (шаг – символ, кроме нулевого) производится вычисление: сложение по модулю 2 в степени битности хеша (в данном случае используется 32 бита) с входной последовательностью и умножение на простое число (16777619).

Вычисление основывается на обращении к предыдущим значениям, поэтому предусмотрен Х0 = 2166136261.

Таким образом, вычисляется всё по формулам:

Описание программы

Программа включает в себя несколько функций, как:

  1. unsigned int FNV1Hash (char *buf)

  2. char getRandomChar()

Функция 1 – сам алгоритм FNV, возвращающий хеш-сумму для аргумента в виде массива символов.

Функция 2 – получение случайного символа. Возвращает один из 52 символов – строчные и заглавные латинские буквы.

Использовались классы:

fstream – вывод полученных результатов в файл

iostream – работа функций ввода/вывода

conio.h – работа функции getch()

Код программы

#include <iostream>

#include <conio.h>

#include <chrono>

#include <fstream>

#define k1 5000

using namespace std;

const unsigned FNV_32_PRIME = 0x01000193;

char getRandomChar()//Функция случайного символа

{

const char str[] = {'A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h', 'I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N', 'n', 'O', 'o', 'P', 'p', 'Q', 'q', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x', 'Y', 'y', 'Z', 'z'};

return str[rand() % 52]; //любая из 52 букв

}

unsigned int FNV1Hash (char *buf)

{

unsigned int hval = 0x811c9dc5; // FNV0 hval = 0

int i=0;

while (*buf)

{

hval ^= (unsigned int)*buf++;

hval *= FNV_32_PRIME;

i++;

}

return hval;

}

int main()

{

setlocale(LC_ALL, "Russian");

cout << "ожидайте...\n";

int stepcount = 20;

int size = 100000;

unsigned int* hashsumm = new unsigned int [size];

int *collcount = new int [stepcount];

for (int i=1; i<=stepcount; i++)

{

int coll_count=0;

char **hashfunc = new char* [size];

for (int k = 0; k < size; k++)

{

hashfunc[k] = new char [4];

for (int j=0; j<4; j++)

hashfunc[k][j]=getRandomChar();

hashfunc[k][3]='\0';

hashsumm[k] = FNV1Hash(hashfunc[k]);

}

size -= k1;

for (int k=0;k<size;k++)

for (int j=k+1;j<size; j++)

if (hashsumm[k]==hashsumm[j])

coll_count++;

collcount[i-1]=coll_count;

cout << collcount[i-1] << " - количество коллизий\n";

for (int k = 0; k < size; k++)

delete [] hashfunc[k];

}

fstream fout ("rez.csv", ios::out);

for (int i=1; i<=stepcount; i++)

fout << collcount[i-1] << endl;

fout.close();

delete [] hashsumm;

delete [] collcount;

getch();

return 0;

}