Advertisement
Guest User

Untitled

a guest
Feb 6th, 2016
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.44 KB | None | 0 0
  1. Naszym zadaniem było zaimplementowanie algorytmu do wyszukiwania wszystkich permutacji danego zbioru. Do tego celu skorzystaliśmy z gotowego algorytmu, wspomianiego w prezentacji (cs.princeton.edu/~rs/talks/perms.pdf), implementując go w języku C i przystosowując do współpracy z dynamiczną tablicą danych reprezentującą permutowany zbiór.
  2.  
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. int* tab;
  8. int n;
  9.  
  10. void pokaz() {
  11.     int i;
  12.     for (i = 1; i <= n; ++i) printf("%d", tab[i]);
  13.     puts("");
  14. }
  15.  
  16. int zamien(int* a, int* b) {
  17.     int t = *a;
  18.     *a = *b;
  19.     *b = t;
  20. }
  21.  
  22. void generuj(int u) {
  23.     int c;
  24.     if (u == 1) {
  25.         pokaz();
  26.         return;
  27.     }
  28.     for (c = 1; c <= u; ++c) {
  29.         zamien(&tab[c], &tab[u]);
  30.         generuj(u-1);
  31.         zamien(&tab[c], &tab[u]);
  32.     }
  33. }
  34.  
  35. int main(int argc, char** argv) {
  36.     if (argc != 2) {
  37.         printf("Uzycie: %s <pojemnosc>\n", argv[0]);
  38.         return 1;
  39.     }
  40.  
  41.     n = atoi(argv[1]);
  42.     tab = malloc((n+1)*sizeof(int));
  43.     int i;
  44.     for (i = 1; i <= n; ++i) tab[i] = i;
  45.  
  46.     generuj(n);
  47.    
  48.     free(tab);
  49.     return 0;
  50. }
  51.  
  52. Przykładowe wyjście programu dla n=5
  53. 23451
  54. 32451
  55. 34251
  56. 43251
  57. 24351
  58. 42351
  59. 43521
  60. 34521
  61. 35421
  62. 53421
  63. 45321
  64. 54321
  65. 24531
  66. 42531
  67. 45231
  68. 54231
  69. 25431
  70. 52431
  71. 23541
  72. 32541
  73. 35241
  74. 53241
  75. 25341
  76. 52341
  77. 53412
  78. 35412
  79. 34512
  80. 43512
  81. 54312
  82. 45312
  83. 43152
  84. 34152
  85. 31452
  86. 13452
  87. 41352
  88. 14352
  89. 54132
  90. 45132
  91. 41532
  92. 14532
  93. 51432
  94. 15432
  95. 53142
  96. 35142
  97. 31542
  98. 13542
  99. 51342
  100. 15342
  101. 25413
  102. 52413
  103. 54213
  104. 45213
  105. 24513
  106. 42513
  107. 45123
  108. 54123
  109. 51423
  110. 15423
  111. 41523
  112. 14523
  113. 24153
  114. 42153
  115. 41253
  116. 14253
  117. 21453
  118. 12453
  119. 25143
  120. 52143
  121. 51243
  122. 15243
  123. 21543
  124. 12543
  125. 23514
  126. 32514
  127. 35214
  128. 53214
  129. 25314
  130. 52314
  131. 53124
  132. 35124
  133. 31524
  134. 13524
  135. 51324
  136. 15324
  137. 25134
  138. 52134
  139. 51234
  140. 15234
  141. 21534
  142. 12534
  143. 23154
  144. 32154
  145. 31254
  146. 13254
  147. 21354
  148. 12354
  149. 23415
  150. 32415
  151. 34215
  152. 43215
  153. 24315
  154. 42315
  155. 43125
  156. 34125
  157. 31425
  158. 13425
  159. 41325
  160. 14325
  161. 24135
  162. 42135
  163. 41235
  164. 14235
  165. 21435
  166. 12435
  167. 23145
  168. 32145
  169. 31245
  170. 13245
  171. 21345
  172. 12345
  173.  
  174.  
  175. Korzystając z komendy time, wyznaczyliśmy przybliżoną charakterystykę złożoności czasowej algorytmu.
  176. [n]  [s]
  177. 1  0.001
  178. 2  0.001
  179. 3  0.001
  180. 4  0.001
  181. 5  0.001
  182. 6  0.001
  183. 7  0.005
  184. 8  0.037
  185. 9  0.358
  186. 10 4.033
  187. 11 48.491
  188.  
  189. [wykresik plosię]
  190.  
  191.  
  192. Złożoność tego algorytmu to, jak widać, O(n!). Jest to zupełnie wystarczający wynik dla małych zbiorów danych wejściowych, lecz w przypadku już niewiele większych absolutnie nieakceptowalny. Permutacje stosowane są m. in. do testowania programów (losowy ciąg danych wejściowych użytkownika).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement