|
|
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
softwarermini.weblabсуществует ли более эффективное решение, чем O(n^3) ? Не стоит путать O(n) и O(n^3) Виноват, сам затупил и неправильно понял изначальный пост. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2017, 19:07 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
Dima T, как сказал ермак, порядок чисел в последовательностях должен быть сохранен, т.е. если дано число 968, то последовательность из 3х чисел только одна - 968; далее последовательности из 2х чисел: (96, 98, 68) ну и т.д. (порядок важен!) мой пример сделан по условиям, действующим на HR (я бьюсь над задачей уже 2 дня, так что мне можно доверять) бруты на питоне можно посмотреть здесь (для тестов) Код: python 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2017, 19:48 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
mini.weblabкак сказал ермак, порядок чисел в последовательностях должен быть сохранен, т.е. если дано число 968, то последовательность из 3х чисел только одна - 968; далее последовательности из 2х чисел: (96, 98, 68) ну и т.д. (порядок важен!) И где это в условиях указано? УсловияGiven an n-digit positive integer, count and print the number of subsequences formed by concatenating the given number's digits that are divisible by 8. As the result can be large, print the result modulo 10^9 + 7 Ограничение: 1 <= n <= 2*10^5 Если эти условия неполные, то зачем вообще надо было сюда их писать? Не понимаю. Я уже написал что перебор за 3 месяца справится. С остальным сами с ермаком разбирайтесь. Для ускорения курите комбинаторику. Удачи. У меня свои головоломки есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2017, 20:01 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
Dima T, ну скажем так, я привела условие задачи, для того, чтобы объяснить, что на самом деле я решаю другую задачу, и что ответ на свой основной вопрос я получила кроме того, я думаю, что смогу улучшиться, применив то, что ты написал здесь 20103342 т.е не генерировать все тройки, а работать только с теми к-рые делятся на 8 в общем спасибо =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2017, 20:21 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
удалось улучшится, но все равно, тест O(n) падает... задача: пусть имеется число num, состоящее из чисел n. (пример: n=4, num=9680) требуется подсчитать все комбинации дающие 0 в остатке при делении на 8. пример: пусть число num = 9680 нам нужно получить все последовательности дающие остаток 0 при делении на 8 1) Все возможные последовательности [9, 6, 8, 0, 96, 98, 90, 68, 60, 80, 968, 960, 980, 680, 9680] 2) Последовательности, удовлетворящие условию задачи [8, 0, 96, 80, 968, 960, 680, 9680] 3) Ответ: 8 решение: будем рассматривать взносы следующих элементов последовательности: 1) числа 0 и 8: вес 1 2) пары, делящиеся на 8: вес 1 3) тройки, делящиеся на 8: вес 2^idx, idx - позиция первого элемента тройки в последовательности (пример. числовая последовательность: 9680; тройка: 680; вес тройки 680: 2^1) Python code: Код: python 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. пояснение по четным-нечетным парам: Код: python 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 01:17 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
mini.weblab, если правильно понял, перебор сочетаний с доп. условием делимости полученного числа; и то, и другое реализуется элементарно. Единственное тонкое место - условие делимости должно относиться не в целом к числу, а должно быть расписано для каждого знакоместа, чтобы его можно было использовать на этапе выбора очередного сочетания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 13:22 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Или еще проще, в цикле от 0 до 124 (по возможным значениям 3х последних цифр) подсчитать количество сочетаний с произвольными начальными цифрами (умножить на 2^K) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 13:28 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovAleksandr Sharahov, Или еще проще, в цикле от 0 до 124 (по возможным значениям 3х последних цифр) подсчитать количество сочетаний с произвольными начальными цифрами (умножить на 2^K)я так и сделала, но возникли проблемы с технической реализацией (код работает не так быстро, как нужно) из решения mini.weblab3) тройки, делящиеся на 8: вес 2^idx, idx - позиция первого элемента тройки в последовательности (пример. числовая последовательность: 9680; тройка: 680; вес тройки 680: 2^1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 13:57 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
другими словами, на данном этапе получен код решения сложности O(n^2), а нужен код решения сложность O(n) Aleksandr Sharahovв цикле от 0 до 124 (по возможным значениям 3х последних цифр) подсчитать количество сочетаний с произвольными начальными цифрами (умножить на 2^K) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2017, 21:42 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
mini.weblabдругими словами, на данном этапе получен код решения сложности O(n^2), а нужен код решения сложность O(n) Aleksandr Sharahovв цикле от 0 до 124 (по возможным значениям 3х последних цифр) подсчитать количество сочетаний с произвольными начальными цифрами (умножить на 2^K) Идем справа налево. В процессе работы ведем списки (таблицы) единиц, двоек и троек. Очередная цифра либо меняет списки (не более 125 раз), либо не создает ничего нового в этих списках (все остальные разы). Для каждой цифры наращиваем счетчик на (2^k mod x) по mod x. O(N). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2017, 10:16 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, если у вас будет время, опишите пожалуйста, реализацию вашего алгоритма на примере. (подойдет так же псевдокод или код, на любом языке программирования) спасибо заранее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2017, 15:22 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
mini.weblab, Все проще, но 2 прохода. Первый справа налево. Задача - определить начала всех 125 уникальных троек с делимостью на 8, а также наличие двоек и единиц. Например, в строке 9680 тройки 968 и 960 начинаются в первой позиции, тройка 680 - во второй, имеются 2 двойки (96, 80) и 2 единицы (8, 0). Очевидно, вклад двоек и единиц в общую сумму просто равен их общему количеству (4). Сортируем позиции начала троек по возрастанию (сами тройки нам уже не важны): 1,1,2. Второй проход слева направо. Считаем количество подпоследовательностей, включая пустую, до начала каждой тройки и складываем. У нас имеется 1 пустая подпоследовательность до позиции 1, она же - еще раз до позиции 1, и две подпоследовательности (пустая и 9) до позиции 2. Итого +4 к общей сумме. Как считать количество подпоследовательностей (включая пустую) - известно (разумеется, надо адаптировать): Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2017, 21:53 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
Небольшое пояснение. Может показаться, что учтя только вклад только одного (последнего) вхождения каждой из 125 троек в качестве 125 слагаемых, мы что-то забыли и надо было как-то учесть предыдущие вхождения каждой тройки. Это не так. Требование неповторяемости подпоследовательностей сильно упрощает нашу задачу. В самом деле, рассмотрим произвольную подпоследовательность xyz504, которую сформировало первое слева вхождение тройки 504. Последнее слева (или первое справа, как у нас) вхождение тройки 504 также может сформировать подпоследовательность xyz504, xyz лежит левее. Получается, что мы автоматически учли и ее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 10:05 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, спасибо Александр. у меня основная проблема с учетом всех двоек(троек) в последовательности, именно эта часть и отнимает O(n^2) времени. (тройки в результате сводятся к двойкам) дальше, когда информация (двойка, позиция) собрана, подсчитать комбинации несложно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 14:05 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
mini.weblab, там нигде нет O(N^2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 14:08 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, у вас, может быть и нет, а у меня-то есть :) в общем, я еще до конца не разобралась, сегодня вечером попробую еще раз ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 14:39 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
mini.weblab, особо не отлаживал, но для 9680 результат верный [delphi] function CountSeq8(const s: string): integer; const Prim = 1000 * 1000 * 1000 + 7; var Found1, Refresh2, Refresh3: array[0..9] of boolean; Found2: array[0..99] of boolean; Found3: array[0..999] of integer; MinPos3, Sum: array[0..9] of integer; i, j, k, m, Count, Old: integer; begin; //Шаг1 - просмотр справа налево, подсчет единиц, двоек, определение начал троек. for i:=0 to 9 do begin; Found1[i]:=false; Refresh2[i]:=false; Refresh3[i]:=false; MinPos3[i]:=MaxInt; end; for i:=0 to 99 do Found2[i]:=false; for i:=0 to 999 do Found3[i]:=MaxInt; for i:=Length(s) downto 1 do begin; j:=Ord(s[i])-Ord('0'); if Refresh3[j] then begin; Refresh3[j]:=false; m:=j*100; k:=m+96-(j and 1)*4; repeat; if (Found3[k]=MaxInt) and Found2[k-m] then begin; Found3[k]:=i; MinPos3[j]:=i; end; k:=k-8; until k<m; end; if Refresh2[j] then begin; Refresh2[j]:=false; m:=j*10; for k:=0 to 9 do if Found1[k] then Found2[m+k]:=true; end; if not Found1[j] then begin; Found1[j]:=true; for k:=0 to 9 do begin; Refresh2[k]:=true; Refresh3[k]:=true; end; end; end; Result:=0; for i:=0 to 9 do if (i and 7=0) and Found1[i] then inc(Result); for i:=0 to 99 do if (i and 7=0) and Found2[i] then inc(Result); //Шаг2 - просмотр слева направо, суммирование количества подпоследовательностей с концами на тройках. Count:=1; for i:=0 to 9 do Sum[i]:=0; for i:=1 to Length(s) do begin; j:=Ord(s[i])-Ord('0'); if i=MinPos3[j] then begin; MinPos3[j]:=MaxInt; m:=j*100; k:=m+96-(j and 1)*4; repeat; if Found3[k]=i then begin; Found3[k]:=MaxInt; Result:=Result+Count; if Result>=Prim then Result:=Result-Prim; end else if MinPos3[j]>Found3[k] then MinPos3[j]:=Found3[k]; k:=k-8; until k<m; end; Old:=Sum[j]; Sum[j]:=Count; Count:=Count+Count-Old; if Count>=Prim then Count:=Count-Prim; end; end; [/delphi] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 16:13 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, улетело форматирование ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 16:14 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 20:13 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
Исправлена неточность с рефрешем поиска троек, немного ускорено (хотя там еще есть где ускорить). Кроме 9680 правильно обрабатывает CountSeq8('968046122') = 12 (0 8 64 80 96 912 904 984 680 960 968 9680) Код: pascal 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 23:22 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
В предыдущей версии есть неточность. Иногда может быть получен отрицательный результат из-за того что при суммировании-вычитании по модулю учтено переполнение только в положительную сторону. Правильный код должен быть таким: Код: pascal 1. 2. 3. Здесь ускоренная примерно в 2 с лишним раза версия, почти нечитаемая. Интенсивно используется работа с битами. Нервным и беременным лучше не смотреть. Код: pascal 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 16:50 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, у вас точно решить и не получится, потому что вы не знаете всех условий :) точное условие и тесты здесь (в том числе и на производительность здесь) https://www.hackerrank.com/contests/w28/challenges/lucky-number-eight/copy-from/1300178868 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 21:44 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
и еще, по-моему, в задаче можно обойтись двойками + использовать четность-нечетность первых цифр (пробую реализовать) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 21:52 |
|
||
|
все комбинации из 3-х элементов: алгоритм поиска
|
|||
|---|---|---|---|
|
#18+
mini.weblabAleksandr Sharahov, у вас точно решить и не получится, потому что вы не знаете всех условий :) точное условие и тесты здесь (в том числе и на производительность здесь) https://www.hackerrank.com/contests/w28/challenges/lucky-number-eight/copy-from/1300178868 Tо, что привел и есть точное решение ) И производительность, думаю неплохая: - 1.3ms на случайных последовательностях максимальной длины. А рангами не заморачиваюсь ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2017, 22:01 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39386486&tid=1340510]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
200ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 501ms |

| 0 / 0 |
