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

Мой отчёт по лабе 1

.docx
Скачиваний:
99
Добавлен:
23.01.2014
Размер:
265.02 Кб
Скачать

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное учреждение

Высшего профессионального образования

Уфимский государственный авиационный технический университет

Кафедра ВМиК

Отчёт

по лабораторной работе

«Построение хеш-таблицы»

1 Вариант

Выполнила: студ. гр. МО-201

Фатхутдинова Л.М.

Проверила:

Верхотурова Г.Н.

Уфа-2012

Постановка задачи

Построить хеш-таблицу, содержащую последовательность из m=64 элементов размерности n=6.

Элементы генерируются с помощью датчика случайных чисел.

Хеш-функция - F(k)=( k + 18) / 61.

Метод разрешения конфликта - квадратичные пробы.

Переменные, используемые в программе

N = 64 - количество генерируемых чисел

t = 96 - размерность хеш-таблицы

int HashTabl [ t ] - хеш-таблица

int k - индекс SourceMas

int ht - индекс HashTabl

int adres - адрес ячейки в хеш-таблице

int np - номер пробы

int kz =0 - кол-во заполненных ячеек в хеш-таблице

int chp = 0 - общее число проб

Реализация

Шаг 1. Генерируем элементы исходного массива заданной размерности с помощью датчика случайных чисел. Одновременно проверяем элементов на уникальность. Выводим последовательноссть на экран.

cout << "SourceMas: \n" ;

int SourceMas [ N ] ; // исходный массив генерируемых чисел

srand ( time ( NULL));

for ( k = 0; k < N; ++k ) // k - индекс массива SourceMas

{

int flag=0;

while (flag==0)

{

SourceMas [ k ] = rand ()% 99999 + 100000 * ( rand () % 9 + 1 ) ;

flag=1;

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

if ( SourceMas [k]== SourceMas [j]) flag=0;

cout << SourceMas [ k ] << "\t"; // вывод на экран

Шаг 2. Начинаем работу с хеш-таблицей, занулив её.

for ( ht = 0; ht < t; ++ht ) // зануляем хеш-таблицу

HashTabl [ ht ] = 0;

Найдём ключ (номер ячейки в хеш-таблице) каждого элемента исходной матрицы, вычислив для него хеш-функции. Размещаем элемнты в хеш-таблице в соответствующей ключу позиции. В случае коллизии применяем метод квадратичных проб. Одновременно подсчитываем количество заполненных ячеек хеш-таблицы и общее число проб для следующего шага.

for (ht = 0; ht < N; ++ht ) // заполняем хеш-таблицу

{

adres = (( SourceMas [ht] + 18 )/ 61) % t; // вычисляем непосредственно хеш функцию

int adres0 = adres;

if ( HashTabl [adres] == 0 ) // если ячейка хеш таблицы пустая

{

HashTabl [adres] = SourceMas [ht] ; // то записываем в неё значение из исхтаблицы непосредственно по адресу=ключу

kz++;

}

else // иначе

{

while ( HashTabl [ adres ] != NULL ) // пока не найдётся пустая ячейка

{

adres = ( adres0 + np*np) % t; // применяем метод квадратичной пробы, где np-№ пробы, adres0-нач значение ключа

++np;

}

chp++;

HashTabl [ adres ] = SourceMas [ ht ];

kz++;

}

}

Шаг 3. Выведем на экран полученную хеш-таблицу, а также коэффициент заполненности таблицы(отношение числа заполненных ячеек таблицы к общему их числу) и среднее число проб (отношение количества всех проб к числу заполненных ячеек).

cout << "\nHashTabl: \n" ;

for ( ht = 0; ht < t; ++ ht)

printf("%i: %i\t",ht,HashTabl [ ht ]);

printf("Koeff.zapoln.tabl: %f \n",float(kz)/float(t));

printf("Srednee chislo prob:%f\n",float(chp)/float(kz));

Шаг 4. В результате работы программы получим следующий результат:

Вывод

В ходе лабораторной работы я познакомилась со следкющими понятиями: хеш-таблица, хеш-функция, ключ, адрес, коллизия. Научилась применять их для решения такого типа задач.