Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Лабораторная работа № 16. Хэш-таблицы c цепочками



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

Задание Краткие теоретические сведения
1. Пункты 1, 2, 3 содержат программный код проекта, в котором реализована хэш-таблица с цепочками. В правой части записан в левом столбце заголовочный файл Hash_ Twin_Chain.h, а в правом - заголовочный файл Lists.h. Написать комментарии к программному коду.  
#pragma once #include "Lists.h" namespace hashTC { struct Object { int Size; int (*FunKey)(void*); listx::Object* Hash; Object(int size, int (*f)(void*)) { Size=size; FunKey=f; Hash=new listx::Object[Size]; }; int HashFunction(void* data); bool Insert(void* data); listx::Element* Search(void* data); bool Delete(void* data); void Scan(); }; Object Create(int size, int (*f)(void*)); } #pragma once #define LISTNIL (Element*)-1 namespace listx { struct Element { Element* Prev; Element* Next; void* Data; Element(Element* prev, void* data, Element* next) { Prev = prev; Data = data; Next = next; } Element* GetNext(){return Next;}; Element* GetPrev(){return Prev;}; }; static Element* NIL=NULL; struct Object {Element* Head; Object() { Head = NIL; }; Element* GetFirst() { return Head;}; Element* GetLast(); Element* Search(void* data); bool Insert(void* data); bool Delete(Element* e); bool Delete(void* data); void Scan(); }; Object Create(); } #undef LISTNIL
2. В правой части данной строки таблицы записан в левом столбце заголовочный файл Hash_Twin_ Chain.h, а в правом - заголовочный файл Lists.h. Написать комментарии к программному коду.  
#pragma once #include "Lists.h" namespace hashTC { struct Object { int Size; int (*FunKey)(void*); listx::Object* Hash; Object(int size, int (*f)(void*)) { Size=size; FunKey=f; Hash=new listx::Object[Size]; }; int HashFunction(void* data); bool Insert(void* data); listx::Element* Search(void* data); bool Delete(void* data); void Scan(); }; Object Create(int size, int (*f)(void*)); } #pragma once #define LISTNIL (Element*)-1 namespace listx { struct Element { Element* Prev; Element* Next; void* Data; Element(Element* prev, void* data, Element* next) { Prev = prev; Data = data; Next = next; } Element* GetNext(){return Next;}; Element* GetPrev(){return Prev;}; }; static Element* NIL=NULL; struct Object {Element* Head; Object() {Head = NIL; }; Element* GetFirst() {return Head;}; Element* GetLast(); Element* Search(void* data); bool Insert(void* data); bool Delete(Element* e); bool Delete(void* data); void Scan(); }; Object Create(); } #undef LISTNIL
1. В правой части данного пункта записаны две вспомогательные функции проекта и фрагмент главной функции. Дописать главную функцию, в которой должна демонстрироваться работа с основными операциями манипулирования данными в хэш-таблице с цепочками с использованием меню. Выполнить проект и проанализировать результаты.  
#include "stdafx.h" #include "Hash_Twin_Chain.h" #include <iostream> using namespace std; struct AAA { int key; char *mas; AAA(int k, char*z) { key = k; mas = z; } AAA() { key = 0; mas = ""; } }; int hf(void* d) { AAA* f = (AAA*)d; return f->key; } void AAA_print(listx::Element* e) { cout<<((AAA*)e->Data)->key<<'-' <<((AAA*)e->Data)->mas<<" / "; } int _tmain(int argc, _TCHAR* argv[]) {setlocale(LC_ALL, "rus"); int current_size; int choise; int k; cout<<"Введите размер хэш-таблицы" <<endl; cin>>current_size; hashTC::Object H = hashTC::Create (current_size, hf); for(;;) { ............. } return 0; }

4. Провести исследование построения хэш-таблиц разного размера с коллизиями. Исследовать время поиска в построенных в соответствии со своим вариантом хэш-таблицах.

Для вариантов с 1 по 8 вычисление хэш-функции произвести по методу универсального хеширования. Для вариантов с 9 по 16 при вычислении хэш-функции использовать не ключ int key, а алгоритм на основе исключающего ИЛИ для поля строки данных (mas).

5. Изменить проект таким образом, чтобы реализовать конкретную задачу: создать телефонную книжку, словарь и т. п.

В начало практикума





Дата публикования: 2015-02-18; Прочитано: 422 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...