Показать сообщение отдельно
  #50 (permalink)  
Старый 05.12.2016, 20:13
Профессор
Отправить личное сообщение для Brook Посмотреть профиль Найти все сообщения от Brook
 
Регистрация: 13.04.2012
Сообщений: 210

И снова поднимаю эту тему.
Однако в этот раз задача состоит в том чтобы преобразовывать одномерный массив в "сектора" с использованием лишь одного цинкла (и никакой рекурсии так это тоже будет считься как дополнительный цикл ).

Оригинальный массив ( 1D !!! ):
00 | 01 |  02 |  03 |  04 |  05 |  06 |  07 |  08 |  09 |  10 |  11 |  12 |  13 |  14 | 15 |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  24


Теперь визуально предсталю как 2D что бы было проще вам понять, а мне объяснять:
Код:
00 | 01 | 02 | 03 | 04
------------------------
05 | 06 | 07 | 08 | 09
------------------------
10 | 11 | 12 | 13 | 14
------------------------
15 | 16 | 17 | 18 | 19
------------------------
20 | 21 | 22 | 23 | 24
Места пересечений между массивами после нарезки, однако на одномерном массиве все в разы сложнее :
Код:
00 | 01 | 02 | 03 | 04
------------------------
05 | 06 | 07 | 08 | 09
------------------------
10 | 11 | 12 | 13 | 14
------------------------
15 | 16 | 17 | 18 | 19
------------------------
20 | 21 | 22 | 23 | 24
Результат:
М1:
Код:
00 | 01 | 02
-------------
05 | 06 | 07
-------------
10 | 11 | 12
М2:
Код:
02 | 03 | 04
-------------
07 | 08 | 09
-------------
12 | 13 | 14
М3:
Код:
10 | 11 | 12
-------------
15 | 16 | 17
-------------
20 | 21 | 22
М4:
Код:
12 | 13 | 14
-------------
17 | 18 | 19
-------------
22 | 23 | 24
В данном примере размер одномерного массива 25, но я его буду обозначать как 5( это граница среза ), опять же что бы было проще объяснть.
Выходные массивы также представлены как двумерные, однако по сущности являются одномерными!

Однако, как уже писал выше, в этот раз есть 'условие' для последующего решения - использовать всего один цикл. Так же прошу не использать slice(), splice() и т.п.

Вот способ которым пытаюсь это сделать я:

Как было сказано ранее граница среза ракна 5, тоесть каждый пятый элемент указывающий на "окончание" одной сроки и начала другой
Код:
00 | 01 |  02 |  03 |  04 |  05 |  06 |  07 |  08 |  09 |  10 |  11 |  12 |  13 |  14 | 15 |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  24
Далее полученные части надо разбить для двое по три:
Код:
[ 00 | 01 |  02 ], [ 02 |  03 | 04 ]
Как видно из примера тут присутствует повторяющийся елемент!! Так же предполагается что мы уже знаем конечное колличество массивов и они уже подготовлены, например var result_arrs = [ [M1], [M2], [M3], [M4] ]. ( тут М* используется просто для указания места вывода результатов работы алгоритма, сами массивы являются пустыми)

Приблизительно вот так должжен быть нарезан весь массив, повторюсь это одномерныймассив, и выходные массивы также имеют только один разряд (одномерны)!

Здесь предсавлен пример конечного результата, прошлого решения:
http://jsbin.com/qimaliy/edit?js,console

З.Ы. чуть позже выложу результ своих попыток, я забыл их сохранить так что сейчас занимаюсь их востановлением .
З.З.Ы. причина по которой снова поднял тему - скорость работы алгоритма - в конце буду все тетстировать на массиве размером от 4 000 000 )), на данный момент предыдущий алгоритм установил планку в 2сек. так что этот должен быть как мимнимум в 2-е быстрее ( <= ~1sec. )

Надеюсь на Вашу помощь, и надесь Вам будет также интресно это решать как и мне ))

Заранее спасибо

Последний раз редактировалось Brook, 05.12.2016 в 20:53.
Ответить с цитированием