Когда использовать многомерные массивы

2

В С# концепция многомерных матриц довольно крутая. Но я не понимаю, когда их использовать. Как и в каких типах приложений эта концепция используется.

Теги:

7 ответов

8
Лучший ответ

Не звучать банально, но вы используете многомерные массивы, когда у вас многомерные данные.

Матрицы - общий пример, но это может быть так же легко, как игровая доска (например, Шахматы), или как модель данных для N-мерного лабиринта или таллинга или что-то действительно.

5

Одним из распространенных применений является матрица.

2

В качестве бокового пункта вы можете использовать многомерные массивы (int [,]) или зубчатые массивы (int [] []). Первый может быть инициализирован за один шаг, но требует большего непрерывного блока памяти и медленнее для доступа, в то время как последний более удобен для памяти, так как суб-массивы могут быть распределены по адресному пространству, каждая подматрица может быть другая длина, и все одномерные массивы (SZarrays) имеют специальную оптимизацию в CLR. Однако вам необходимо инициализировать каждый размер отдельно с помощью зубчатых массивов:

int[][] jagged = new int[5][];
for (int i=0; i<jagged.Length; i++)
{
    jagged[i] = new int[10];    // length can be different for each sub-array, if needed
}

многомерные массивы инициализируются сразу

int[,] mArray = new int[5,10];
  • 0
    Я понятия не имел, что у C # были "многомерные массивы". Полезно знать, даже если у меня никогда не было повода использовать их. Спасибо за рыбу. Кит.
  • 0
    Вы ошиблись одним пунктом. Доступ к многомерным массивам быстрее , потому что зубчатые массивы требуют двойной проверки косвенности и нулевых проверок в дополнение к проверкам границ.
1

Представьте, что вы хотите запрограммировать игру в шахматы. Как вы представляете плату с одномерным массивом?

  • 0
    Обычно в шахматах доска программирования не представлена в массиве 8X8. его крайне неэффективно
  • 1
    С массивом из 64 предметов: p (я не говорю, что это легко, но ... это возможно)
Показать ещё 6 комментариев
0

Хорошим примером 2-мерного массива будет растровое изображение. Представьте, что каждый пиксель в изображении занимает один блок массива Pixel[1024][768]. Итак, чтобы узнать, какой цвет пиксел в верхнем левом углу экрана, вы бы посмотрели на Pixel[0][0].

3-мерные массивы требуют большей визуализации, но классическим примером будут моделирование точек в пространстве.

Я использовал двумерный массив в быстром и грязном симуляторе Hold 'Em, который я написал для представления решений на префлопе, это выглядело примерно так:

_Open = new char[][] 
{             //  2    3    4    5    6   7   8   9   T   J   Q   K   A
    new char [] {'P', 'F', 'F', 'F', 'F','F','F','F','F','F','F','P','P'}, // 2
    new char [] {'F', 'P', 'F', 'F', 'F','F','F','F','F','F','F','P','P'}, // 3 
    new char [] {'F', 'F', 'P', 'F', 'F','F','F','F','F','F','F','P','P'}, // 4
    new char [] {'F', 'F', 'F', 'P', 'F','F','F','F','F','F','F','P','P'}, // 5
    new char [] {'F', 'F', 'F', 'F', 'P','F','F','F','F','F','F','P','P'}, // 6
    new char [] {'F', 'F', 'F', 'F', 'F','P','F','F','P','F','F','P','P'}, // 7 
    new char [] {'F', 'F', 'F', 'F', 'F','F','P','P','P','P','F','P','P'}, // 8
    new char [] {'F', 'F', 'F', 'F', 'F','F','F','P','P','P','P','P','P'}, // 9
    new char [] {'F', 'F', 'F', 'F', 'F','F','F','F','P','P','P','P','P'}, // T
    new char [] {'F', 'F', 'F', 'F', 'F','F','F','F','F','P','P','P','P'}, // J
    new char [] {'F', 'F', 'F', 'F', 'F','F','F','P','P','P','P','P','P'}, // Q
    new char [] {'P', 'P', 'P', 'P', 'P','P','P','P','P','P','P','P','P'}, // K
    new char [] {'P', 'P', 'P', 'P', 'P','P','P','P','P','P','P','P','P'}  // A
};

Использование 0 для представления 2 и 12 для представления Ace. Поэтому, если симулятор обнаружит Ace, King, он будет проверять _Open [12] [11], см. "P" (что означает "push" или "all-in" ) и действовать соответственно

0

Этот фрагмент Java может просветить вас... он читает файл в двумерный массив. Это часть моего решения MazeOfBolton (google it).

  /**
   * Reads the file into a char[rows][cols] matrix.
   * @param String filename - the name of the file to read
   * @return a two-dimensional array of chars containing file contents.
   */
  private static char[][] readMatrix(String filename) throws IOException {
    BufferedReader input = null;
    try {
      input = new BufferedReader(new FileReader(filename));
      List<String> lines = new ArrayList<String>();
      String line = null;
      while ( (line = input.readLine()) != null ) {
        lines.add(line);
      }
      int rows = lines.size();
      char[][] matrix = new char[rows][];
      for (int i=0; i<rows; i++) {
        matrix[i] = lines.get(i).toCharArray();
      }
      return matrix;
    } finally {
      if(input!=null)input.close();
    }
  }

EDIT: Я должен сказать почему Я использовал матрицу... тем более, что мне пришлось создать список, чтобы получить массив... А? Почему бы просто не использовать Список? Короткий ответ скорость.

Доступ к массиву (хотя и многих измерений) реализуется (под капотом) как "арифметика индекса" (так называемая арифметика указателя), поэтому он не только обращается к элементу массива O (1), он быстрый O (1)... намного быстрее, чем эквивалентный arrayList.get(int index) (когда вы делаете это пару - миллион раз)... и в (допустимо искусственном) мире алгоритмических гонок скорость - это все.

Приветствия. Кит.

0

Хотя я уверен, что другие могут предоставить множество разных примеров, я работаю с роботами, и один из многих роботов задач выполняет пакетирование, помещая элемент в строку и формирование столбцов на поддоне. Каждое место на поддоне представляет собой набор индексов 2 или даже 3 размера массива.

locationArrayt [строка, столбец]

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

сообщение [errorNumber, язык]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню