|
|
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#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. Но если N увеличить например в 100 раз, очевидно, что такое решение не будет подходящим. Как вы считаете, существует ли у этой задачи более быстрое решение ? Мне кажется что нет. Но я в этом не уверен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 08:40 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
Ну это же классическая Задача коммивояжёра ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 09:31 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
У тебя есть избыточность при вызове get_distance_between_Points(), т.к. считаешь каждый отрезок дважды. Т.е. проверяя точку А ты считаешь отрезок AB, проверяя точку B считаешь BA. Операция извлечения корня достаточно тяжелая, поэтому можно сначала посчитать все отрезки в массив, а при расчете просто брать из массива. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 09:33 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
Простите, вы совершенно точно уверенны что это классическая задача коммивояжёра ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 09:49 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
Дмитрий, согласен, спасибо :) Но это не решает основную проблему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 09:52 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryДмитрий, согласен, спасибо :) Но это не решает основную проблему А какая основная проблема? Ты спросил SashaMercuryКак вы считаете, существует ли у этой задачи более быстрое решение ? Я тебе его назвал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 09:59 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
Нет, алгоритм практически не изменился. Полный перебор ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 13:09 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryНет, алгоритм практически не изменился. Полный перебор От перебора ты не уйдешь. В худшем случае он будет полный. Максимум что можно оптимизировать - это вызывать get_distance_between_Points() один раз вместо двух. Эта функция у тебя достаточно тяжелая, поэтому будет выигрыш по времени. Сомневаешься - затести оба варианта на большом наборе точек. Сгенери точки генератором случайных чисел и засеки время (функция clock() текущее время в мс). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 13:23 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
Посмотрел как корень вычисляется, оказывается сопроцессором (думал функция из сишной библиотеки), значит не тяжелая это операция, накладные расходы на организацию массива могут и замедлить расчет. Тестить надо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 14:25 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
Это интересно. То есть всё-таки в худшем случае полный перебор ? Как это можно доказать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 14:41 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЭто интересно. То есть всё-таки в худшем случае полный перебор ? Как это можно доказать ? Ты же у нас математик, тебе и доказывать :) Не получив длины всех отрезков нельзя решить (в худшем случае), а чтобы их получить - перебор всех пар точек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 15:00 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
Я постараюсь узнать как это делается. Недавно в книжном магазине я читал Скиену, и встретил что-то про такие алгоритмы. Спасибо. Меня гонят, доброго времени суток ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 15:35 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
Хотел кстати недавно снова зайти почитать, а его уже купили ( полгода не покупали, а тут на тебе и купили ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 15:36 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Саша а ты пробовал менять long double на double? Бинарник меняется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 16:00 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
BarloneНу это же классическая Задача коммивояжёра Это не коммивояжер. У автора - кривенькая постановка которая к расчёту проектов прокладки интернета имеет весьма отдалённое отношение. Расстояние в километрах вообще редко определяло стоимость подключения. Гораздо важнее - технология. Количество свободных портов, нагрузка и количество hops, лаги и прочее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 16:35 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
Dima TПосмотрел как корень вычисляется, оказывается сопроцессором (думал функция из сишной библиотеки), значит не тяжелая это операция, накладные расходы на организацию массива могут и замедлить расчет. Тестить надо :) Он вычисляется средствами библиотеки. Будет ли она использовать FPU или нет - отдельный вопрос. И я заметил что ценность FPU-вычислений заметно ослаблена в пользу новых наборов команд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 16:38 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
Затестил массив, добавил кэш длин отрезков в код SashaMercury, в дебаге чуть медленнее, в релизе вдвое медленнее Исходник Код: sql 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. Все-таки быстрее считать корни чем кэшировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 18:45 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
Немного странная задача. На первый взгляд можно свести к задаче нахождения минимального остовного дерева в неорграфе. Но! С учётом ограничения авторДля того чтобы подключиться к сети всем N поросятам необходимо: 1. провести провод от точки подключения до домика одного из поросят; 2. от подключенного поросенка провести провода ко всем остальным. алгоритм Прима или крускала придётся модифицировать, чтобы не рассматривал "лишние" рёбра ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2014, 22:45 |
|
||
|
Вопрос о существовании более быстрого алгоритма.
|
|||
|---|---|---|---|
|
#18+
Примы и остовые деревья тут ни при чем. И это далеко не комивояжер. Да и вообще решения основанные на графовых алгоритмах вряд ли помогут (колличество ребер в графе в данном случае O(n^2), так как это полный граф). Скорее всего это задача на модификацию поиска геометрической медианы. Вики: http://en.wikipedia.org/wiki/Geometric_median Конечно же в евклидовой метрике и в данном случае в 2D. В данной задаче мы ищем медиану среди уже данных точек. И у нас есть еще "особенная точка" Я не лез в подробности, можно провести пару тестов, но думаю в итоге все приведет к некоторой оптиальной области точек которые проверяються руками. На практике же я бы решал эту задачу методом "имитации отжига" http://en.wikipedia.org/wiki/Simulated_annealing . Он само собой являеться недетерминированным алгоритмом, но чаще всего получает AC на подобных задач. Как альтернатива, могу еще порекомендовать A* или генетические алгоритмы, на практике генетика будет хуже отжига, чисто мое опытное мнение. Вообще задача (общая) намного проще решаеться для манхеттенской метрики, ну и как "не самое очевидное следствие" для суммы квадратов расстояний, подробности можно найти вот тут: http://stackoverflow.com/questions/12934213/how-to-find-out-geometric-median . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2014, 05:56 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38753716&tid=1341221]: |
0ms |
get settings: |
8ms |
get forum list: |
24ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
159ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
77ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 515ms |

| 0 / 0 |
