Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using ClassLibrary1;
- using System.Text.RegularExpressions;
- namespace Главный_проект
- {
- public class HashTable
- {
- static Random rnd = new Random();
- public Person[] HTable;
- /// <summary>
- /// Получение хэш кода
- /// </summary>
- /// <param name="man"></param>
- /// <param name="size"></param>
- /// <returns></returns>
- public static int GetHashCode(int account, int size)
- {
- int key = Convert.ToInt32(Math.Truncate(size * (account * 0.683 % 1)));
- // Console.WriteLine("Хэш-код элемента:" + key);
- return key;
- }
- public static int GetIndex (int key, int size)
- {
- // Console.WriteLine("Индекс в массиве:" + key % size);
- return key % size;
- }
- /// <summary>
- /// Добавление элемента в таблицу, которая заполнена не полностью
- /// </summary>
- /// <param name="man"></param>
- /// <param name="Table"></param>
- /// <returns></returns>
- public static Person[] Add(Person man, Person[] Table, ref int kKoll)
- {
- /*Добавление элемента
- *ВАЖНО: процедура не проверяет заполнена ли таблица полностью
- * Пустые места проинициализированы как null
- *2 варианта
- * Место с этим номером занято
- * Идём до первого пустого
- * Место с этим номером свободно
- * Заполняем
- */
- //int index = GetHashCode(man.account, Table.Length) % Table.Length; //Вычисление индекса в массиве хэш-таблицы
- //Console.WriteLine("Хэш код {0}", GetHashCode(man, Table.Length).ToString());
- int index = GetIndex(GetHashCode(man.account, Table.Length), Table.Length);
- if (Table[index] == null)
- {
- Table[index] = man;
- return Table;
- }
- else
- {
- kKoll++;
- index = 0;
- if (Table[index] == null) Table[index] = man;
- do
- {
- index++;
- } while ((Table[index] != null)&&(index != Table.Length -1));
- Table[index] = man;
- }
- //HowManyCollisions(Table.Length, ref kKoll, Table, ref flag1, ref flag2);
- // Console.WriteLine("Индекс в массиве {0}", index);
- return Table;
- }
- /// <summary>
- /// Проверка таблицы на заполненность и её пересоздание при необходимости
- /// </summary>
- /// <param name="HTable"></param>
- /// <param name="size"></param>
- /// <returns></returns>
- public static Person[] ReSize(Person[] HTable, ref int size, ref int kKoll)
- {
- double fillK = Convert.ToDouble(size) / HTable.Length;
- if (fillK > 1)
- {
- Person[] NewTable = new Person[HTable.Length * 2];
- for (int i = 0; i<HTable.Length; i++)
- {
- if (HTable[i] != null) NewTable = Add(HTable[i], NewTable, ref kKoll);
- }
- Console.WriteLine("Длина новой таблицы:" + NewTable.Length);
- return NewTable;
- }
- else return HTable;
- }
- /// <summary>
- /// Создание хэш таблицы size - количество элементов, которые надо захэшировать
- /// </summary>
- /// <param name="size"></param>
- /// <param name="tableSize"></param>
- /// <returns></returns>
- public static Person[] CreateTable(int tableSize, ref int size, ref int kKoll, ref bool flag1, ref bool flag2, ref bool flag3)
- {
- //Console.SetCursorPosition(0, x);
- Console.WriteLine("Введите количество элементов, которое надо захэшировать:"); //Ввод количества элементов в таблице
- //x++;
- size = Class1.InputIntNNumber();
- Person[] Table = new Person[tableSize]; //Инициализация хэш таблицы
- //Console.SetCursorPosition(0, x);
- Console.WriteLine("Выберите номер команды для заполнения базы \n 1 - Случайно\n 2 - Вручную");
- //x += 3;
- int how;
- do
- {
- how = Class1.InputIntNNumber();
- if ((how != 1) && (how != 2)) Console.WriteLine("Такого номера команды нет, повторите ввод");
- } while ((how != 1) && (how != 2));
- do
- {
- Table = ReSize(Table, ref size, ref kKoll);
- } while (Table.Length < size);
- Console.WriteLine("Длина таблицы:" + Table.Length);
- for (int i = 0; i<size; i++)
- {
- Person man = CreateMan(how);
- Table = Add(man,Table, ref kKoll);
- HowManyCollisions(i+1, ref kKoll, Table, ref flag1, ref flag2, ref flag3);
- }
- return Table;
- }
- /// <summary>
- /// Создание учётной записи человека
- /// </summary>
- /// <param name="how"></param>
- /// <returns></returns>
- public static Person CreateMan(int how)
- {
- Person human = new Person();
- if (how == 1)
- {
- string [] surnames = {"Смирнов","Кузнецов","Иванов","Соколов","Попов","Лебедев","Козлов","Новиков","Морозов","Петров","Волков","Соловьёв","Васильев","Зайцев", "Павлов", "Семенов","Горбунов","Голубев","Виноградов","Богданов","Воробьёв","Федоров","Михайлов", "Беляев","Тарасов","Белов"};
- string [] names = {"Александр","Артём","Максим","Иван","Михаил","Никита","Василий","Андрей","Егор"};
- string surname = surnames[rnd.Next(0,surnames.Length)]; //Случайный выбор фамилии из предложенных
- string name = names[rnd.Next(0, names.Length)]; //Случайный выбор имени из предложенных
- human.name = surname+" "+name;
- human.account = rnd.Next(100000,999999);
- human.money = rnd.Next(1000,100000);
- return human;
- }
- else
- {
- //Console.SetCursorPosition(0, x);
- Console.WriteLine("Введите имя держателя счёта:");
- bool ok = false;
- string pattern = "[A-Za-z\\s]{1,}(? !\\d)";
- Regex r = new Regex(pattern);
- do
- {
- human.name = Console.ReadLine();
- ok = r.IsMatch(human.name);
- if (!ok) { Console.WriteLine("Фамилия введена неверно, потворите ввод"); ok = false;}
- } while (!ok);
- Console.WriteLine("Введите номер счёта:");
- human.account = Class1.InputIntNNumber();
- Console.WriteLine("Введите количество денег на счету:");
- human.money = Class1.InputIntNNumber();
- // x += 3;
- return human;
- }
- }
- /// <summary>
- /// Поиск человека по номеру счёта
- /// </summary>
- /// <param name="Htable"></param>
- public static void Search(Person [] Htable)
- {
- //Console.SetCursorPosition(0, x);
- Console.WriteLine("Введите номер аккаунта клиента, который хотите найти:");
- int number = Class1.InputNumber();
- //int index = GetHashCode(number, Htable.Length) % Htable.Length;
- int index = GetIndex(GetHashCode(number, Htable.Length), Htable.Length);
- //Console.WriteLine("Длина таблицы:" + Htable.Length);
- //Console.WriteLine("Вычисленый индекс:" + index);
- if (Htable[index] != null)
- if (Htable[index].account == number) { Console.WriteLine("Найденный элемент: {0}", Htable[index]); return; }
- for (int i = 0; i < Htable.Length; i++)
- if (Htable[i] != null)
- if (Htable[i].account == number) { Console.WriteLine("Найденный элемент: {0}", Htable[i]); return; }
- Console.WriteLine("Элемента с таким ключом в таблице нет");
- //x += 2;
- }
- /// <summary>
- /// Добавление элемента
- /// </summary>
- /// <param name="HTable"></param>
- /// <returns></returns>
- public static Person [] AddElement(Person [] HTable, ref int kKoll, ref int size)
- {
- //Console.SetCursorPosition(0, x);
- int path; //Для выбора создания элемента
- Console.WriteLine("Как добавить элемент? \n 1 - Случайно \n 2 - Ввести с клавиатуры");
- //x += 3;
- do
- {
- path = Class1.InputIntNNumber();
- if ((path < 1) && (path > 2)) { Console.WriteLine("Повторите ввод, такого номера команды");/*x++*/}
- } while ((path < 1) && (path > 2));
- HTable = ReSize(HTable, ref size, ref kKoll);
- Person human = CreateMan(path);
- HTable = Add(human, HTable, ref kKoll);
- return HTable;
- }
- public static Person [] DeleteMan(Person [] HTable)
- {
- for (int i = 0; i < HTable.Length; i++)
- {
- if (HTable[i] != null) break;
- if ((i == HTable.Length - 1) && (HTable[i] == null)) { Console.WriteLine("Таблица пуста"); return HTable; }
- }
- //Console.SetCursorPosition(0, x);
- Console.WriteLine("Введите номер аккаунта человека, который хотите удалить:");
- //x++;
- int number = Class1.InputIntNNumber();
- int index = GetIndex(GetHashCode(number, HTable.Length), HTable.Length);
- if (HTable[index] != null)
- if (HTable[index].account == number) { HTable[index] = null; return HTable; }
- for (int i = 0; i<HTable.Length; i++)
- {
- if (HTable[i] != null)
- if (HTable[i].account == number) {HTable[i] = null; return HTable; }
- }
- Console.WriteLine("Элемент, который надо удалить не найден");
- //x++;
- return HTable;
- }
- public static void ShowHTAble (Person [] HTable)
- {
- //Console.SetCursorPosition(0, x);
- for (int i = 0; i<HTable.Length; i++)
- {
- if (HTable[i] != null) Console.WriteLine(HTable[i] + " Индекс в хэш-таблице:"+i);
- }
- }
- public static void HowManyCollisions(int filled, ref int kKoll, Person [] HTable, ref bool flag1, ref bool flag2, ref bool flag3)
- {
- Console.WriteLine("Количество коллизий: " + kKoll);
- double fillK = Convert.ToDouble(filled) / HTable.Length; //Коэффциент заполнения таблицы
- if ((fillK > 0.45) && (flag1 == false)) { Console.WriteLine("При коэффициенте заполнения {0} в таблице {1} коллизий", fillK * 100, kKoll); flag1 = true; return; }
- if ((fillK > 0.75) && (flag2 == false)) { Console.WriteLine("При коэффициенте заполнения {0} в таблице {1} коллизий", fillK * 100, kKoll); flag2 = true; return; }
- if ((fillK > 0.9) && (flag3 == false)) { Console.WriteLine("При коэффициенте заполнения {0} в таблице {1} коллизий", fillK * 100, kKoll); flag3 = true; return; }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement