Каково определение «истинного» многомерного массива и какие языки его поддерживают? - PullRequest
8 голосов
/ 18 ноября 2011

Большинство книг по программированию, которые я когда-либо читал, имеют следующую строку:

"Язык X не поддерживает истинные многомерные массивы, но вы можете имитировать (приближать) их с помощью массивов массивов."

Так как большая часть моего опыта была с языками на основе C, то есть C ++, Java, JavaScript, php и т. Д., Я не уверен, что такое "истинный" многомерный массив.

Каково определение многомерного массива true и какие языки его поддерживают?Также, если возможно, приведите пример истинного многомерного массива в коде.

Ответы [ 4 ]

6 голосов
/ 18 ноября 2011

C # поддерживает как истинные многомерные массивы, так и «зубчатые» массивы (массивы массивов), которые могут быть заменой.

// jagged array
string[][] jagged = new string[12][7];

// multidimensional array
string[,] multi = new string[12,7];

Зубчатые массивы обычно считаются лучшими, поскольку они могут делать все, что может делать многомерный массив, и даже больше.В зубчатом массиве вы можете иметь каждый вложенный массив разного размера, тогда как вы не можете сделать это в многомерном массиве.Существует даже правило анализа кода на этот счет (http://msdn.microsoft.com/en-us/library/ms182277.aspx)

0 голосов
/ 27 октября 2017

Common Lisp поддерживает оба типа массивов.

Многомерный массив называется Array, а "одномерный" - Vector.

0 голосов
/ 18 ноября 2011

Не пройдя через множество литературы на сайтах Sun и Microsoft, это то, что я помню со своих дней C. Надеюсь это поможет.

Для простоты, если мы просто думаем в двух измерениях - массивы могут быть представлены как двумерный массив и массив указателей. В коде это составляет int x [15] [20]; int * y [15];

В этом примере x [5] [6] и b [5] [6] являются допустимыми синтаксически и в итоге ссылаются на один int.

При этом x является истинным двумерным массивом: после того, как вы его создадите, будет отведено 300 мест (которые могут содержать int), и вы можете использовать хорошо известное условное обозначение для доступа к этому прямоугольный (с 15 строками и 20 столбцами) массив, в котором вы можете получить x [row, col] путем вычисления (20 * row) + col.

Однако в случае y, пока структура определяется, только 15 указателей выделяются, но не инициализируются. (Инициализация должна быть сделана явно)

У этого подхода есть свои преимущества и недостатки (массив указателей или «массив массивов» или неровный массив, как он называется):

Преимущество:

Строки этого массива могут иметь различную длину, т. Е. Каждый элемент y не должен указывать на строку из двадцати элементов; один элемент может указывать на 2 элемента, второй элемент может указывать на 3 элемента, а третий - на ноль элементов и т. д.

Неудобство:

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

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

0 голосов
/ 18 ноября 2011

Java использует их тоже

int[][] a2 = new int[10][5];

Вот интересное использование, которое я нашел

String[][] Data;

 //Assign the values, do it either dynamically or statically
 //For first fow
 Data[0][0] = "S"; //lastname
 Data[0][1] = "Pradeep"; //firstname
 Data[0][2] = "Kolkata"; //location

 //Second row
 Data[1][0] = "Bhimani"; //lastname
  Data[1][1] = "Shabbir"; //firstname
  Data[1][2] = "Kolkata"; //location

 //Add as many rows you want

 //printing
 System.out.print("Lastname\tFirstname\tLocation\n");
 for(i=0;i<2;i++)
 {
   for(j=0;j<3;j++)
   {
     System.out.print(Data[i][j]+"\t");
   }
   //move to new line
   System.out.print("\n");
 }
...