Мой отчёт по лабе 1
.docxМинистерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
Высшего профессионального образования
Уфимский государственный авиационный технический университет
Кафедра ВМиК
Отчёт
по лабораторной работе
«Построение хеш-таблицы»
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. В результате работы программы получим следующий результат:
Вывод
В ходе лабораторной работы я познакомилась со следкющими понятиями: хеш-таблица, хеш-функция, ключ, адрес, коллизия. Научилась применять их для решения такого типа задач.