|
|
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
softwarerОдного гигабайта оперативки - столько есть на любой современной рабочей станции - хватит, чтобы хранить матрицу связности графа примерно на 90'000 вершин. мимо. 90к вершин орграфа без циклов может содержать, например, 600*(300 + 600 + 600^2 + 600^3 + ... + 600^299) ~ 7*10^827 маршрутов (300 блоков вида (1вершина -> 300 вершин -> 1 вершина) соединенных последовательно) кроме того. мелкая софтиночка с ориентированными графами на гигабайт... извините, неприемлемо, тоже имхо, но подкреплять не буду. softwarerСколько времени будет обсчитываться волна "из точки во все" на таком графе - довольно интересный вопрос. Заснуть, конечно, не успеешь, но вот получить ответ за комфортное для интерактивного режима время - далеко не факт. подкреплять будете или как?))) циклов в графе нет, все маршруты не превосходят по длине кол-ва вершин в графе, если при этом еще поколдовать над алгоритмом, учитывая точки "пересечения" маршрутов, то ваще шоколадно, но скорее всего и это не потребуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2008, 00:08 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
asvdfdsv600*(300 + 600 + 600^2 + 600^3 + ... + 600^299) ~ 7*10^827 ха ошибочка, на несколько порядков больше))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2008, 00:10 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
asvdfdsv90к вершин орграфа без циклов может содержать, например, 600*(300 + 600 + 600^2 + 600^3 + ... + 600^299) ~ 7*10^827 маршрутов Угу. Это оценка сверху. А оценка снизу? asvdfdsvмелкая софтиночка с ориентированными графами на гигабайт... извините, неприемлемо, тоже имхо, но подкреплять не буду. Не очень знаю, откуда Вы взяли мелкую софтиночку, но в любом случае имхо интересны эксплуатационные характеристики. Экономить ресурс, которого навалом - не всегда разумная позиция. Если ставить задачей эффективную работу с графами максимального размера, то совершенно истинна прозвучавшая мысль о том, что надо частично строить заранее, а дальше динамически. asvdfdsvподкреплять будете или как?))) Нет, не буду. Также как и с маршрутами, числа гуляют на многие порядки - вследствие собственно прямой зависимости от количества маршрутов. Можно воспользоваться Вашей оценкой, данной выше: если, допустим, в оптимистическом варианте Вам удастся дать ответ за 1 микросекунду, сколько времени займет поиск при пессимистическом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2008, 00:52 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
softwarer реттиВаще децсад. "уже имеем путь БА". И как мы узнаем что мы его, этот путь, "уже имеем"(или, уже "поимели")? Ваш вопрос показывает, что Вы либо не читали то, на что отвечаете, либо временно/постоянно не в состоянии воспринимать прочитанное. До тех пор, пока означенные факторы не изменятся, беседа вряд ли будет осмысленной. ой ну прямо ...... я подобной куйни нарешал воз и маленькую тележку. И мгновенно определяю кто в теме, а кто нет. А по существу я был абсолютно прав. Это ("уже имеем путь БА") звучит как насмешка. Вроде топикстартер ну ваще дебил. А тут все умные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2008, 01:12 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
Навеяло, http://acm.sgu.ru/problem.php?contest=0&problem=174 Ых, такие все умные. Пистец. Мне некуй доказывать. Я себя знаю. В софтверных конторах такого понимания самого себя хер получишь. Не совсем то, конечно ( не орграф ), но я выделяю компоненты и раком и боком, и волновым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2008, 01:18 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
Откуда ваще такие люди берутся? Вот пишет: поступило на вход ребро 33-456. Проверь, нет ли пути 456--33. Японский бох. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2008, 01:38 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
Замшелые сцуки & твари. Он даже не может понять другую сторону. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2008, 01:39 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
Alexsalog softwarer FarusКто поможет: предложите алгорим определения цикличиеских ссылок на графе произвольного размера. Зависит от того, что именно Вам нужно. Найти все циклы во всех вариантах? Найти фундаментальные циклы? Определить факт наличия циклов без поиска самих циклов? Еще что-нибудь? И таки да, гугль содержит более чем достаточно информации на эту тему. Найти любые циклы, притом если граф строится итеративно - то сообщить об этом цикле и показать его в момент добавления решающего ребра. Т.е. ответить на вопрос присутствует ли в графе цикл или нет. Графы считаем связными. 1) Дерево это граф без циклов. Это определение 2) Граф является деревом тогда и только тогда когда количество вершин на одну больше количества ребер. Это есть такая теорема. Посчитайте ребра и вершины. Если строится итеративно, то и считайте итеративно, только следите за связностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2008, 06:13 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
rettyЗамшелые сцуки & твари. Он даже не может понять другую сторону. А закусить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2008, 12:00 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
c1272) Граф является деревом тогда и только тогда когда количество вершин на одну больше количества ребер. Это есть такая теорема. Это есть теорема только для связных неориентированных графов. Если заменить "на одну больше" на "на на количество областей связности больше", видимо, можно обобщить на любые неориентированные графы. А вот с ориентированными, боюсь, труба. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2008, 12:13 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
softwarer c1272) Граф является деревом тогда и только тогда когда количество вершин на одну больше количества ребер. Это есть такая теорема. Это есть теорема только для связных неориентированных графов. Если заменить "на одну больше" на "на на количество областей связности больше", видимо, можно обобщить на любые неориентированные графы. Со связностью все понятно, обобщается легко. А вот с ориентированными, боюсь, труба. Дейкстра. Как побочный эффект находит циклы неотрицательной длины. Его сложность по-моему лучше чем O(N**2) и по ребрам и по вершинам, и нетребователен к памяти, так что вполне. Но думаю что есть лучшие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2008, 08:55 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
Собсно, Дейкстра -- это разновидность волнового алгоритма. Я вот тут накорябал. Только тяну не сумму стоимостей, а для каждой вершины тяну шлейф из множества вершин, из которых можно попасть в нее. Вроде бы работает. Например, trail[5] = {4, 7, 8, 9} значит что на каком-то этапе прохождения волны мы увидели что в вершину № 5 можно попасть из вершин №№ 4, 7, 8, 9. Эти хвосты, ес-но, будут расти и расти. Потом мы увидим, что проходя из вершины № 100 в вершину № 222, -- вершина № 222 входит в trail[100]. Т.е., обнаружен цикл. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2008, 15:42 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
Взял 95-вершинный орграф, с 3710 ребром; граф без циклов: по построению, все ребра идут от "меньшей" вершины к "большей". Добавил 5 искусственных ребер, образующих цикл. Получил ответ: Обнаружен цикл, проходящий через вершину № 33 (немного подправил код) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2008, 17:00 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
asvdfdsv90к вершин орграфа без циклов может содержать, например,.. это да; если цикла/ов нет , то придется "ждать" , а если есть , то оно как-то быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2008, 17:05 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
Добавил нюанс. В первом примере вершины №№ 9, 10 и 11 образуют вот такой междусобойчик: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. по которым прошла очередная волна. Т.е., идти вниз из № 9 к вершинам №№ 1 - 8 смысла нет никакого. Мы больше там ничего нового не нароем. Типа так. Может и ошибаюсь. На графе без циклов (95v3710e) получил ускорение ровно в 2 раза. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2008, 18:51 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
Вот нарыл: http://www.geocities.com/Vienna/7079/src/graph.txt Подсунул ему свой граф без циклов, обрезанный до 1000 ребер (там в комментах такое ограничение), но ответа 'No cycles' так и не дождался. Может оно затыкается на одиноких висячих вершинах. Я не разбирался. На 11-реберном графе ответ выдает какой надо. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 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. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. Кстати, сишный код читает "научный" формат ребер: "e 5 3", а не просто "5 3". Так что, если чего, то нужны поправки к коду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2008, 21:57 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
А вот кстати вспомнил. МИПТовская задача: http://acm.mipt.ru/judge/problems.pl?problem=012 Похоже -- это наш сабж. Попробую сдать. Там питон в обойме языков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2008, 22:36 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
Продолбался как баран. Получил кучу runtime error. Пока не додумался обрезать свой код до предела. У них питон версии 2.1.3. Я это знал, но не думал, что 5.7 sets -- Unordered collections of unique elements New in version 2.3. ===== А built-in сет() появился еще позже. Короче, невезуха. Точнее, просто им плевать. Этакий ненавязчивый сервис под соусом широты души. Или, как грили в стране советов: вас много, а я одна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2008, 04:53 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
retty softwarer реттиВаще децсад. "уже имеем путь БА". И как мы узнаем что мы его, этот путь, "уже имеем"(или, уже "поимели")? Ваш вопрос показывает, что Вы либо не читали то, на что отвечаете, либо временно/постоянно не в состоянии воспринимать прочитанное. До тех пор, пока означенные факторы не изменятся, беседа вряд ли будет осмысленной. ой ну прямо ...... я подобной куйни нарешал воз и маленькую тележку. И мгновенно определяю кто в теме, а кто нет. А по существу я был абсолютно прав. Это ("уже имеем путь БА") звучит как насмешка. Вроде топикстартер ну ваще дебил. А тут все умные. Мне просто лень думать и кроме того дефицит общения :-) Я вот что придумал: "алгоритм реки" - название придумал сам (речь идет об ориентированном графе) : все вершины располагаются в некой таблице по старшинству. то есть если стрелочка направлена из вершины А в вершину В, то А "старше" B. И в таблице "потока" они будут располагаться так: Код: plaintext 1. 2. 3. Пусть теперь, из B выходит две стрелочки - одна в вершину С, а другая ИЗ вершины D. Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. Как видим, если C станет "старше" D, то возникает цикл. Идуцируем обобщение (пытаемся): при вставке в указанную таблицу новой вершины, располагая её по правилу иерархии с "родительской" вершиной мы не должны обнаружить её же выше себя самой. И наоборот. Вообщем, вершина не должна быть в двух местах по иерархии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2008, 10:48 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
Что-то в этом есть. Если бы ребра поступали на вход без разрывов, так сказать. Например, так: 1 -> 2 -> 3 -> 4 -> 5 Мы бы помечали предков: № 1 - предков нет № 2 - № 1 № 3 - №№ 1, 2 № 4 - №№ 1, 2, 3 № 5 - №№ 1, 2, 3, 4 Теперь приходит ребро 5 -> 1. И мы сразу видим "противоречие": № 5 старше № 1, но № 1 входит в число его предков. Цикл. А если ребро 2 -> 3 придет "позже всех"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2008, 18:43 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
Глянул на свое решение вот этого http://www.spoj.pl/problems/PFDEP/ Топологическая сортировка, но с условием Your program can assume that there are no circular dependencies in the rules, i.e. no task depends directly or indirectly on itself. У меня там простейшая рекурсивная функция: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Тем более не соображу можно ли сюда вставить проверку на зацикленность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2008, 19:51 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
Поставил себе питон-модуль networkx https://networkx.lanl.gov/download/networkx/networkx-0.36.win32.exe Так он ацикличность моего графа на 3710 ребер определил в раз 110 быстрее моего ламерства. По времени выглядит так как будто ему неважно есть в графе циклы или нет. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. И чиво там только нет: >>> import networkx as nx >>> dir(nx) ['DiGraph', 'Graph', 'LCF_graph', 'NetworkXError', 'NetworkXException', 'XDiGraph', 'XGraph', '__author__', '__builtins__', '__date__', '__doc__', '__file__', '__license__', '__name__', '__path__', '__version__', '_get_fh', 'adjlist', 'all_pairs_shortest_path', 'all_pairs_shortest_path_length', 'average_clustering', 'balanced_tree', 'barabasi_albert_graph', 'barbell_graph', 'betweenness_centrality', 'bidirectional_dijkstra', 'bidirectional_shortest_path', 'binomial_graph', 'brandes_betweenness_centrality', 'bull_graph', 'cartesian_product', 'center', 'centrality', 'chvatal_graph', 'circular_ladder_graph', 'cliques', 'cliques_containing_node', 'closeness_centrality', 'cluster', 'clustering', 'complement', 'complete_bipartite_graph', 'complete_graph', 'component', 'compose', 'configuration_model', 'connected_component_subgraphs', 'connected_components', 'connected_double_edge_swap', 'connected_smax_graph', 'convert', 'convert_node_labels_to_integers', 'convert_to_directed', 'convert_to_undirected', 'create_degree_sequence', 'create_empty_copy', 'cubical_graph', 'cumulative_distribution', 'cycle_graph', 'dag', 'degree', 'degree_centrality', 'degree_histogram', 'degree_sequence_tree', 'dense_gnm_random_graph', 'density', 'desargues_graph', 'dfs_postorder', 'dfs_predecessor', 'dfs_preorder', 'dfs_successor', 'dfs_tree', 'diameter', 'diamond_graph', 'digraph', 'dijkstra_path', 'dijkstra_path_length', 'dijkstra_predecessor_and_distance', 'discrete_sequence', 'disjoint_union', 'distance', 'dodecahedral_graph', 'dorogovtsev_goltsev_mendes_graph', 'double_edge_swap', 'drawing', 'eccentricity', 'edgelist', 'edges', 'edges_iter', 'empty_graph', 'erdos_renyi_graph', 'exception', 'expected_degree_graph', 'fast_gnp_random_graph', 'find_cliques', 'floyd_warshall', 'from_dict_of_dicts', 'from_dict_of_lists', 'from_numpy_matrix', 'from_scipy_sparse_matrix', 'from_whatever', 'frucht_graph', 'function', 'generators', 'gn_graph', 'gnc_graph', 'gnm_random_graph', 'gnp_random_graph', 'gnr_graph', 'gpickle', 'graph', 'graph_clique_number', 'graph_number_of_cliques', 'graphml', 'grid_2d_graph', 'grid_graph', 'havel_hakimi_graph', 'heapq', 'heawood_graph', 'house_graph', 'house_x_graph', 'hybrid', 'hypercube_graph', 'icosahedral_graph', 'info', 'is_connected', 'is_directed', 'is_directed_acyclic_graph', 'is_isomorphic', 'is_kl_connected', 'is_string_like', 'is_strongly_connected', 'is_valid_degree_sequence', 'isomorph', 'isomorphvf2', 'iterable', 'kl_connected_subgraph', 'kosaraju_strongly_connected_components', 'krackhardt_kite_graph', 'ladder_graph', 'leda', 'li_smax_graph', 'lollipop_graph', 'make_clique_bipartite', 'make_max_clique_graph', 'make_small_graph', 'math', 'moebius_kantor_graph', 'neighbors', 'networkx', 'newman_betweenness_centrality', 'newman_watts_strogatz_graph', 'node_clique_number', 'node_connected_component', 'nodes', 'nodes_iter', 'null_graph', 'number_connected_components', 'number_of_cliques', 'number_of_edges', 'number_of_nodes', 'number_strongly_connected_components', 'nx_yaml', 'octahedral_graph', 'operators', 'pappus_graph', 'pareto_sequence', 'parse_graph6', 'parse_graphml', 'parse_leda', 'parse_sparse6', 'path', 'path_graph', 'periphery', 'petersen_graph', 'powerlaw_cluster_graph', 'powerlaw_sequence', 'predecessor', 'radius', 'random', 'random_lobster', 'random_powerlaw_tree', 'random_powerlaw_tree_sequence', 'random_regular_graph', 'random_shell_graph', 'read_adjlist', 'read_edgelist', 'read_gpickle', 'read_graph6', 'read_graph6_list', 'read_graphml', 'read_leda', 'read_multiline_adjlist', 'read_sparse6', 'read_sparse6_list', 'read_yaml', 'readwrite', 'relabel_nodes', 'release', 's_metric', 'search', 'sedgewick_maze_graph', 'shortest_path', 'shortest_path_length', 'single_source_dijkstra', 'single_source_dijkstra_path', 'single_source_dijkstra_path_length', 'single_source_shortest_path', 'single_source_shortest_path_length', 'sparsegraph6', 'star_graph', 'strongly_connected_component_subgraphs', 'strongly_connected_components', 'strongly_connected_components_recursive', 'subgraph', 'test', 'tests', 'tetrahedral_graph', 'to_dict_of_dicts', 'to_dict_of_lists', 'to_numpy_matrix', 'to_scipy_sparse_matrix', 'topological_sort', 'topological_sort_recursive', 'transitivity', 'triangles', 'trivial_graph', 'truncated_cube_graph', 'truncated_tetrahedron_graph', 'tutte_graph', 'uniform_sequence', 'union', 'utils', 'watts_strogatz_graph', 'wheel_graph', 'write_adjlist', 'write_edgelist', 'write_gpickle', 'write_multiline_adjlist', 'write_yaml', 'xdigraph', 'xgraph'] >>> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2008, 01:12 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
вряд ли boost::graph или явавские библы менее богаты (если не более), в этом смысле; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2008, 01:16 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
А вот как выглядит их реализация проверки на ацикличность: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2008, 01:50 |
|
||
|
Алгоритм определения циклических ссылок
|
|||
|---|---|---|---|
|
#18+
AlexsalogЯ вот что придумал: "алгоритм реки" - название придумал сам (речь идет об ориентированном графе) : все вершины располагаются в некой таблице по старшинству. то есть если стрелочка направлена из вершины А в вершину В, то А "старше" B. И в таблице "потока" они будут располагаться так: Код: plaintext 1. 2. 3. Пусть теперь, из B выходит две стрелочки - одна в вершину С, а другая ИЗ вершины D. Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. Как видим, если C станет "старше" D, то возникает цикл. Идуцируем обобщение (пытаемся): при вставке в указанную таблицу новой вершины , располагая её по правилу иерархии с "родительской" вершиной мы не должны обнаружить её же выше себя самой. И наоборот. Вообщем, вершина не должна быть в двух местах по иерархии. Я вообще-то пляшу от вставки нового ребра (неважно, появились ли после этой вставки новые вершины или нет), и в припадке ламеризьма накарябал код для интерактивного ввода ребер. Пусть и не эффективный (?). Все равно, я думаю, что даже это будет работать достаточно быстро (на своем файле я даже время не засекал -- ответ выдает мгновенно -- это же вам не питон). Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2008, 07:18 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=35318477&tid=1345282]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
82ms |
get tp. blocked users: |
2ms |
| others: | 238ms |
| total: | 421ms |

| 0 / 0 |
