Эффективно лечить OOB, 2d доступ к массиву - PullRequest
1 голос
/ 16 марта 2012

Скажем, вы пытаетесь посетить массив в шахматном порядке:

  0 1 2 3 4 5 6 7
0 o • o • o • o •
1 • o • o • o • o
2 o • o • o • o •
3 • o • o • o • o
4 o • o • o • o •
5 • o • o • o • o
6 o • o • o • o •
7 • o • o • o • o

Итак, предположим, что вы посещаете черные элементы здесь и добавляете всех 4 белых соседей.

Вы не можете сделать это по краям или углам, потому что там только 3 и 2 белых соседа соответственно.Таким образом, вы должны добавить все 3 белых по краям и 0 для доступа за пределы.

Неэффективный способ сделать это - сделать что-то вроде

at each element
    if element to the right is not out of bounds ...

Но я не хочу делать такие проверки.

Итак, я сделал разрезание цикла на полоски, так что:

at each element ON LEFT EDGE
    add 3 elements i know are in bounds (right, up, down)

Затем специальный случай дляочень углы

at top left corner..
    add 2 elements i know are in bounds (right, down)

Так что это закончилось очень длинным кодом кода, который работает, но не имеет проверки ограничений.Я ищу способ сократить длину блока кода и сделать его более понятным.

Какие-нибудь хитрости?

1 Ответ

2 голосов
/ 17 марта 2012

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

    0 1 2 3 4 5 6 7
  x x x x x x x x x x
0 x o • o • o • o • x
1 x • o • o • o • o x
2 x o • o • o • o • x
3 x • o • o • o • o x
4 x o • o • o • o • x
5 x • o • o • o • o x
6 x o • o • o • o • x
7 x • o • o • o • o x
  x x x x x x x x x x

Фактическая «толщина» границы, очевидно, зависит от того, как далеко вы смотрите на каждый элемент (ваше окно / ширина / высота ядра).В случае просмотра прямого соседа нужна только граница размера 1.

Да, это означает, что вы будете иметь дело с увеличенным объемом данных.Но преимущество заключается в том, что, хотя вам придется позаботиться о адресации, больше нет никаких специальных проверок, необходимых для угловых / граничных случаев.

...