Advertisement
Guest User

Untitled

a guest
Jan 20th, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.15 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using ClassLibrary1;
  7. using System.Text.RegularExpressions;
  8.  
  9. namespace Главный_проект
  10. {
  11. public class HashTable
  12. {
  13. static Random rnd = new Random();
  14. public Person[] HTable;
  15.  
  16. /// <summary>
  17. /// Получение хэш кода
  18. /// </summary>
  19. /// <param name="man"></param>
  20. /// <param name="size"></param>
  21. /// <returns></returns>
  22. public static int GetHashCode(int account, int size)
  23. {
  24. int key = Convert.ToInt32(Math.Truncate(size * (account * 0.683 % 1)));
  25. // Console.WriteLine("Хэш-код элемента:" + key);
  26. return key;
  27. }
  28.  
  29. public static int GetIndex (int key, int size)
  30. {
  31. // Console.WriteLine("Индекс в массиве:" + key % size);
  32. return key % size;
  33. }
  34. /// <summary>
  35. /// Добавление элемента в таблицу, которая заполнена не полностью
  36. /// </summary>
  37. /// <param name="man"></param>
  38. /// <param name="Table"></param>
  39. /// <returns></returns>
  40. public static Person[] Add(Person man, Person[] Table, ref int kKoll)
  41. {
  42. /*Добавление элемента
  43. *ВАЖНО: процедура не проверяет заполнена ли таблица полностью
  44. * Пустые места проинициализированы как null
  45. *2 варианта
  46. * Место с этим номером занято
  47. * Идём до первого пустого
  48. * Место с этим номером свободно
  49. * Заполняем
  50. */
  51. //int index = GetHashCode(man.account, Table.Length) % Table.Length; //Вычисление индекса в массиве хэш-таблицы
  52. //Console.WriteLine("Хэш код {0}", GetHashCode(man, Table.Length).ToString());
  53. int index = GetIndex(GetHashCode(man.account, Table.Length), Table.Length);
  54. if (Table[index] == null)
  55. {
  56. Table[index] = man;
  57. return Table;
  58. }
  59. else
  60. {
  61. kKoll++;
  62. index = 0;
  63. if (Table[index] == null) Table[index] = man;
  64. do
  65. {
  66. index++;
  67. } while ((Table[index] != null)&&(index != Table.Length -1));
  68. Table[index] = man;
  69. }
  70. //HowManyCollisions(Table.Length, ref kKoll, Table, ref flag1, ref flag2);
  71. // Console.WriteLine("Индекс в массиве {0}", index);
  72. return Table;
  73. }
  74. /// <summary>
  75. /// Проверка таблицы на заполненность и её пересоздание при необходимости
  76. /// </summary>
  77. /// <param name="HTable"></param>
  78. /// <param name="size"></param>
  79. /// <returns></returns>
  80. public static Person[] ReSize(Person[] HTable, ref int size, ref int kKoll)
  81. {
  82. double fillK = Convert.ToDouble(size) / HTable.Length;
  83. if (fillK > 1)
  84. {
  85. Person[] NewTable = new Person[HTable.Length * 2];
  86. for (int i = 0; i<HTable.Length; i++)
  87. {
  88. if (HTable[i] != null) NewTable = Add(HTable[i], NewTable, ref kKoll);
  89. }
  90. Console.WriteLine("Длина новой таблицы:" + NewTable.Length);
  91. return NewTable;
  92. }
  93. else return HTable;
  94. }
  95. /// <summary>
  96. /// Создание хэш таблицы size - количество элементов, которые надо захэшировать
  97. /// </summary>
  98. /// <param name="size"></param>
  99. /// <param name="tableSize"></param>
  100. /// <returns></returns>
  101. public static Person[] CreateTable(int tableSize, ref int size, ref int kKoll, ref bool flag1, ref bool flag2, ref bool flag3)
  102. {
  103. //Console.SetCursorPosition(0, x);
  104. Console.WriteLine("Введите количество элементов, которое надо захэшировать:"); //Ввод количества элементов в таблице
  105. //x++;
  106. size = Class1.InputIntNNumber();
  107.  
  108. Person[] Table = new Person[tableSize]; //Инициализация хэш таблицы
  109. //Console.SetCursorPosition(0, x);
  110. Console.WriteLine("Выберите номер команды для заполнения базы \n 1 - Случайно\n 2 - Вручную");
  111. //x += 3;
  112. int how;
  113. do
  114. {
  115. how = Class1.InputIntNNumber();
  116. if ((how != 1) && (how != 2)) Console.WriteLine("Такого номера команды нет, повторите ввод");
  117. } while ((how != 1) && (how != 2));
  118. do
  119. {
  120. Table = ReSize(Table, ref size, ref kKoll);
  121. } while (Table.Length < size);
  122.  
  123. Console.WriteLine("Длина таблицы:" + Table.Length);
  124. for (int i = 0; i<size; i++)
  125. {
  126. Person man = CreateMan(how);
  127. Table = Add(man,Table, ref kKoll);
  128. HowManyCollisions(i+1, ref kKoll, Table, ref flag1, ref flag2, ref flag3);
  129. }
  130.  
  131. return Table;
  132. }
  133.  
  134. /// <summary>
  135. /// Создание учётной записи человека
  136. /// </summary>
  137. /// <param name="how"></param>
  138. /// <returns></returns>
  139. public static Person CreateMan(int how)
  140. {
  141. Person human = new Person();
  142. if (how == 1)
  143. {
  144. string [] surnames = {"Смирнов","Кузнецов","Иванов","Соколов","Попов","Лебедев","Козлов","Новиков","Морозов","Петров","Волков","Соловьёв","Васильев","Зайцев", "Павлов", "Семенов","Горбунов","Голубев","Виноградов","Богданов","Воробьёв","Федоров","Михайлов", "Беляев","Тарасов","Белов"};
  145. string [] names = {"Александр","Артём","Максим","Иван","Михаил","Никита","Василий","Андрей","Егор"};
  146. string surname = surnames[rnd.Next(0,surnames.Length)]; //Случайный выбор фамилии из предложенных
  147. string name = names[rnd.Next(0, names.Length)]; //Случайный выбор имени из предложенных
  148. human.name = surname+" "+name;
  149. human.account = rnd.Next(100000,999999);
  150. human.money = rnd.Next(1000,100000);
  151. return human;
  152. }
  153. else
  154. {
  155. //Console.SetCursorPosition(0, x);
  156. Console.WriteLine("Введите имя держателя счёта:");
  157. bool ok = false;
  158. string pattern = "[A-Za-z\\s]{1,}(? !\\d)";
  159. Regex r = new Regex(pattern);
  160. do
  161. {
  162. human.name = Console.ReadLine();
  163. ok = r.IsMatch(human.name);
  164. if (!ok) { Console.WriteLine("Фамилия введена неверно, потворите ввод"); ok = false;}
  165. } while (!ok);
  166. Console.WriteLine("Введите номер счёта:");
  167. human.account = Class1.InputIntNNumber();
  168. Console.WriteLine("Введите количество денег на счету:");
  169. human.money = Class1.InputIntNNumber();
  170. // x += 3;
  171. return human;
  172. }
  173.  
  174. }
  175. /// <summary>
  176. /// Поиск человека по номеру счёта
  177. /// </summary>
  178. /// <param name="Htable"></param>
  179. public static void Search(Person [] Htable)
  180. {
  181. //Console.SetCursorPosition(0, x);
  182. Console.WriteLine("Введите номер аккаунта клиента, который хотите найти:");
  183. int number = Class1.InputNumber();
  184. //int index = GetHashCode(number, Htable.Length) % Htable.Length;
  185. int index = GetIndex(GetHashCode(number, Htable.Length), Htable.Length);
  186. //Console.WriteLine("Длина таблицы:" + Htable.Length);
  187. //Console.WriteLine("Вычисленый индекс:" + index);
  188. if (Htable[index] != null)
  189. if (Htable[index].account == number) { Console.WriteLine("Найденный элемент: {0}", Htable[index]); return; }
  190. for (int i = 0; i < Htable.Length; i++)
  191. if (Htable[i] != null)
  192. if (Htable[i].account == number) { Console.WriteLine("Найденный элемент: {0}", Htable[i]); return; }
  193. Console.WriteLine("Элемента с таким ключом в таблице нет");
  194. //x += 2;
  195. }
  196.  
  197. /// <summary>
  198. /// Добавление элемента
  199. /// </summary>
  200. /// <param name="HTable"></param>
  201. /// <returns></returns>
  202. public static Person [] AddElement(Person [] HTable, ref int kKoll, ref int size)
  203. {
  204. //Console.SetCursorPosition(0, x);
  205. int path; //Для выбора создания элемента
  206. Console.WriteLine("Как добавить элемент? \n 1 - Случайно \n 2 - Ввести с клавиатуры");
  207. //x += 3;
  208. do
  209. {
  210. path = Class1.InputIntNNumber();
  211. if ((path < 1) && (path > 2)) { Console.WriteLine("Повторите ввод, такого номера команды");/*x++*/}
  212. } while ((path < 1) && (path > 2));
  213. HTable = ReSize(HTable, ref size, ref kKoll);
  214. Person human = CreateMan(path);
  215. HTable = Add(human, HTable, ref kKoll);
  216. return HTable;
  217. }
  218.  
  219.  
  220. public static Person [] DeleteMan(Person [] HTable)
  221. {
  222. for (int i = 0; i < HTable.Length; i++)
  223. {
  224. if (HTable[i] != null) break;
  225. if ((i == HTable.Length - 1) && (HTable[i] == null)) { Console.WriteLine("Таблица пуста"); return HTable; }
  226. }
  227. //Console.SetCursorPosition(0, x);
  228. Console.WriteLine("Введите номер аккаунта человека, который хотите удалить:");
  229. //x++;
  230. int number = Class1.InputIntNNumber();
  231. int index = GetIndex(GetHashCode(number, HTable.Length), HTable.Length);
  232. if (HTable[index] != null)
  233. if (HTable[index].account == number) { HTable[index] = null; return HTable; }
  234. for (int i = 0; i<HTable.Length; i++)
  235. {
  236. if (HTable[i] != null)
  237. if (HTable[i].account == number) {HTable[i] = null; return HTable; }
  238. }
  239. Console.WriteLine("Элемент, который надо удалить не найден");
  240. //x++;
  241. return HTable;
  242. }
  243.  
  244. public static void ShowHTAble (Person [] HTable)
  245. {
  246. //Console.SetCursorPosition(0, x);
  247. for (int i = 0; i<HTable.Length; i++)
  248. {
  249. if (HTable[i] != null) Console.WriteLine(HTable[i] + " Индекс в хэш-таблице:"+i);
  250. }
  251. }
  252.  
  253. public static void HowManyCollisions(int filled, ref int kKoll, Person [] HTable, ref bool flag1, ref bool flag2, ref bool flag3)
  254. {
  255. Console.WriteLine("Количество коллизий: " + kKoll);
  256. double fillK = Convert.ToDouble(filled) / HTable.Length; //Коэффциент заполнения таблицы
  257. if ((fillK > 0.45) && (flag1 == false)) { Console.WriteLine("При коэффициенте заполнения {0} в таблице {1} коллизий", fillK * 100, kKoll); flag1 = true; return; }
  258. if ((fillK > 0.75) && (flag2 == false)) { Console.WriteLine("При коэффициенте заполнения {0} в таблице {1} коллизий", fillK * 100, kKoll); flag2 = true; return; }
  259. if ((fillK > 0.9) && (flag3 == false)) { Console.WriteLine("При коэффициенте заполнения {0} в таблице {1} коллизий", fillK * 100, kKoll); flag3 = true; return; }
  260. }
  261.  
  262. }
  263. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement