#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
using namespace std;
// Хеш-функция: i = key % M
int hashFunc(int key, int M) {
return key % M;
}
// Добавление элемента с линейным разрешением коллизий
void sv_add(int inf, int m, int H[]) {
int i = hashFunc(inf, m);
// Поиск свободной позиции (линейное пробирование)
while (H[i] != -1) {
i++;
if (i == m) i = 0; // Зацикливание
}
H[i] = inf;
}
// Поиск элемента в хеш-таблице
int sv_search(int inf, int m, int H[]) {
int i = hashFunc(inf, m);
int start = i;
while (H[i] != -1) {
if (H[i] == inf) return i;
i++;
if (i == m) i = 0;
if (i == start) break; // Полный обход, элемент не найден
}
return -1;
}
// Генерация случайного числа в диапазоне [minVal, maxVal]
int randomInRange(int minVal, int maxVal) {
return minVal + rand() % (maxVal - minVal + 1);
}
// Вывод хеш-таблицы
void printHashTable(int H[], int m) {
cout << "Хеш-таблица (линейная адресация):" << endl;
for (int i = 0; i < m; i++) {
if (H[i] != -1)
cout << "H[" << setw(2) << i << "] = " << H[i] << endl;
else
cout << "H[" << setw(2) << i << "] = --" << endl;
}
}
int main() {
srand(time(NULL));
// Параметры варианта А3
const int n = 15; // Количество элементов
const int M = 20; // Размер хеш-таблицы
const int MIN_VAL = 12000;
const int MAX_VAL = 34000;
// Исходный массив со случайными числами
int mas[n];
cout << "=== ВАРИАНТ А3: Линейная адресация ===" << endl;
cout << "Исходный массив (" << n << " элементов, диапазон " << MIN_VAL << "-" << MAX_VAL << "):" << endl;
for (int i = 0; i < n; i++) {
mas[i] = randomInRange(MIN_VAL, MAX_VAL);
cout << "mas[" << i << "] = " << mas[i] << endl;
}
cout << endl;
// Создание и инициализация хеш-таблицы
int H[M];
for (int i = 0; i < M; i++) {
H[i] = -1; // -1 означает "свободно"
}
// Заполнение хеш-таблицы
for (int i = 0; i < n; i++) {
sv_add(mas[i], M, H);
}
// Вывод хеш-таблицы
printHashTable(H, M);
cout << endl;
// Поиск элементов
cout << "Поиск элементов в хеш-таблице:" << endl;
for (int i = 0; i < n; i++) {
int pos = sv_search(mas[i], M, H);
cout << "Элемент " << mas[i] << " найден на позиции H[" << pos << "]" << endl;
}
cout << endl;
// Поиск несуществующего элемента
int notExist = randomInRange(MIN_VAL, MAX_VAL);
while (true) {
bool found = false;
for (int i = 0; i < n; i++) {
if (mas[i] == notExist) {
notExist = randomInRange(MIN_VAL, MAX_VAL);
found = true;
break;
}
}
if (!found) break;
}
int pos = sv_search(notExist, M, H);
cout << "Поиск несуществующего элемента " << notExist << ": ";
if (pos == -1) cout << "не найден" << endl;
else cout << "найден на позиции H[" << pos << "]" << endl;
return 0;
}