You are on page 1of 6

Міністерство освіти і науки України

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ


«ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ»

Навчально-науковий інститут комп'ютерних наук та інформаційних технологій

Кафедра «Обчислювальна техніка та програмування»

ЗВІТ

з дисципліни "АЛГОРИТМИ ТА СТРУКТУРИ ДАНИХ"

про виконання Практичної роботи №10

АЛГОРИТМИ ПОШУКУЗ ВИКОРИСТАННЯМ ТАБЛИЦЬ

Виконав: студент групи КН-1022В


Гасюк М.О.

Перевірив: Доцент ОТП


Бречко В.О.

Харків-2023

Мета: набути навичок та закріпити знання при виконанні операцій


2

пошуку.

Завдання №1.

Варіант 6
Код програми

using System;
using System.Diagnostics;
using System.IO;

class Program
{
// Кількість записів у таблиці
static int N = 0;
const int EMPTY = -1;
const int PacketSize = 1;

struct ElHashTabl
{
public int code;
public string planeType;
public int speed;
public int passengerCount;
}
static ElHashTabl[] hashTabl;
//структура для зберігання пакетів
static ElHashTabl[][] packets;
static int[] keys;

static void Main()


{
Console.OutputEncoding = System.Text.Encoding.UTF8;

// Зчитуємо дані з файлу


ReadDataFromFile();
int key, res;
// Ініціалізуємо хеш-таблицю та виконуємо вставку даних
Init();
for (int i = 0; i < N; i++)
Insert(keys[i], i);
// Пошук та виведення результатів
Console.Write("Введіть код для пошуку (або 'exit' для виходу) -> ");
string code = Console.ReadLine();
while (code.ToLower() != "exit")
{
SearchAndPrint(code, "planes20.txt");
Console.Write("Введіть код для пошуку (або 'exit' для виходу) -> ");
code = Console.ReadLine();
}
}
//Функція для зчитування даних з файлу та створення хеш-таблиці
static void ReadDataFromFile()
{
string filePath = @"D:\KN-1022V\АСДП\readers20.txt";
string[] lines = File.ReadAllLines(filePath);
N = lines.Length;
hashTabl = new ElHashTabl[N];
3

keys = new int[N];


packets = new ElHashTabl[N / PacketSize][];
for (int i = 0; i < N; i++)
{
string[] parts = lines[i].Split(',');
if (parts.Length == 4)
{
hashTabl[i].code = int.Parse(parts[0].Trim());
hashTabl[i].planeType = parts[1].Trim();
hashTabl[i].speed = int.Parse(parts[2].Trim());
hashTabl[i].passengerCount = int.Parse(parts[3].Trim());
int key = CalculateKey(hashTabl[i].code);
keys[i] = key;
}
}
}
// Розрахунок хешу для ключа (коду) за допомогою функції середини квадрата
static int CalculateKey(int code)
{
int key = code * code;
int numberOfDigits = (int)Math.Log10(key) + 1;
int midSquareLength = numberOfDigits / 2;
key = (key / (int)Math.Pow(10, (numberOfDigits - midSquareLength))) % (int)Math.Pow(10, midSquareLength);
return key;
}
// Функція хешування
static int Hash(int key)
{
return key % (N / PacketSize);
}
// Ініціалізація пакетів у хеш-таблиці
static void Init()
{
for (int i = 0; i < N / PacketSize; i++)
{
packets[i] = new ElHashTabl[PacketSize];
for (int j = 0; j < PacketSize; j++)
{
packets[i][j].code = EMPTY;
}
}
}
// Вставка елементу в хеш-таблицю з розв'язанням колізій
static int Insert(int key, int adr)
{
int packetIndex = Hash(key);
int newPacketIndex = packetIndex;
while (true)
{
for (int i = 0; i < PacketSize; i++)
{
if (packets[packetIndex][i].code == EMPTY)
{
packets[packetIndex][i].code = hashTabl[adr].code;
packets[packetIndex][i].planeType = hashTabl[adr].planeType;
packets[packetIndex][i].speed = hashTabl[adr].speed;
packets[packetIndex][i].passengerCount = hashTabl[adr].passengerCount;
return 1;
}
}
// Якщо поточний пакет заповнений, спробуємо наступний пакет
newPacketIndex = (newPacketIndex + 1) % (N / PacketSize);
if (newPacketIndex == packetIndex)
break;
packetIndex = newPacketIndex;
4

}
return 0;
}
// Пошук та виведення результатів за кодом
// Пошук та виведення результатів за кодом
static void SearchAndPrint(string code, string filePath)
{
int key = CalculateKey(int.Parse(code));
int packetIndex = Hash(key);
int newPacketIndex = packetIndex;
long comparisons = 0;
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
while (true)
{
for (int i = 0; i < PacketSize; i++)
{
comparisons++;
if (packets[packetIndex][i].code == int.Parse(code))
{
stopwatch.Stop();
double elapsedMilliseconds = (double)stopwatch.ElapsedTicks / Stopwatch.Frequency * 1000.0;
Console.WriteLine("Код: " + packets[packetIndex][i].code);
Console.WriteLine("Тип літака: " + packets[packetIndex][i].planeType);
Console.WriteLine("Швидкість: " + packets[packetIndex][i].speed);
Console.WriteLine("Кількість пасажирів: " + packets[packetIndex][i].passengerCount);
Console.WriteLine($"Час пошуку: {elapsedMilliseconds.ToString("0.0000 ms")}");

Console.WriteLine("Кількість порівнянь: " + comparisons);


return;
}
}
// Якщо поточний пакет не містить шуканого коду, спробуємо наступний пакет
newPacketIndex = (newPacketIndex + 1) % (N / PacketSize);
if (newPacketIndex == packetIndex)
break;
packetIndex = newPacketIndex;
}
stopwatch.Stop();
Console.WriteLine("Код не знайдено.");
Console.WriteLine("Час пошуку: " + stopwatch.ElapsedMilliseconds + " мс");
Console.WriteLine("Кількість порівнянь: " + comparisons);
}
}
5

Рисунок 1.1 – код програми 20 елементів

Рисунок 1.2 – код програми 1000 елементів

Рисунок 1.3 – код програми 5000 елементів

Рисунок 1.3 – код програми 10000 елементів

Рисунок 1.4 – код програми 50000 елементів

Таблиця 1 – Результати тестування алгоритму пошуку із використанням таблиці

Хеш-таблиця із спільним простором переповнень


Кількість елементів 20 1000 5000 10000 50000

Кількість порівнянь 15 569 1342 7199 8241


6

Час пошуку 0,001 ms 0,0105 ms 0,0705 ms 0,5581 ms 3,7976 ms

Кількість 20 100 1000 10000


елементів
Кількість 2 5 9 11
порівнянь
Час пошуку 00:00:00.0016915 00:00:00.000007 00:00:00.0000448 00:00:00.0005608
5

Таблиця 9.1 – Результати тестування алгоритмів бінарного пошуку

Кількість 20 100 1000 10000


елементів
Кількість 5 72 18 1326
порівнянь
Час пошуку 00:00:00.0003434 00:00:00.000000 00:00:00.0000005 00:00:00.0000031
6

Таблиця 9.2 – Результати тестування алгоритмів лінійного пошуку

Висновки: В результаті виконаної роботи можна зробити висновок, що алгоритм


пошуку з використанням хеш-таблиці є досить ефективним, особливо для обробки
великої кількості елементів.

You might also like