Advertisement
Val_Kir

апатапт

Jul 2nd, 2020
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.17 KB | None | 0 0
  1. По заданному диапазону символов и числу строк (n <= 100000) генерируется исходный массив строк (char *, нуль-символ в конце строки). Необходимо построить СПИСОК УНИКАЛЬНЫХ СТРОК и рассчитать общее число сравнений строк и число уникальных строк.
  2.  
  3. Для исключения попарного сравнения всех строк требуется использовать хеш-таблицу, а для этого необходимо реализовать 2 класса:
  4.  
  5. список указателей (ссылок) на строки произвольной длины (не использовать стандартный List, нужны методы для добавления к списку уникальной строки и сцепления двух списков),
  6. хеш-таблица, основанная на методе цепочек (массив из q списков и необходимые методы – вычисление хеш-функции, добавление уникальной строки в заданный список, сцепление всех списков в один).
  7. Параметром при создании хеш-таблицы является ПРОСТОЕ ЧИСЛО q (нужно заранее подобрать несколько простых значений в диапазоне от 1000 до 100000).
  8.  
  9. Хеш-функция для строки S длины L вычисляется как полином по схеме Горнера:
  10. f(S) = ((…((0 + S[0]) * 31 + S[1]) * 31 + …+S[L-2]) * 31 +S[L-1]) mod q.
  11. Для исключения переполнения необходимо проводить деление по модулю q после каждого сложения.
  12.  
  13. фп - хеш-функция (hash=смесь).
  14. Хеш-таблица – информационная структура – таблица записей, номера\адреса которых вычисляются на основе фп .
  15.  
  16.  
  17. Поиск
  18.  
  19. Достоинства отсортированных массивов:
  20. • быстрый поиск в ОП ( ),
  21. • возможность поиска в диапазоне, на или , простота получения порядковых статистик.
  22.  
  23. Недостатки отсортированных массивов:
  24. • неприспособленность к динамическим изменениям,
  25. • поиск, недостаточно быстрый для ВУ.
  26. =>
  27. Во многих случаях необходимы динамические структуры данных для быстрого поиска информационных объектов по ключам. Как правило, такие структуры хранят ключевые значения и ссылки (указатели) на соответствующие объекты (реже – сами объекты).
  28.  
  29. Хеширование
  30. Основная идея – получать адрес искомого объекта на основе функционального преобразования его ключевого значения:
  31. по ключу вычисляется значение , определяющее номер записи в некоторой таблице объектов (ссылок).
  32.  
  33. Требования к функции :
  34. 1. =>
  35. 2. простота вычисления (быстрое вычисление адреса)
  36.  
  37. Для сохранения объектов\ссылок необходимо выделить таблицу с записями. Если диапазон возможных значений ключа , то, как правило, .
  38. =>
  39. в общем случае возможно образование конфликтов (коллизий): , но .
  40.  
  41. Общий подход:
  42. • не исключать коллизии, а предусмотреть их обработку,
  43. • выбирать таким образом, чтобы она по возможности равномерно распределяла потенциальных значений ключа по адресам.
  44.  
  45. - хеш-функция (hash=смесь).
  46. Хеш-таблица – информационная структура – таблица записей, номера\адреса которых вычисляются на основе .
  47.  
  48. Пример хорошей функции: , где - простое (при таком значения достаточно равномерно распределяются на , т.е. хеш-таблица используется эффективно).
  49.  
  50. Использование хеш-функции в криптографии.
  51. Обработка коллизий – метод цепочек
  52. Идея: объединять элементы, образующие коллизии, в списки.
  53.  
  54. Хеш-таблица представляет собой массив из списков. Номер списка, в который включается элемент, определяется значением хеш-функции.
  55. Пусть, например, , тогда элементы и попадут в список с номером i.
  56.  
  57. Выбор . Добавление, поиск и удаление элементов. Успешный и безуспешный поиск.
  58.  
  59. Равномерное размещение ключей по спискам:
  60. трудоемкость построения таблицы , поиска .
  61.  
  62. Наихудший случай – списков (коллизий):
  63. трудоемкость построения таблицы , поиска .
  64.  
  65. Обработка коллизий – метод открытой адресации
  66. Идея:
  67. • хеш-таблица длины содержит только ключи,
  68. • элементы, образующие коллизии, объединяются в списки,
  69. • если список образуют элементы, для которых , то они займут незанятые ячейки таблицы с номерами , , где , а остальные шаги не хранятся, а вычисляются.
  70.  
  71. Пример: в таблицу последовательно включаются (все значения разные), ,
  72.  
  73. Поиск элемента со значением в хеш-таблице A (возвращает номер элемента в таблице или -1):
  74.  
  75. k = i = ord(p) % q; // k = i = hash_func(p);
  76. j = 0; // j – номер шага
  77. while (A[k] != p && A[k] != ) // не p и не пустой
  78. {
  79. j++; s = текущий_шаг(j);
  80. k = (i + s) % q;
  81. }
  82. if (A[k] == p) return k; // поиск успешный
  83. else return -1; // поиск безуспешный
  84.  
  85.  
  86. Добавление и удаление элементов
  87.  
  88. Методы вычисления текущего шага должны исключать зацикливание при поиске элементов.
  89.  
  90. Вычисление шага – линейные пробы:
  91. • выбирается , и взаимно простые,
  92. • шаги , , а соответствующие адреса ячеек таблицы .
  93.  
  94. Недостатки, приводящие к росту трудоемкости поиска:
  95. • первичное скучивание – группировка элементов одного списка возле начального элемента (особенно при ),
  96. • вторичное скучивание – группировка элементов разных списков.
  97.  
  98. Желательно, чтобы размещение элементов в таблице было по возможности равномерным и выглядело, как случайное.
  99.  
  100. Вычисление шага – квадратичные пробы:
  101. , соответствующие адреса .
  102. Поиск приведет к повторному выбору элемента на шаге , если для и некоторого предыдущего шага выполнится
  103. .
  104. Тогда , т.е. .
  105. Это может выполниться только при числе шагов (длине списка) .
  106.  
  107. Вычисление шага – двойное хеширование:
  108. Идея заключается в том, что при вычислении шага используется вторая хеш-функция, аргументом которой будет не само поисковое значение p, а значение хеш-функции от него f(p):
  109.  
  110. В один список входят элементы с разными ключами , но одинаковыми (и, следовательно, фиксированным шагом), но для разных списков будут использоваться различные шаги. Это позволяет более равномерно распределить элементы в хеш-таблице.
  111.  
  112. В качестве второй хеш-функции можно взять:
  113. h( f ( p)) = f( p) mod r + s, где , s > 0, r и s - константы.
  114.  
  115. Пусть в таблице хранится элементов, и – это заполненность таблицы. Рассмотрим асимптотический случай .
  116. Будем полагать, что при поиске на каждом шаге события «элемент таблицы занят» и «элемент таблицы свободен» независимы, и их вероятности равны, соответственно, и .
  117. Вероятности событий «получение свободного элемента за…»:
  118. 1 шаг – ,
  119. 2 шага – ,
  120. шаг – .
  121.  
  122. В силу независимости данных событий:
  123. (условие нормировки).
  124.  
  125. Средняя длина безуспешного поиска (или трудоемкость размещения нового элемента) при заполненности :
  126.  
  127.  
  128. Пусть элементы таблицы не удаляются. Тогда при успешном поиске элемента проводятся те же самые действия, что и при размещении данного элемента в таблице.
  129. Трудоемкость успешного поиска элемента равна числу шагов при размещении данного элемента, а это число зависело от текущей заполненности таблицы.
  130.  
  131. Пусть - текущая заполненность таблицы. При размещении элементов изменяется от до .
  132.  
  133. Средняя длина успешного поиска:
  134.  
  135. Вывод: задавать ; если при добавлении новых эл-тов (увеличении ) достигается указанная граница, следует выделить новую таблицу с записями и последовательно разместить в ней все элементы из старой.
  136.  
  137. Применение хеширования для данных на ВУ
  138. Для размещения элементов (ключей) выделяется блоков по записей т.о., что .
  139. Данные читаются и записываются блоками.
  140. Блок ( ) содержит от 0 до элементов , для которых , и еще 2 значения – текущее число элементов и или номер блока в области переполнения, куда попадает ( )-й элемент с таким же значением хеш-функции:
  141.  
  142. При увеличении (и соответствующем уменьшении ) происходит более равномерное распределение записей по блокам.
  143. Д.Кнут показал: при и заполненности таблицы среднее число чтений блоков составляет 1.04.
  144.  
  145. Недостатки хеширования:
  146. • недостаточная приспособленность к динамическим изменениям (число элементов таблицы должно быть известно заранее, удаление элементов повышает трудоемкость поиска),
  147.  
  148. • высокая трудоемкость в наихудшем,
  149.  
  150. • поиск только по совпадению ключей.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement