Advertisement
Guest User

Untitled

a guest
Feb 26th, 2020
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.01 KB | None | 0 0
  1. program Lab3;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. {$R *.res}
  6.  
  7. uses
  8. System.SysUtils;
  9.  
  10. type
  11. SetCh = Set of ansiChar;
  12. SetsAndHash = record
  13. x: SetCh;
  14. h:integer;
  15. flg:boolean;
  16. end;
  17. tab = array of SetsAndHash;
  18. Hash = function (var x:SetCh):integer;
  19. var
  20. a:tab;
  21. f:textfile;
  22. n:integer;
  23. Equallity, Collision:integer;
  24. procedure MakeSet (var f:textfile; n:integer);
  25. var
  26. i, j, k:integer;
  27. begin
  28. randomize;
  29. k:=2 + random(3);
  30. for i := 1 to k do
  31. write (f, chr(97 + random (25)));
  32. for j := 2 to n do
  33. begin
  34. writeln (f);
  35. randomize;
  36. k:=3 + random(5);
  37. for i := 1 to k do
  38. write (f, chr(97 + random (25)));
  39. end;
  40. end;
  41.  
  42. procedure GetSet (var f:textfile; var InSet:tab);
  43.  
  44. var
  45. ch:ansichar;
  46. n:integer;
  47. begin
  48. n:=0;
  49. while not eof(f) do
  50. begin
  51. inc(n);
  52. while not eoln(f) do
  53. begin
  54. read (f, ch);
  55. setlength (InSet, n);
  56. include (InSet[n-1].x, ch);
  57. end;
  58. readln (f);
  59. end;
  60. end;
  61.  
  62. function Hash1 (var x:SetCh):integer;
  63. var
  64. c:ansichar;
  65. i, k:integer;
  66. begin
  67. result:=0;
  68. i:=0;
  69. k:=51;
  70. for c in x do
  71. begin
  72. result:=result + ((ord(c) xor k) shl i);
  73. inc(i);
  74. end;
  75.  
  76. end;
  77.  
  78. function Hash2 (var x:SetCh):integer;
  79. var
  80. c:ansichar;
  81. i:integer;
  82. begin
  83. result:=0;
  84. i:=1;
  85. for c in x do
  86. begin
  87. result:=result + (ord(c) shl(i))*i;
  88. inc(i);
  89. end;
  90.  
  91. end;
  92.  
  93. function f1(x, y, z: byte): byte;
  94. begin
  95. result := x and y or not x and z;
  96. //result := x + y + z;
  97. end;
  98. function f2(x, y, z: byte): byte;
  99. begin
  100. result := x and z or not z and y;
  101. //result := -x + y + z;
  102. end;
  103. function f3(x, y, z: byte): byte;
  104. begin
  105. result := x xor y xor z;
  106. //result := x - y + z;
  107. end;
  108. function f4(x, y, z: byte): byte;
  109. begin
  110. result := y xor (not z or x);
  111. //result := x + y - z;
  112. end;
  113. function FHash(var s:SetCh): integer;
  114. var
  115. ch: char;
  116. a: byte ;
  117. b: byte ;
  118. c: byte;
  119. d: byte;
  120. begin
  121. a:= 5;
  122. b:= 59;
  123. c:= 167;
  124. d:= 211;
  125. for ch in s do
  126. begin
  127. a := a + f1(b, c, d) + ord(ch);
  128. a := (a shl 1) or (a shr 7);
  129. b := b + f2(c, d, a) + ord(ch);
  130. b := (b shl 3) or (b shr 5);
  131. c := c + f1(d, a, b) + ord(ch);
  132. c := (c shl 5) or (c shr 3);
  133. d := d + f1(a, b, c) + ord(ch);
  134. d := (d shl 7) or (d shr 1);
  135. end;
  136. result := a;
  137. result := (result shl 8) or b;
  138. // result * 256 + b
  139. result := (result shl 8) or c;
  140. // result * 256 + c
  141. result := (result shl 8) or d;
  142. // result * 256 + d
  143. end;
  144.  
  145. procedure Hashing (var b:tab; HFunc:Hash);
  146. var
  147. i:integer;
  148. begin
  149. for i := 0 to length(b) -1 do
  150. begin
  151. b[i].flg:=false;
  152. b[i].h:=HFunc (b[i].x);
  153. end;
  154. end;
  155.  
  156. procedure EqAndColl (var b:tab; var Eq:integer; var Coll:integer);
  157. var
  158. i, j:integer;
  159. flg:boolean;
  160. begin
  161. Eq:=0;
  162. Coll:=0;
  163.  
  164. for i := 0 to length(b)-1 do
  165. if not b[i].flg then
  166. begin
  167. b[i].flg:=true;
  168. flg:=false;
  169. for j := i+1 to length (b)-1 do
  170. if (b[i].h = b[j].h) and not b[j].flg then
  171. begin
  172.  
  173. b[j].flg:=true;
  174. if not ( b[i].x <> b[j].x )then
  175. begin
  176. if not flg then
  177. begin
  178. Eq:=Eq+2;
  179. flg:=true;
  180. end
  181. else
  182. inc(Eq);
  183. end
  184. else
  185. begin
  186. if not flg then
  187. begin
  188. Coll:=Coll+2;
  189. flg:=true;
  190. end
  191. else
  192. inc(Coll);
  193. end;
  194. end;
  195. end;
  196. end;
  197.  
  198. begin
  199. assignfile (f, 'Base.txt');
  200. reset (f);
  201. readln (f, n);
  202. close (f);
  203. assignfile (f, 'input.txt');
  204. rewrite (f);
  205. MakeSet (f, n);
  206. close (f);
  207. assignfile (f, 'input.txt');
  208. reset (f);
  209. GetSet (f, a);
  210. close (f);
  211. assignfile (f, 'output.txt');
  212. rewrite (f);
  213. Hashing (a, Hash1);
  214. EqAndColl (a, Equallity, Collision);
  215. writeln (f, Equallity, Collision:5);
  216. Hashing (a, Hash2);
  217. EqAndColl (a, Equallity, Collision);
  218. writeln (f, Equallity, Collision:5);
  219. Hashing (a, FHash);
  220. EqAndColl (a, Equallity, Collision);
  221. writeln (f, Equallity, Collision:5);
  222. close (f);
  223. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement