4. 二維數(shù)組(數(shù)據(jù)結(jié)構(gòu))

二維數(shù)組可以理解為數(shù)組的數(shù)組。二維數(shù)組組織為矩陣,可以表示為行和列的集合。

但是,創(chuàng)建二維數(shù)組以實現(xiàn)關(guān)系數(shù)據(jù)庫外觀相似的數(shù)據(jù)結(jié)構(gòu)。它提供了一次容納大量數(shù)據(jù)的便利性,可以在任何需要的地方傳遞給任意數(shù)量的功能。

1. 如何聲明二維數(shù)組

聲明二維數(shù)組的語法與一維數(shù)組的語法非常相似,如下所示 -

int arr[max_rows][max_columns];   

它產(chǎn)生的數(shù)據(jù)結(jié)構(gòu)如下所示 -

上圖顯示了二維數(shù)組,元素以行和列的形式組織。 第一行的第一個元素由[0][0]表示,其中第一個索引中顯示的數(shù)字是行的數(shù)字,而第二個索引顯示的數(shù)字是列的數(shù)字。

2.如何訪問二維數(shù)組的數(shù)據(jù)

由于二維數(shù)組的元素可以隨機訪問。這與一維數(shù)組類似,可以使用單元格的索引訪問二維數(shù)組中的各個單元格。將兩個索引值附加到特定單元格,一個是行號,另一個是列號。

使用以下語法將存儲在二維數(shù)組的任何特定單元格中的值存儲到某個變量x

int x = a[i][j];   

其中ij分別是單元格的行號和列號。使用以下代碼將二維數(shù)組的每個單元格分配0值:

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

3.初始化二維數(shù)組

當(dāng)同時在C語言編程中聲明和初始化一維數(shù)組時,不需要指定數(shù)組的大小。 但是這不適用于二維數(shù)組。必須至少定義數(shù)組的第二個維度。

聲明和初始化二維數(shù)組的語法如下 -

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

二維數(shù)組的元素數(shù)量總是等于:行數(shù) * 列數(shù) 。

示例: 將用戶數(shù)據(jù)存儲到二維數(shù)組并打印。

C語言的實現(xiàn)

#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語言的實現(xiàn)

import java.util.Scanner;  
public class TwoDArray {  
  public static void 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#語言的實現(xiàn)

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]+" ");  
            }  
        }  
    }  
}  

4.將二維數(shù)組映射到一維數(shù)組

在映射二維數(shù)組時,大多數(shù)人可能會問為什么需要這種映射。創(chuàng)建二維數(shù)組和實現(xiàn)關(guān)系數(shù)據(jù)庫表看起來有相似的數(shù)據(jù)結(jié)構(gòu),在計算機存儲器中,二維數(shù)組存儲技術(shù)類似于一維數(shù)組的存儲技術(shù)。

二維數(shù)組的大小等于行數(shù)和數(shù)組中存在的列數(shù)的乘積。 確實需要將二維數(shù)組映射到一維數(shù)組,以便將它們存儲在內(nèi)存中。

一個3 X 3的二維數(shù)組如下圖所示。 但是,需要將此數(shù)組映射到一維數(shù)組,以便將其存儲到內(nèi)存中。

image

將二維數(shù)組元素存儲到存儲器中有兩種主要技術(shù) -

4.1.行主順序

在行主排序中,二維數(shù)組的所有行連續(xù)地存儲在存儲器中。 考慮一下上圖中所示數(shù)組,它按行主順序的存儲器分配如下所示 -

image

首先,數(shù)組的第一行完全存儲到存儲器中,然后數(shù)組的第二行完全存儲到存儲器中,直到最后一行也完全存儲到存儲器中。

image

4.2.列主順序

根據(jù)列主排序,二維數(shù)組的所有列都連續(xù)地存儲在存儲器中。 上面圖像中所示數(shù)組的存儲器分配給出如下 -

image

首先,數(shù)組的第一列完全存儲到存儲器中,然后數(shù)組的第二行完全存儲到存儲器中,直到數(shù)組的最后一列。


image

5.計算二維數(shù)組隨機元素的地址

由于存在兩種不同的將二維數(shù)組存儲到存儲器中的技術(shù),因此也有兩種不同的公式來計算二維數(shù)組的隨機元素的地址。

5.1. 按行主順序

如果數(shù)組由a[m][n]聲明,其中m是行數(shù),而n是列數(shù),則以行主順序存儲的數(shù)組的元素a[i][j]的地址計算為,

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

其中,B. A.是基數(shù)地址或數(shù)組a[0][0]的第一個元素的地址。

示例:

a[10...30, 55...75], 基地址 array (BA) = 0 , 一個元素的大小 = 4 字節(jié) 。
計算 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
5.2. 按列主順序

如果數(shù)組由a[m][n]聲明,其中m是行數(shù),而n是列數(shù),則以列主順序存儲的數(shù)組的元素a[i][j]的地址計算為,

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

其中,BA是數(shù)組的基地址。

示例

A [-5 ... +20][20 ... 70], BA = 1020, 元素的大小為 = 8 字節(jié)。計算 a[0][30] 的位置是 - 
  
地址 [A[0][30]) = ((30-20) x 24 + 5)  x 8 + 1020   =  245 x 8 + 1020 = 2980 字節(jié)   
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,615評論 3 44
  • 數(shù)組在程序設(shè)計中,為了處理方便, 把具有相同類型的若干變量按有序的形式組織起來。這些按序排列的同類數(shù)據(jù)元素的集合稱...
    朱森閱讀 4,271評論 2 13
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,306評論 2 89
  • 她叫麗莎,今年9歲。前不久,她從法國電影《蝴蝶》里蜻蜓點水般輕盈一躍,活生生地跳入了我的視野。 從外表上看,小姑娘...
    八月初六閱讀 665評論 2 4
  • 前天晚上九點,接到老公的電話,說是剛參加完會議,會議從下午4點一直開到現(xiàn)在,新的工資方案已經(jīng)通過,每月漲薪40%,...
    柴柴cc閱讀 393評論 0 0

友情鏈接更多精彩內(nèi)容