Advertisement
Guest User

Untitled

a guest
Apr 19th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.36 KB | None | 0 0
  1. ktoś mądry to sortowanie wymyślił 😀
  2. generalnie to pewnie można zrobić tak, że dzielisz poksy na 2 zobry:
  3. 1. te wypuszczone
  4. 2. te zamknięte
  5. i teraz wypuszczasz najpierw te spokojne
  6. czyli przenosisz je do zbioru 1
  7. teraz przeglądasz te elementy ze zbioru 1 i patrzysz jakby w drugą stronę
  8. czyli jakie na nie poluja
  9. zwiększasz licznik tamtym pokemonom o 1 i jak któryś będzie miał licznik >= 2 to go przenosisz do zbioru 1
  10. itd
  11. tylko trzeba uważać, żeby 2 razy nie przeglądnąć tej samej krawędzi, ale to można po prostu je usuwać i będzie git
  12. i to jest złozność O(m) gdzie m to liczba krawędzi
  13. tylko zastanawiam się, bo po przenoszeniu tych niebezpiecznych, ale które polują na bezpieczne, większa ilość niebezpiecznych będzie mogła przejść
  14. czy to będzie w jakieś pętli while(true)?
  15.  
  16. no można w while(true),
  17. albo wrzucać do jakiejś kolejki krawędzie, które trzeba sprawdzić po wrzuceniu pokemona do grupy 1
  18. musze sobie to rozrysować
  19. na grafie bedzie to bardzo czytelne ;D
  20.  
  21. tak :d
  22.  
  23. genrealnie:
  24. na kolejkę wrzucasz wierzchołki z grupy 1 i robisz while(!kolejka.empty())
  25.  
  26. i podczas obiegu kolejki czyli
  27.  
  28. while(!kolejka.empty()) {
  29. wierzcholek w = kolejka.top(); kolejka.pop();
  30.  
  31. przeglądnij wszystkie krawędzie wchodzące do wierzchołka w,
  32. jeśli krawędz chodzi z wierzchołka z grupy 2, zwiększ mu licznik, jeśli jego licznik jest == 2, wrzuć go na kolejkę
  33.  
  34. }
  35.  
  36. jesli wszystkie wierzchołki są w grupie 2 wygrałeś, jeśli nie to nie da się tego zrobić
  37. okej, dzięki, musze to przemyśleć xD bo na grafach pierwszy raz coś robię
  38.  
  39. będziesz startował w cf dzisiaj? 😀
  40. w sumie jeszcze się nie patrzyłem na tematy zadań, myśle że potem ogarnę, teraz te pokemony rysuję i próbuję zrozumieć twój pomysł 😀
  41.  
  42. bo musisz utworzyć drugą listę z krawędziami zwróconymi w drugą stronę, wiesz
  43. a licznik na danym pokemonie to chodziło Ci "ilość pokemonów polujących na niego", czy "ilość pokemonów na które poluje"?
  44. raczej to pierwsze, ale dla pewności pytam 😀
  45.  
  46. licznik zwiększasz tylko pokemonom w grupie 2 (czyli jeszcze nie wypuszczonym)
  47. i chodzi o to, żeby na wolności były co najmniej 2 pokemony, na które dany pokemon poluje
  48. bo te w grupie 1 to są te wypuszczone
  49. i tylko te z licznikiem >= 2 wypuszczam
  50.  
  51. tak
  52. i jeśli nie znajde takich a nadal będą w grupie 2 to nie da się
  53.  
  54. ale w praktyce to i tak będzie to przy wypuszczaniu licznik zawsze będzie równy 2, bo przegladając kolejke zwiększasz go o 1 i nie przeskakujesz itp
  55. tak
  56. okej, w miarę czaję ale jednak musze to calkiem rozrysowac i zobaczyc czy działa w praktyce xD
  57. dzięki wielkie za pomoc
  58.  
  59. ok 😀
  60. spx
  61. mam jeszcze pytanie do jednego, wspomniałeś o złożoności o(m) przy liczeniu krawędzi przecinających dwa zbiory. Powiedzmy że mam już spokojne pokemony w grupie 1 i reszta w grupie 2. Żeby inkrementować liczniki tym z grupy 2 muszę iterować przez całą listę tyle razy ile jest pokemonów w grupie 1 (tzn za pierwszym razem szukam ile pokemonów poluje na pierwszego spokojnego i im inkrementuje, potem szukam ile pokemonów poluje na drugiego spokojnego itd.) Nie będzie to złożoność O(m*ilość_spokojnych_pokemonów)?
  62. chyba że da się te liczniki załatwić podczas jednego przejazdu przez listę, ale nie za bardzo wiem jak
  63.  
  64. nie,
  65. podczas przeglądania kolejki, przeglądasz każdą krawędź co najwyżej raz => złożność O(m)
  66. no tak, ale przeglądając krawędzie mogą być takie, które mają jako "cel polowania" pokemona z tej grupy 2 i muszę chyba sprawdzić, czy ten cel polowania to jeden z spokojnych pokemonów
  67.  
  68. Na początki przeglądasz raz wszystkie pokemony i wrzucasz do gr 1 te które można od razu wypuścić
  69. tak
  70. i wszystkie krawędzie do kolejki?
  71.  
  72. Do kolejki wrzucasz wierzchołki nie krawędzie
  73. Każdy wierzchołek zostanie wrzucony co najwyżej raz
  74. Do kolejki
  75. wierzchołki czyli pokemony z grupy 1?
  76. te które przeszły właśnie?
  77.  
  78. Tak
  79. chyba zaczynam rozumieć xD
  80. po co ta kolejka była
  81. o dobra czaję, tylko jeszcze nie za bardzo wiem jak zaimplementować grupę 2
  82. bo z niej będę usuwać kolejne pokemony
  83. i na końcu sprawdzać, czy ktokolwiek tam jest
  84. to powinna być lista?
  85.  
  86. To znaczy możesz zrobić dodatkowa tablice booli
  87. I jak przerzucasz pokemona to dajesz true
  88. o rozmiarze n i oznaczać czy istnieje tam pokemon
  89. okej
  90. czaję, jeszcze raz dzięki wielkie 😀
  91.  
  92. Spoko 😀
  93. A wiesz czemu zlozonosc O(m) lub raczej O(m+n)?
  94. chwila
  95. mówisz o złożoności całego algorytmu?
  96.  
  97. Tak
  98. kurcze, na prawde nie wiem, wydaje mi sie ze to zależy od sytuacji, bo powiedzmy jak masz dużo elementów w kolejce i tak się składa że już żadnych nie da się przepuścić do grupy 1, to złożoność powinna być
  99. o(m*bezpieczne_pokemony)
  100. bo dla każdego elementu z kolejki sprawdza
  101. a w kolejce teoretycznie może być n-1 elementów
  102. też nie wiadomo ile będzie iteracji tego while(true) 😕
  103. tzn while(kolejka.empty())
  104. !kolejka.empty()*
  105.  
  106. Podczas przeglądania kolejki bierzesz pierwszy element i go popujesz z kolejki, później go już nie dodajesz,
  107. Czyli do kolejki każdy element wejdzie co jawyzej raz, raz ja opuści,
  108. Podczas tego jak zajmujesz się danym elementem z góry kolejki to przeglądasz wszystkie jego krawędzie, czyli przejrzysz w sumie wszystkie krawędzie bo z każdego elementu przejrzysz wszystkie wchodzące do niego
  109.  
  110. I to wychodzi O(n+m)
  111. Jak się nie da już żadnych przepuścić to usuniesz wszystkie elementy z kolejki i tyle
  112. I skończysz algorytm
  113. okej, ale powiedzmy, że mam 5 elementów w kolejne, przeglądam pierwszy, szukam krawędzi (polujących na niego, w czasie O(m)), nie znajduję, nikomu licznika nie zwiększam, więc przechodzę do kolejnego elementu kolejki i znowu szukam krawędzi O(m)
  114. i to już jest jakby 2*m, więc pesymistycznie nie powinno byc chyba O(m+n)
  115.  
  116. Ale to nie przeglądasz wszystkich krawędzi na raz
  117. Tylko te które wchodzą do danego elementu
  118. ale żeby sprawdzić które wchodzą to muszę przez całą listę przejść chyba
  119.  
  120. Ich jest jakieś a,
  121. Do drugiego wchodzi b krawędzi
  122. I jak zsumujess a+b+....+z to ci wyjdzie m czyli liczba krawędzi
  123. Nie musisz przeglądać wszystkich
  124. Możesz zrobić nowa listę, w której bedziesz miał dla danego elementu wszystkie te które do niego wchodzą
  125. a no to tak, wtedy faktycznie
  126. ja myślałem, że po tym chcesz jeździć
  127.  
  128. Nie
  129. czyli w sumie najgorzej będzie n-1 dodatkowych list
  130.  
  131. No tak, ale liczba elementów w sumie w tych listach to będzie m
  132. tak
  133. w sumie możnaby na początku zrobić te n list i dla każdego pokemona
  134. zapisywać kto na niego poluje
  135.  
  136. Tak, na podatku tworzysz ta listę
  137. Listę list
  138. to jest dobre i teraz rozumiem o co chodziło z usuwaniem krawędzi
  139. żeby usuwać element z tej listy przy zwiększaniu licznika
  140. tak?
  141.  
  142. To znaczy nie trzeba usuwać krawędzi
  143. Bo i tak nie bedziesz później ich przeglądał jak już raz przeglądniesz
  144. no racja
  145. tylko max 1 raz moge przeglądać pokemona z grupy 1
  146.  
  147. Tak
  148. To znaczy co to była grupa 1? 😀
  149. Bo już sb zapomniałem
  150. te które już są wypuszczone
  151.  
  152. No to tak
  153. te listy list zawsze wydają mi się trochę meh pamięciowo
  154. no ale bez tego złożoność będzie sporo większa
  155.  
  156. Będzie wtedy kwadratowa
  157. No trochę to zajmuje, ale ciagle to jest linowa zlozonosc zajmowanego miejsca z duża stała
  158. nom
  159. spoko pomysł ;D
  160. co prawda chyba tego sortowania na grafach nie użyłeś
  161. chyba że ja tego nie widzę
  162. no ale teraz jak zczaiłem te listy to wydaje sie bardzo logiczne to
  163.  
  164. To znaczy to jest prawie to samo co sortowanie topoligiczne, z ta różnica ze tu wrzucasz do kolejki element jak 2 sąsiadów jest już odwiedzonych a przy sortowaniu topo, wrzucasz dopiero jak wszyscy sąsiedzi będą przetworzeni, to znaczy jakby dopiero wtedy gdy byś wypuścił wszystkich pokemonow na kotorych poluje dany pokemon
  165.  
  166. A tu wystarczy ze są 2 wypuszczone
  167. to jeszcze jedno 😀 czemu O(m+n) a nie O(m)
  168. chodzi tylko o to, że alokujesz n list i tablice booli o rozmiarze n?
  169. czy to "n" pojawia się jeszcze gdzieś indziej
  170.  
  171. Jeszcze podczas przeglądania kolejki, bo przeglądasz każdy element raz i jak np byś nie miał krawędzi w ogóle to i miał w kolejce wszystkie wierzchołki to i tak byś je przeglądnąć
  172. a
  173. no racja
  174.  
  175. Coś dzisiaj strasznie nie po polsku pisze 😀
  176. ee nie spoko to wytłumaczyłeś
  177. tylko ja powoli to trawię xD
  178.  
  179. Chodzi mi bardziej o moje błędy językowe 😀
  180. a, to nie przeszkadzały ;D
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement