У меня есть проект, в котором я читаю массив с 1 или более измерениями, и для этого проекта мне нужно иметь возможность быстро определять соседей данного элемента. Я не знаю размерности заранее, и я также не знаю заранее величины измерений. Какой была бы лучшая структура данных С++ для хранения этих данных? Коллега рекомендовал вектор векторов векторов . . ., но это кажется невероятно громоздким.
Структура данных С++ для поиска соседних значений в многомерном массиве
comment
Что вы имеете в виду под соседями?
- person Rafi Kamal   schedule 27.09.2013
comment
Если бы было одно измерение: Индекс x имеет соседей x-1 и x+1 ;;; Два измерения: индекс (x, y) имеет соседей (x-1, y), (x + 1, y), (x, y-1), (x, y + 1) и т. д.
- person Ingulit   schedule 27.09.2013
comment
И каков ваш вклад в вашу программу? Я предполагаю размерность массива и элементы массива? (например, 2*3 и 1, 2, 3, 4, 5, 6)?
- person Rafi Kamal   schedule 27.09.2013
comment
Да, за исключением того, что данные не находятся в массиве C++; он находится в проприетарном классе-оболочке, из которого я должен извлечь данные.
- person Ingulit   schedule 27.09.2013
comment
Вам нужны только ортогональные соседи? (т. е. во 2-м случае их максимум 4) Или вам нужна полная окрестность, где во 2-м случае у вас будет до 8 соседей?
- person twalberg   schedule 27.09.2013
Ответы (2)
Если вы знаете адрес какого элемента, для которого вам нужны соседи, не могли бы вы просто выполнить арифметику указателя, чтобы узнать соседей. Например, если p — это расположение элемента, то p— это левый сосед, а p++ — правый сосед.
person
aligardezi
schedule
27.09.2013
Я понимаю, о чем вы говорите, но мне нужно выяснить, в чем хранить данные в первую очередь, чтобы что-то подобное было возможно.
- person Ingulit; 27.09.2013
Я только что понял, что забыл кое-что упомянуть, поэтому я скопирую то, что прокомментировал выше: данные не в массиве C++; он находится в проприетарном классе-оболочке, из которого я должен извлечь данные.
- person Ingulit; 27.09.2013
поэтому я думаю, что вопрос, который нужно задать, заключается в том, какую информацию вам нужно сохранить из класса Wrapper, прежде чем вы сможете принять решение о структуре.
- person aligardezi; 27.09.2013
потому что, если вам нужно найти что-то на основе ключа, карта подойдет вам лучше.
- person aligardezi; 27.09.2013
Думайте о своем многомерном массиве как об одномерном массиве. Пусть размерность массива d1 * d2 * ....* dn
Затем выделите память для массива 1D, скажем, A
размером d1 * d2 * ....* dn
. Например,
int *A = new int[d1 * d2 * ....* dn];
Если вам нужно хранить данные в [i1][i2]...[in]
-м индексе, то сохраните в следующем индексе:
A[i1 * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + in]
Соседними элементами будут:
A[(i1 + 1) * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + in]
A[(i1 - 1) * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + in]
A[i1 * (d2*d3*d4.. *dn) + (i2 + 1) * (d3*d4*....dn) + ..... + in]
A[i1 * (d2*d3*d4.. *dn) + (i2 - 1) * (d3*d4*....dn) + ..... + in]
.............................
A[i1 * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + (in + 1)]
A[i1 * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + (in - 1)]
person
Rafi Kamal
schedule
27.09.2013