个性化阅读
专注于IT技术分析

数据结构之二维数组

本文概述

二维数组可以定义为数组的数组。 2D阵列以矩阵形式组织, 可以表示为行和列的集合。

但是, 创建了2D数组以实现类似关系数据库的数据结构。它使一次性存储大量数据变得容易, 可以在需要时将其传递给任意数量的函数。

如何声明二维数组

声明二维数组的语法与一维数组的语法非常相似, 如下所示。

int arr[max_rows][max_columns];

但是, 它产生如下的数据结构。

DS 二维数组

上图显示了二维数组, 元素以行和列的形式组织。第一行的第一个元素由a [0] [0]表示, 其中第一个索引中显示的数字是该行的编号, 而第二个索引中显示的数字是列的编号。

我们如何访问2D数组中的数据

由于2D数组的元素可以被随机访问。类似于一维数组, 我们可以使用单元格的索引来访问2D数组中的各个单元格。特定单元格有两个索引, 一个是其行号, 另一个是其列号。

但是, 我们可以使用以下语法将2D数组的任何特定单元格中存储的值存储到某个变量x中。

int x = a[i][j];

其中i和j分别是单元格的行号和列号。

我们可以使用以下代码将2D数组的每个像元分配为0:

for ( int i=0; i<n ;i++)
{
	for (int j=0; j<n; j++) 
	{
		a[i][j] = 0; 
	}
}

初始化2D阵列

我们知道, 当我们在C编程中同时声明和初始化一维数组时, 我们不需要指定数组的大小。但是, 这不适用于2D阵列。我们将必须至少定义数组的第二维。

声明和初始化2D数组的语法如下。

int arr[2][2] = {0, 1, 2, 3};

2D数组中可以存在的元素数将始终等于(行数*列数)。

示例:将用户数据存储到2D阵列中并进行打印。

C示例:

#include <stdio.h>
void main ()
{
	int arr[3][3], i, j; 
	for (i=0;i<3;i++)
	{
		for (j=0;j<3;j++)
		{
			printf("Enter a[%d][%d]: ", i, j);			
			scanf("%d", &arr[i][j]);
		}
	}
	printf("\n printing the elements ....\n"); 
	for(i=0;i<3;i++)
	{
		printf("\n");
		for (j=0;j<3;j++)
		{
			printf("%d\t", arr[i][j]);
		}
	}
}

Java示例

import java.util.Scanner;
publicclass TwoDArray {
publicstaticvoid main(String[] args) {
	int[][] arr = newint[3][3];
	Scanner sc = new Scanner(System.in);
	for (inti =0;i<3;i++)
	{
		for(intj=0;j<3;j++)
		{
			System.out.print("Enter Element");
			arr[i][j]=sc.nextInt();
			System.out.println();
		}
	}
	System.out.println("Printing Elements...");
	for(inti=0;i<3;i++)
	{ 
		System.out.println();
		for(intj=0;j<3;j++)
		{
			System.out.print(arr[i][j]+"\t");
		}
	}
}
}

C#示例

using System;
					
public class Program
{
	public static void Main()
	{
		int[, ] arr = new int[3, 3];
		for (int i=0;i<3;i++)
		{
			for (int j=0;j<3;j++)
			{
				Console.WriteLine("Enter Element");
				arr[i, j]= Convert.ToInt32(Console.ReadLine());
			}
		}
		Console.WriteLine("Printing Elements...");
		for (int i=0;i<3;i++)
		{
			Console.WriteLine();
			for (int j=0;j<3;j++)
			{
				Console.Write(arr[i, j]+" ");
			}
		}
	}
}

将2D数组映射到1D数组

当映射二维数组时, 我们大多数人可能会想到为什么需要这种映射。但是, 从用户角度来看, 存在2个D数组。创建2D数组以实现类似关系数据库表的数据结构, 在计算机内存中, 用于2D数组的存储技术类似于一维数组。

二维数组的大小等于数组中存在的行数和列数的乘积。为了将它们存储在内存中, 我们确实需要将二维数组映射到一维数组。

下图显示了一个3 X 3的二维数组。但是, 此数组需要映射到一维数组以将其存储到内存中。

DS 二维数组

将2D数组元素存储到内存中的主要技术有两种

1.行主要排序

在行主要排序中, 二维数组的所有行都连续存储到内存中。考虑到上图中显示的数组, 其根据行主要顺序的内存分配如下所示。

DS 二维数组

首先, 将数组的第一行完全存储到内存中, 然后将数组的第二行完全存储到内存中, 依此类推, 直到最后一行。

DS 二维数组

2.列主要订购

根据列主要顺序, 将2D数组的所有列连续存储到内存中。上图中显示的数组的内存分配如下。

DS 二维数组

首先, 将数组的第一列完全存储到内存中, 然后将数组的第二行完全存储到内存中, 依此类推, 直到数组的最后一列。

DS 二维数组

计算二维数组的随机元素的地址

由于存在将二维数组存储到存储器中的两种不同技术, 因此有两种不同的公式来计算2D数组的随机元素的地址。

按行主要订单

如果数组由a [m] [n]声明, 其中m是行数, 而n是列数, 则按行主顺序存储的数组元素a [i] [j]的地址计算为,

Address(a[i][j]) = B. A. + (i * n + j) * size

其中, B. A.是基址或数组a [0] [0]的第一个元素的地址。

范例:

a[10...30, 55...75], base address of the array (BA) = 0, size of an element = 4 bytes . 
Find the location of a[15][68]. 

Address(a[15][68]) = 0 + 
((15 - 10) x (68 - 55 + 1) + (68 - 55)) x 4

= (5 x 14 + 13) x 4
= 83 x 4 
= 332 answer

按列主要顺序

如果数组由a [m] [n]声明, 其中m是行数, 而n是列数, 则按行主顺序存储的数组元素a [i] [j]的地址计算为,

Address(a[i][j]) = ((j*m)+i)*Size + BA

其中BA是阵列的基地址。

例:

A [-5 ... +20][20 ... 70], BA = 1020, Size of element = 8 bytes. Find the location of a[0][30]. 

Address [A[0][30]) = ((30-20) x 24 + 5)  x 8 + 1020   =  245 x 8 + 1020 = 2980 bytes
赞(0)
未经允许不得转载:srcmini » 数据结构之二维数组

评论 抢沙发

评论前必须登录!