Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   перебор массива с отступом (https://javascript.ru/forum/misc/59093-perebor-massiva-s-otstupom.html)

Brook 20.10.2016 10:53

laimas, хочу извиниться за прошлые коментарии, сейчас смотрю это было глупо с моей стороны. Спасибо за участие.

рони 20.10.2016 11:04

Brook,
на всякий случай
[JS run][/JS]

Brook 20.10.2016 14:30

рони,
спасибо - не знал

laimas 20.10.2016 19:56

Цитата:

Сообщение от Brook
aimas, хочу извиниться за прошлые коментарии, сейчас смотрю это было глупо с моей стороны.

Не за что, чтобы меня обидеть, это надо очень постараться. :)
А вот результат мне не нравится, много что-то. Сейчас немного некогда, чуть позже надо подумать. Я правильно понял, что размерность среза может быть произвольной, то есть в размерности например 6х6 можно взять 4х4 и плюс оставшиеся?

warren buffet 21.10.2016 05:49

Цитата:

Сообщение от laimas
чтобы меня обидеть, это надо очень постараться

LOL.

Brook 29.10.2016 15:28

Цитата:

Сообщение от laimas (Сообщение 432387)
6х6 можно взять 4х4 и плюс оставшиеся?

да но без остатка; тоесть он просто создаст 4х4 а края срежет
Изначально задумывал сделать нарезку массива (в моем случае режу поверхность в 2d на ячейки) на более мелкие, надо чтобы на срезах ячейки были сшиты:

Дан массив(порехность) 5х5, хочу нарезать ее с шагом 2, в результате получу 4 массива по 3х3 (индексация шагов с 0)

Массив:
Код:

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

Мне это было нужно для изменения плотности точек на поверхности.
Сейчас же пытаюсь написать триангуляция для иррегулярной сетки (сразу Делоне подходит), алгортим должен использовать набор из 4х правил по увеличению числа точек на поверхности.

laimas 29.10.2016 16:03

Цитата:

Сообщение от Brook
тоесть он просто создаст 4х4 а края срежет

Ну так это даже упрощает все, ок.

Brook 29.10.2016 17:25

да, но я не вижу никаких проблем и с остатком, просто если до края меньше шага меняем размер шага на расстояние до края в вашем примере 6х6, первый 4х4 после изменения 2х2, единственная трудность это высчитывать начала этого самого края ... но все равно не думаю что решение займет много времени)

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

laimas 29.10.2016 17:30

Цитата:

Сообщение от Brook
да, но я не вижу никаких проблем и с остатком

Если остаток не нужен, да еще и не запрашиваем непотребное, типа у размерности 6х6 запрашиваем 7х7, а если проверяем это, но всегда w = h, то это будет в любом случае меньше "телодвижений".

Brook 05.12.2016 20:13

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

Оригинальный массив ( 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

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

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

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


Часовой пояс GMT +3, время: 06:22.