|
|
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Когда-то на форум.сорцы.ру их мембер albom с блеском решил эту таску. -------- http://forum.sources.ru/index.php?showtopic=250789 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2016, 23:27 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
SiemarglВсе гораздо хуже. Я пока сходил за пивом, изобрел решение без биткарт, без массивов и вообще без сложностей. Все= в 2с не укладывается этот шарп ( В результатах лучшее время 0,284 сек на С++. Получается C# тормознее в 7+ раз? Не верю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 08:00 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
С окнами из биткарт дошел до 10 теста. Time limit exceeded В чистом виде биткарта не поможет, нужна еще какая-то оптимизация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 08:22 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima TSiemarglВсе гораздо хуже. Я пока сходил за пивом, изобрел решение без биткарт, без массивов и вообще без сложностей. Все= в 2с не укладывается этот шарп ( В результатах лучшее время 0,284 сек на С++. Получается C# тормознее в 7+ раз? Не верю. Потому что у меня все же перебор, а оптимальное решение - вычислительное - просто сложить пару десятков чисел, как Кнокс на форуме откопал. Но так неинтересно. Алгоритм получился простым, может и перепишу потом на С ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 11:52 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Ссылку пока не смотрел, хочу сам голову поломать. ИМХУ условия поставлены так что перебором нерешаемо. Хоть на асме пиши. Этот пример 18813721 имеет ответ ~500 млн., требует полного перебора до лярда, т.е. даже при самом оптимальном алгоритме перебора (попадание только на нужные) чтобы уложиться в 2 сек. на проце в 3 ГГц надо на проверку тратить не более 6 тактов процессора, что очень мало. Самый быстрый способ: заполнить биткарту и то дольше 2 сек будет. Даже без ограничения по памяти. Надо изобретать какую-то алгоритмическую хитрость. Знать бы хоть в какую сторону ее искать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 12:59 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima TСсылку пока не смотрел, хочу сам голову поломать. ИМХУ условия поставлены так что перебором нерешаемо. Хоть на асме пиши. Этот пример 18813721 имеет ответ ~500 млн., требует полного перебора до лярда, т.е. даже при самом оптимальном алгоритме перебора (попадание только на нужные) чтобы уложиться в 2 сек. на проце в 3 ГГц надо на проверку тратить не более 6 тактов процессора, что очень мало. Самый быстрый способ: заполнить биткарту и то дольше 2 сек будет. Даже без ограничения по памяти. Надо изобретать какую-то алгоритмическую хитрость. Знать бы хоть в какую сторону ее искать. давно бы уже код показал ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 14:48 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovдавно бы уже код показал ) Стыдно показывать, накидал по-быстрому, сейчас причешу вариант с биткартой окнами (он самый быстрый) и выложу. Может кому пригодится для проверки или как заготовка. У тебя нет мыслей по оптимизации без перебора? ИМХУ в эту сторону надо копать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 15:42 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, мысли есть, конечно, но они очевидные все. Вдруг ты забыл что-нибудь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 16: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. Забывать тут нечего, примитивный перебор - самый быстрый из всех переборов. Из оптимизации только контроль задвоений счетчиков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 16:42 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima TИз оптимизации только контроль задвоений счетчиков.Можно еще взаимные делители контролировать. Например, если есть P 1 =2 и P 2 =4, то они при объединении дают ту же 4, но со сдвигом на 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 17:07 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, единственное, что увидел: при подсчете результата развернуть цикл в 4 раза, и тогда можно будет обнулять по 32 бита за раз. Но это копейки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 17:26 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
miksoftDima TИз оптимизации только контроль задвоений счетчиков.Можно еще взаимные делители контролировать. Например, если есть P 1 =2 и P 2 =4, то они при объединении дают ту же 4, но со сдвигом на 2. Тоже думал, но это только если P 2 / P 1 = 2, счетчики step * P 1 и step * P 2 сводятся к счетчику P 1 + step * P 2 Если P 2 / P 1 = 3 уже так не сделать. Т.е. идеале убираем до половины счетчиков. Хотя может и взлетит. Самый жестокий тест у меня cчитается 3 сек Код: sql 1. 2. Только четные - 1,6 сек Код: sql 1. 2. На грани фола, не факт что там такой же быстрый проц. Попробую затестить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 17:39 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Добавил склеивание двухкратных. Не помогло. Time limit exceeded У меня время самого жесткого теста 1,4 сек. Жалко что у них не i7 Исходник Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 17:53 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Можно еще запараллелить, но как-то не спортивно это, и не факт что там ядер больше одного :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 18:01 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Тут надо формулу изобретать. Все что смог изобрести: если НОД(а, b) = 1, то на интервале N результат будет N/a + N/b - N/(2 * a * b) С тремя уже непонятно, НОД(а, b) > 1 тоже непонятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 18:15 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, а что не хочешь сделать подсчет (чтение окна) и обнуление двордами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 18:21 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Есть еще мысль: можно ксорить биткарты. Например есть счетчики (a,b,c,d,e,f) повторяемость (a,b,c) K 1 , (d,e,f) K 2 , делаем две биткарты БК 1 и БК 2 дальше проход по ним подсчет бит в XOR(БК 1 [i % K 1 ], БК 2 [i % K 2 ]) можно третью и т.д. добавить, но тут главное чтобы все K i были выравняны, т.е. кратны 8. В этом засада. Еще проблема из-за ограничения памяти, т.е. разбить счетчики на группы так чтобы сумма(K i ) была меньше 16 Мб ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 18:33 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovDima T, а что не хочешь сделать подсчет (чтение окна) и обнуление двордами? Сделал еще быстрее Код: plaintext 1. 2. 3. 4. 5. у меня c 1,4 ускорилось до 1,24 сек., но там все-равно не пролез по времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 18:40 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, да не быстрее это ) читай двойное слово, потом для каждого прочитанного байта сумма, потом пишешь 0 двойным словом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 18:52 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovDima T, да не быстрее это ) читай двойное слово, потом для каждого прочитанного байта сумма, потом пишешь 0 двойным словом. Написал так Код: plaintext 1. 2. 3. 4. стало 1.6 сек. Предлагай свой вариант. имху быстее memset() вряд ли получится, это функция для обнуления блока памяти и ее реализация в компиляторе отточена до идеала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 19:51 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, читай сразу двойное слово одним чтением, выделяй из него байты, сдвигами и эндами, с каждым из них уже лезь в таблицу. Так по идее быстрее - на три чтения меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 19:56 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Написал так Код: plaintext 1. 2. 3. 4. 5. 6. 7. стало 1,23, т.е. на 0,01 сек быстрее. Некуда в эту сторону двигаться. Разве что оба цикла пытаться на асме переписать, и то не факт что быстрее станет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:04 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, а почему бы все таки, наконец, не сделать так, как я написал ) Так будет и быстрый подсчет, и обнуление ЗАДАРОМ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:08 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovDima T, читай сразу двойное слово одним чтением, выделяй из него байты, сдвигами и эндами, с каждым из них уже лезь в таблицу. Так по идее быстрее - на три чтения меньше. Ступил. Чуть быстрее. 1.15 сек стало. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Но тест не проходит по времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:10 |
|
||
|
Тяпничные лампочки
|
|||
|---|---|---|---|
|
#18+
Dima T, еще быстрее Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2016, 20:14 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39170752&tid=1340780]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
163ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 481ms |

| 0 / 0 |
