|
|
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Субъективно. Много лишних непонятных действий. Что это? Почему 2? Что это за магическая константа? Код: java 1. 2. Далее. System.out флудит беспощадно и блокирует скорость вычислений. Даже с заглушкой в /dev/null все равно будет обеспечет терафлоп ненужной работы которую никто не смотрит. Вобщем вынести в slf4j или JUL с уровнем trace. Результат вычислений возвращается через строковую константу. Это странно. Так обычно не делают. Есть flow где имеет смысл добавить линию else чтобы отключить избыточные расчеты. Есть повторы вычисления одного выражения которые можно зарефакторить через introduce temp variable. Очень много замечаний к codeStyle. Классы с маленькой буквы а имена переменных с dash. Это ломает зрение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2016, 22:16 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
mayton, большое спасибо за критику и за то, что не поленились изучить мой код ) 1) 2 это потому, что одного коня мы ставим уже в конструкторе , его координата int i_start=1;int j_start=1;. поэтому в рекурсивную функцию уже подаём 2. 2) System.out я использовал чтобы видеть, что он делает. о протоколировании по средствам slf4j даже и не догадывался. изучу . спасибо 3) Конечно же Вы правы. исправлю на boolean 4) Где вы предлагаете добавить ? 5) Поясните какие , пожалуйста. 6) Конечно, учту ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2016, 22:42 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81mayton, большое спасибо за критику и за то, что не поленились изучить мой код ) 1) 2 это потому, что одного коня мы ставим уже в конструкторе , его координата int i_start=1;int j_start=1;. поэтому в рекурсивную функцию уже подаём 2. 2) System.out я использовал чтобы видеть, что он делает. о протоколировании по средствам slf4j даже и не догадывался. изучу . спасибо 3) Конечно же Вы правы. исправлю на boolean 4) Где вы предлагаете добавить ? 5) Поясните какие , пожалуйста. 6) Конечно, учту ! Ничего страшного, немного причесал код. Память расходует от 120 до 260 МБ хипа, вроде сбрасывает до 140 примерно, особо ждать времени не было когда закончится цикл или хип. 1. Поставьте хипа хотя бы 512МБ, дефолтные размер может переполниться. Пример с гигом: java -Xmx1024m 2. Настройте логгирование, полезная вещь, читать и скачивать jar для log4j фасада и реализации в вашем случае скорее всего logback standalone http://logback.qos.ch/ 3. Придерживайтесь рекомендуемого стиля Java кода: Sun (Oracle) http://www.oracle.com/technetwork/java/codeconvtoc-136057.html Google https://google.github.io/styleguide/javaguide.html Код после легкой рехтовки, возможно легкомысленно изменил перебор if/if/if на if else/if else/.. в паре мест, проверьте, это просто пример. В алгоритм не вникал. PS используйте переносы, разделяйте блоки кода, хотя на вкус и цвет товарищей нет... Код: java 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 00:40 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
uid unique, вот допустим, на 64 ходу найдено решение. Вопрос: выйдет ли код из цикла? Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 10:20 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Поскольку исходник живет своей жизнью то я буду комментировать последнюю версию независимо от автора. Я сделал еще один машинальный рефакторинг. 1) Магические константы типа размер доски = 8 я вынес в отдельную static final переменную. Это упрощает анализ кода и делает его более строгим. 2) StringBuilder можно инстанциировать заведомо известным размером. Это избавит нас от реаллокаций. 3) Была большая путаница в локальных переменных и переменных класса. Я заменил x,y на i,j и ушел this и загадочный ...x[x].... 4) Я использовал temp variable чтобы убрать повторные вычисления в блоках if. Вот что получилось. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 10:24 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Далее. Код: java 1. используя математику неравенств константы слева и справа от знака сравнения можно переносить в обе стороны и избавляться от ненужных калькуляций. Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 10:27 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
ivanrauid unique, вот допустим, на 64 ходу найдено решение. Вопрос: выйдет ли код из цикла? Код: java 1. я в курсе не завершится никогда . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 10:28 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
По поводу multidimensional arrays в Java. Код: java 1. есть основания говорить о том что они не очень эффективны. Правильнее сказать что их реализация для нашей задачи (шахматная доска) весьма избыточна. Нам хватит и обычного одномерного массива. Код: java 1. для доступа к элементу (i,j) мы должны использовать следующий getter Код: java 1. 2. 3. Сеттер кодится точно также. Почему i умножается на размер доски а не j - это вопрос договорённостей. Можно и наоборот. Это влияет на обход доски слева-направо-сверху-вниз или сверху-вниз ... и.т.д. Обычно на больших матрицах выбирают обход таким образом чтобы доступ к линейным участкам памяти не сильно "распылялся". Это тоже один из хинтов перформанса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 10:37 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Стоп я ошибся. Размер доски в квадрате от стороны. Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 10:38 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81ivanrauid unique, вот допустим, на 64 ходу найдено решение. Вопрос: выйдет ли код из цикла? Код: java 1. я в курсе не завершится никогда . Не так, он завершится при mc == 9. На самом деле, код вроде должен перебирать все решения, но вот с определением, что решение найдено - проблемы. Во-первых, tryHorse всегда возвращает false, почему бы не преобразовать этот метод в void и не убрать лишнюю переменную? Во-вторых, опять посмотрим на 64-й ход (horseIndex==64). При найденном решении мы заходим в if(), а там: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. это решение признано ошибочным Конечно, правильное решение было выведено строчкой раньше Код: java 1. , но как мы найдем его среди всего этого флуда (до первого решения может быть выведено на консоль хот миллион неправильных)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 11:22 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Если посмотреть на исходник глазами статического анализатора то можно видеть The Cyclomatic Complexity of this method "moveHorse" is 33 which is greater than 10 authorized. Complex code can perform poorly and will in any case be difficult to understand and therefore to maintain. Я не знаю откуда он взял 33. Возможно просуммировал все предикаты в if-else и посчитал их ветками логики. Но нам повезло что порядок проверки - декартовый и этот список условий более-менее ясен. А если их заменить на некие абстрактные f1(), f2() то тогда надо раскуривать сорс очень долго. Кстати есть мысль что стоит отмечать свободые позиции битовой маской. Кажется я так делал в своём С++ horse route. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 13:50 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
uid unique1. Поставьте хипа хотя бы 512МБ, дефолтные размер может переполниться. Пример с гигом: java -Xmx1024m 2. Настройте логгирование, полезная вещь, читать и скачивать jar для log4j фасада и реализации в вашем случае скорее всего logback standalone http://logback.qos.ch/ возможно надо выполнить пункт №1, но я не знаю как это сделать. сделал я только №2. у меня всё та же привычная ошибка : "io console updater java heap space" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 13:55 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonКстати есть мысль что стоит отмечать свободые позиции битовой маской. вы имеете ввиду что наш двухмерный массив должен быть boolean ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 13:59 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Я думаю о том как свести арифметические операции проверки координат к проверке масок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:10 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonЯ думаю о том как свести арифметические операции проверки координат к проверке масок. это, конечно , здорово но это уж совсем слишком вы заморочились с оптимизацией алгоритма. )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:16 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Совершенству нет предела. А учитывая бесконечные возможности параллелизма данной задачи (мы можем не шарить шахматную доску между процессами) то эта задача скейлируется достаточно выгодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:28 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonСовершенству нет предела. А учитывая бесконечные возможности параллелизма данной задачи (мы можем не шарить шахматную доску между процессами) то эта задача скейлируется достаточно выгодно. многопоточность тогда давайте прикрутим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:34 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81 учитывая бесконечные возможности параллелизма данной задачи вот странно если начальная точка 1:1, то решения находятся довольно быстро - меньше минуты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:38 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
Надо подумать как задачи раздать. Чтоб повторов не было. У вас уже есть мысли по этому вопросу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:39 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
maytonНадо подумать как задачи раздать. Чтоб повторов не было. У вас уже есть мысли по этому вопросу? да это я так про многопоточность. это очень серьёзный вопрос. боюсь , что мне не по зубам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:49 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
mayton, легче воспользоваться Правилом Варнсдорфа как тут советовали ранее: Правило формулируется очень просто: следующий ход коня нужно делать на клетку, откуда существует наименьшее количество возможных ходов. Если клеток с одинаковым количеством ходом несколько, то можно выбрать любую. На практике это реализуется, например, следующим образом. Перед каждым ходом коня вычисляется рейтинг ближайших доступных полей - полей, на которых конь еще не был, и на которые он может перейти за один ход. Рейтинг поля определяется числом ближайших доступных с него полей. Чем меньше рейтинг, тем он лучше. Потом делается ход на поле с наименьшим рейтингом (на любое из таковых, если их несколько), и так далее, пока есть куда ходить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:54 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81, и выход , завершение нужно при нахождении хотя бы одного решения прописать каким-то образом как верно подмечал ivanra ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 14:56 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
uid unique, еще неплохо было бы улучшить копипастный код метода moveHorse(). Например, итерацией по массиву Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 15:14 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
andron81mayton, легче воспользоваться Правилом Варнсдорфа как тут советовали ранее: Данное правило, насколько я понял меняет некоторые характеристики базового однопоточного алгоритма. Возможно улучшает o(n). Но к предлагаемому мной вопросу (параллельный запуск нескольких процессов и способ раздачи работ) Варнсдорф не имеет отношения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 15:27 |
|
||
|
рекурсивная функция делает переполнение кучи.
|
|||
|---|---|---|---|
|
#18+
ivanrauid unique, еще неплохо было бы улучшить копипастный код метода moveHorse(). Например, итерацией по массиву Код: java 1. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. так ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2016, 15:45 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39364998&tid=2123359]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
154ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
87ms |
get tp. blocked users: |
1ms |
| others: | 229ms |
| total: | 519ms |

| 0 / 0 |
