Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Российской Федерации
Федеральное государственное образовательное бюджетное учреждение
высшего профессионального образования
«Санкт-Петербургский государственный университет телекоммуникаций
им. проф. М.А. Бонч-Бруевича»
Кафедра «Безопасности информационных систем»
Дисциплина «Алгоритмы и структуры данных»
ОТЧЁТ
по практической работе №6
«ХЕШ-ТАБЛИЦЫ»
М. О. Алексеева, В. И. Эверстова
Санкт-Петербург
2021
Цель работы:
Получить практические навыки работы с хеш-таблицами. Научиться
применять основные алгоритмы работы с хеш-таблицами.
Задание:
Доработать код из примера так, чтобы вместо множества получился
ассоциативный массив, в котором можно не только проверить наличие
ключа, добавить или удалить ключ, но и связывать с ключом значение.
Написать программу, позволяющую работать с ассоциативным
массивом, основанным на хеш-таблице. Программа должна позволять
заполнять массив записями с ключами и значениями, удалять записи по
ключу, выводить всю информацию о записи по ключу, выводить всю
информацию, хранящуюся в ассоциативном массиве. Программа должна
выдавать предупреждение при попытке дважды добавить один и тот же
ключ.
Индивидуальное задание:
Для каждой даты хранится информация о погоде: количество
осадков выпавшее за день, минимальная и максимальная температура,
балл облачности (от 0 до 10). Требуется получать информацию о погоде в
указанную дату.
Ход решения
составляет O(n).
#include <iostream>
#include <windows.h>
#include <fstream>
#include <vector>
#include <algorithm>
#include <conio.h>
int n;
// Структура, являющаяся примером ключа хеш-таблицы
struct Key
{
char date[11]; // Строка не более чем из 19 символов (20-й
терминальный)
};
struct Data {
int osadki;
int maxt;
int mint;
int oblaka;
};
struct Hashtable
{
int m_free_index; // Индекс последнего удалённого элемента
size_t m_last_index; // Индекс последнего добавленного элемента
с ключом
size_t m_count; // Логический размер хеш-таблицы (количество
ключей)
size_t m_capacity; // Физический размер хеш-таблицы (размер
массивов)
Node * m_nodes; // Массив с элементами, содержащими ключи
int * m_indexes; // Индексы элементов по значениям хеш-функции
};
// Инициализация хеш-таблицы
Hashtable init_hashtable()
{
Hashtable table;
table.m_free_index = -1;
table.m_last_index = 0;
table.m_count = 0;
table.m_capacity = 0;
table.m_nodes = nullptr;
table.m_indexes = nullptr;
return table;
}
// Обнуляем элемент
table->m_nodes[node].m_hash = 0;
table->m_nodes[node].m_next = table->m_free_index;
table->m_count--;
void Menu()
{
cin >> n;
}
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
ifstream tmp("Pogoda.txt");
Hashtable table;
table = init_hashtable();
Key key;
Data data;
ifstream in("Pogoda.txt");
if (in.is_open())
{
while (!in.eof())
{
in >> key.date >> data.osadki >> data.mint >>
data.maxt >> data.oblaka;
add(&table, key, data.osadki, data.mint, data.maxt,
data.oblaka);
}
}
Menu();
while(n!=0)
{
switch (n)
{
case 1:
{
enumerate(&table);
cout<<endl;
Menu();
break;
}
case 2:
{
char c[11];
cout << "Введите ключ: ";
cin.ignore();
cin.getline(c,sizeof(c));
for(int i =0; i<sizeof(c); i++)
{
key.date[i] = c[i];
}
size_t hash_code = get_hash(key);
int previous;
if (find_node(&table, key, nullptr, nullptr)==-1)
cout<<"Ключ не найден!"<<endl;
else
{
cout<<"Ключ найден!"<<endl;
print_search (&table, key);
}
Menu();
break;
}
case 3:
{
cout << "Введите дату (ключ), количество осадков,
минимальную температуру, максимальную температуру, балл
облачности(0-10): "<<endl;
cin >> key.date >> data.osadki >> data.mint >> data.maxt
>> data.oblaka;
add(&table, key,data.osadki, data.mint, data.maxt,
data.oblaka);
cout<<endl;
Menu();
break;
}
case 4:
{
char c[11];
cout << "Введите ключ: ";
cin.ignore();
cin.getline(c,sizeof(c));
for(int i =0; i<sizeof(c); i++)
{
key.date[i] = c[i];
}
size_t hash_code;
int previous;
cout<<"Удалена строка: ";
print_search (&table, key);
remove1(&table, key);
cout<<endl;
Menu();
break;
}
size_t hash_code;
int previous;
switch (choice)
{
case 1:
{
cout << node;
cout << "Введите количество осадков: ";
int _osadki;
cin >> _osadki;
table.m_nodes[node].d.osadki = _osadki;
Menu();
break;
}
case 2:
{
cout << "Введите минимальную температуру: ";
int _mint;
cin >> _mint;
table.m_nodes[node].d.mint=_mint;
Menu();
break;
}
case 3:
{
cout << "Введите максимальную температуру: ";
int _maxt;
cin >> _maxt;
table.m_nodes[node].d.maxt=_maxt;
Menu();
break;
}
case 4:
{
cout << "Введите балл облачности(0-10): ";
int _oblaka;
cin >> _oblaka;
table.m_nodes[node].d.oblaka=_oblaka;
Menu();
break;
}
break;
}
break;
}
default:
Menu();
}
in.close();
}