БФИ1801, СПО, Паршикова А.П., лр№1. Цель работы Изучить основные методы организации таблиц идентификаторов, получить представление о преимуществах и недостатках, присущих различным методам организации таблиц идентификаторов. Задание
Скачать 208.52 Kb.
|
МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ Ордена Трудового Красного Знамени Федеральное государственное бюджетное образовательное учреждение высшего образования Московский технический университет связи и информатики (МТУСИ) Кафедра «Системное программирование» Отчёт по лабораторной работе №1 по дисциплине «Системное программное обеспечение» Подготовила студентка группы БФИ1801 Паршикова А.П. Проверила Алексанян Д.А. Москва 2021 Цель работы Изучить основные методы организации таблиц идентификаторов, получить представление о преимуществах и недостатках, присущих различным методам организации таблиц идентификаторов. Задание Для выполнения лабораторной работы требуется написать программу, которая получает на входе набор идентификаторов, организует таблицы идентификаторов с помощью заданных методов, позволяет осуществить многократный поиск произвольного идентификатора в таблицах и сравнить эффективность методов организации таблиц. Список идентификаторов считать заданным в виде текстового файла. Длина идентификаторов ограничена 32 символами. Таблица 1 – Вариант задания
В качестве хэш-функции будет использована сумма кодов всех букв слова. Выполнение Тестирование методов было выполнено с помощью списка идентификаторов вида “имя значения”, который содержит имя идентификатора и дополнительную информацию о нём, представленную в виде целочисленного значения. Список показан на рисунке 1. Рисунок 1 – Список идентификаторов Были реализованы методы хранения идентификаторов с применением метода простого рехеширования и упорядоченного списка. Для тестирования идентификаторы загружались в структуры данных, а затем в них происходил поиск идентификатора. Поиск происходил быстрее для метода простого рехэширования. На рисунке 2 представлен результат выполнения программы. Рисунок 2– Результат выполнения программы Текст программного кода MyForm.h #include #include #include #include #include #include "stdafx.h" #include #include #include "Hash.h" #include "OrderdList.h" void fillTableHash(RehashTable ifstream in(file, ios::in); for (int i = 0; i < identNum; i++) { int val; string name; in >> name >> val; table->Add(make_pair(name, val)); } in.close(); } void fillTableList(ListTable ifstream in(file, ios::in); for (int i = 0; i < identNum; i++) { int val; string name; in >> name >> val; table->Add(make_pair(name, val)); } in.close(); } void RehashFind(int identNum, string filePath, string id) { RehashTable //считывание из файла fillTableHash(simpleRehashTable, filePath, identNum); double t1, t2; t1 = clock(); int gotVal = simpleRehashTable->Get(id); t2 = clock(); if (gotVal == 99999) { label7->Text = "Не найден"; label3->Text = ""; } else { label7->Text = Convert::ToString(gotVal); label3->Text = Convert::ToString(RehashTable } label5->Text = Convert::ToString((t2 - t1) / 1000.0); } void ListFind(int identNum, string filePath, string id) { ListTable //считывание из файла fillTableList(listTable, filePath, identNum); double t1, t2; t1 = clock(); auto gotVal = listTable->Get(id); t2 = clock(); if (gotVal == 0) { label10->Text = "Не найден"; } else { label10->Text = Convert::ToString(gotVal); } label9->Text = Convert::ToString((t2 - t1) / 1000.0); } void RunRehashAdd(int identNum, string filePath, string id){ double t1, t2; RehashTable t1 = clock(); simpleRehashTable->Add(make_pair(id, 0)); t2 = clock(); label3->Text = Convert::ToString(RehashTable label5->Text = Convert::ToString((t2 - t1) / 1000.0); //label7->Text = Convert::ToString(gotVal); } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { int MaxHash = char('z') + char('z') + char('z'); String^ filePath = "C://4курс 1сем//Системное ПО//СПО1.txt"; IO::StreamReader^ R = gcnew IO::StreamReader(filePath); textBox1->Text = R->ReadToEnd(); int MaxHash2 = Convert::ToInt16(MaxHash); } private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { int identNum = 2048; string filePath = "C://4курс 1сем//Системное ПО//СПО1.txt"; String ^id = Convert::ToString(textBox3->Text); //Для поиска string id2 = marshal_as RehashFind(identNum, filePath, id2); ListFind(identNum, filePath, id2); } private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) { textBox3->Clear(); label3->Text = ""; label5->Text = ""; label7->Text = ""; label9->Text = ""; label10->Text = ""; } private: System::Void button6_Click(System::Object^ sender, System::EventArgs^ e) { Application::Exit(); } Hash.h #include "stdafx.h" #include #include #include #include using namespace System; using namespace Windows::Forms; using namespace System::Windows::Forms; using namespace std; template public: vector RehashTable(int size) { vars = vector } RehashTable() { for (auto p : vars) { if (p != NULL) { delete p; } } } void Add(pair { if (var.first.length() > 32) throw exception("Слишком длинное имя идентификатора!"); int startN = hash(var.first); //Первый хэш vector if (vars[startN] != NULL) { //Если место в хэш-таблице занято for (int i = 1, n = hashI(i, var.first); //Вычисляем новый хэш n != startN; i++, n = hashI(i, var.first)) { v.push_back(n); //Добавляем этот хэш if (vars[n] == NULL) { //Если место (с новым хэшем) пустое vars[n] = new pair return; } } throw exception("Таблица переполнена!"); } vars[startN] = new pair } TValue Get(string id) { int Count2 = 0; int startN = hash(id); //Первый хэш if (vars[startN] == NULL) { throw exception("Идентификатор не найден!"); } if (vars[start]->first != id) { //Если элемент с 1ым хэшем не равен идентификатору //Count2++; for (int i = 1, n = rehash(i, id); //Вычисляем новый хэш n != start; i++, n = rehash(i, id)) { Count2++; if (vars[n]->first == id) { //return vars[n]->second; return i; } } return 99999; } return i; } //Основная хэш-функция int static hash(string id) { int sum = 0; int HASH_MIN = (char)('0') + (char)('0') + (char)('0'); int HASH_MAX = (char)('z') + (char)('z') + (char)('z'); for (char ch : id) sum += (int)ch; return sum % (HASH_MAX - HASH_MIN + 1) + HASH_MIN; } //Функция рехеширования int static hashI(int i, string id) { int HASH_MIN = (char)('0') + (char)('0') + (char)('0'); int HASH_MAX = (char)('z') + (char)('z') + (char)('z'); return (hash(id) + i) % (HASH_MAX - HASH_MIN + 1) + HASH_MIN; } OrderdList.h #include "stdafx.h" #include #include #include #include #include using namespace System; using namespace Windows::Forms; using namespace System::Windows::Forms; template public: vector ListTable(int size) { vars = vector } ListTable() { for (auto p : vars) { if (p != NULL) { delete p; } } } auto Get(string id) { auto pos = 0; vector if (it != vars.end()) { // string found! pos = distance(vars.begin(), it) - 5909; return pos; } } void Add(pair { vars.push_back(var.first); sort(vars.begin(), vars.end()); } }; Вывод В результате выполнения лабораторной работы были изучены основные методы организации таблиц идентификаторов, получены представление о преимуществах и недостатках, присущих различным методам организации таблиц идентификаторов. |