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

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

Кафедра ТК

Отчет по лабораторной работе №1

Построение таблицы идентификаторов

По курсу «Системное Программное Обеспечение»

Выполнил:

студент группы Т28-420

Принял: ст. преподаватель

Карамзина А.Г.

Уфа-2005

Цель работы: Изучить основные методы организации таблица идентификаторов, получить представление о преимуществах и недостатков, присущих различным методам организации таблиц символов (идентификаторов).

Задание: Написать программу, которая получает на входе набор идентификаторов, организует таблицу по заданному методу и позволяет осуществить многократный поиск идентификатора в этой таблице. Список идентификаторов считать заданным в виде текстового файла. Длина идентификатора ограничена 32 символами.

Тип хеш-функции

Способ разрешения коллизий

Сумма кодов первой и второй букв

Бинарное дерево

Требуется, чтобы программа сообщала среднее число коллизий и среднее количество сравнений, выполняемых для поиска идентификатора.

Блок схема:

Листинг программы:

Файл main.cpp:

#include <vcl.h>

#pragma hdrstop

#include "Main.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

TfrmMain *frmMain;

class ID //Описание класса

{

public:

AnsiString Name;

int Right;

int Left;

ID()

{

Right = 0;

Left = 0;

}

int Hash()

{

char *str;

str = Name.c_str();

return (str[0]|str[1]);

}

};

ID *IDTbl;

int *HashTbl;

int CollisionQuantity=0;

int CompareQuantity=0;

void MakeTreeNode(ID *IDTable, int HashIndex, int IDIndex)

{ //Построение бинарного дерева

if (IDTable[HashIndex].Name>IDTable[IDIndex].Name)

{

if (!IDTable[HashIndex].Right)

IDTable[HashIndex].Right = IDIndex;

else

MakeTreeNode(IDTable,IDTable[HashIndex].Right,IDIndex);

}

if (IDTable[HashIndex].Name<IDTable[IDIndex].Name)

{

if (!IDTable[HashIndex].Left)

IDTable[HashIndex].Left = IDIndex;

else

MakeTreeNode(IDTable,IDTable[HashIndex].Left,IDIndex);

}

}

void HashTreeBuild(ID *IDTable, int *HashTable, int N)

{

for (int i=0; i<=N; i++)

{

if (!HashTable[IDTable[i].Hash()])

HashTable[IDTable[i].Hash()] = i;

else

{

CollisionQuantity++;

MakeTreeNode(IDTable, HashTable[IDTable[i].Hash()],i);

}

}

}

__fastcall TfrmMain::TfrmMain(TComponent* Owner)

: TForm(Owner)

{

//Загрузка исходных данных из файла

mmOut->Lines->LoadFromFile("Input.txt");

int N = mmOut->Lines[0].Count;

ID *IDTable;

IDTable = new ID [N+1];

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

IDTable[i].Name = mmOut->Lines[0][i-1];

//Заполнение хэш-таблицы нулевыми значениями

int *HashTable;

HashTable = new int [256];

for (int i=0; i<=255; i++)

HashTable[i]=0;

HashTreeBuild(IDTable,HashTable,N);

//Вывод на экран таблицы идентификаторов

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

mmDebug->Lines->Add(IntToStr(i)+" "+

IDTable[i].Name+" "+

IntToStr(IDTable[i].Hash())+" "+

IntToStr(IDTable[i].Left)+" "+

IntToStr(IDTable[i].Right));

mmOut->Clear();

mmOut->Lines->Add("Введите имя искомого идентификатора");

mmOut->Lines->Add("Коллизий:"+IntToStr(CollisionQuantity));

IDTbl = IDTable;

HashTbl = HashTable;

}

int GetIDIndex(ID SearchID, ID *IDTable, int HashIndex)

{

//0-если не нашел, или индекс в IDTable

int IDIndex = 0;

if (IDTable[HashIndex].Name==SearchID.Name)

{

CompareQuantity++;

return HashIndex;

}

if (IDTable[HashIndex].Name>SearchID.Name)

{

CompareQuantity++;

if (IDTable[HashIndex].Right)

return GetIDIndex(SearchID,IDTable,IDTable[HashIndex].Right);

else return 0;

}

else

{

CompareQuantity++;

if (IDTable[HashIndex].Left)

return GetIDIndex(SearchID,IDTable,IDTable[HashIndex].Left);

else return 0;

}

}

void __fastcall TfrmMain::Button1Click(TObject *Sender)

{ //Поиска идентификатора и выдача результата

AnsiString SearchString = edtSearch->Text;

ID SearchID;

SearchID.Name = SearchString;

int Hash = SearchID.Hash();

int HashIndex;

int IDIndex;

HashIndex = HashTbl[Hash];

CompareQuantity=0;

IDIndex = GetIDIndex(SearchID,IDTbl,HashIndex);

mmOut->Clear();

if (IDIndex)

{

mmOut->Lines->Add("Идентификатор найден, его индекс в таблице идентификаторов:"+IntToStr(IDIndex));

mmOut->Lines->Add("Сравнений:"+IntToStr(CompareQuantity));

}

else

{

mmOut->Lines->Add("Идентификатор не найден");

mmOut->Lines->Add("Сравнений:"+IntToStr(CompareQuantity));

}

}

Результаты работы:

Запрос программы:

Результаты поиска:

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