В вычислительном отношении эффективные трехмерные массивы в C

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

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

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

7
задан Coffee on Mars 16 September 2008 в 19:36
поделиться

3 ответа

Octtrees являются способом пойти. Вы подразделяете массив на 8 октантов:

1 2
3 4

---

5 6
7 8

И затем разметьте их в памяти в порядке 1, 2, 3, 4, 5, 6, 7, 8 как выше. Вы повторяете это рекурсивно в каждом октанте, пока Вы не переходите к некоторому основному размеру, вероятно, приблизительно приблизительно 128 байтов (это - просто предположение - удостоверяются, что представили для определения оптимального предела). Это имеет много, намного лучшую когерентность кэш-памяти и местность ссылки, чем наивное расположение.

5
ответ дан 6 December 2019 в 19:44
поделиться

Одна альтернатива древовидному методу: Используйте Morton-порядок закодировать Ваши данные.

В трех измерениях это идет как это: Возьмите координатные компоненты и чередуйте каждый бит два нулевых бита. Здесь показанный в двоичном файле: 11111b становится 1001001001b

C-функция, чтобы сделать это похоже на это (показанный для ясности и только для 11 битов):

int morton3 (int a)
{
  int result = 0;
  int i;
  for (i=0; i<11; i++)
  {
     // check if the i'th bit is set.
     int bit = a&(1<<i);
     if (bit)
     {
       // if so set the 3*i'th bit in the result:
       result |= 1<<(i*3);
     }
  }
  return result;
}

Можно использовать эту функцию для объединения положений как это:

index = morton3 (position.x) + 
        morton3 (position.y)*2 +
        morton3 (position.z)*4;

Это превращает Ваш трехмерный индекс в одномерный. Большая часть его: Значения, которые близки в 3D пространстве, приближаются 1D пространство также. При доступе к значениям друг близко к другу часто, Вы также получите очень хорошее ускорение, потому что кодирование morton-порядка оптимально с точки зрения местности кэша.

Для morton3 Вы лучше не используете код выше. Используйте маленькую таблицу, чтобы искать 4 или 8 битов за один раз и объединить их вместе.

Надежда это помогает, Nils

5
ответ дан 6 December 2019 в 19:44
поделиться

Книга Основы Многомерных и Метрических Структур данных может помочь Вам решить, какая структура данных является самой быстрой для запросов диапазона: деревья октантов, kd-деревья, R-деревья... Это также описывает форматы данных для того, чтобы держать точки вместе в памяти.

3
ответ дан 6 December 2019 в 19:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: