二维数组-数据结构

这篇具有很好参考价值的文章主要介绍了二维数组-数据结构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

二维数组

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

然而,创建二维数组是为了实现类似于关系数据库的数据结构。它可以轻松地一次保存大量数据,这些数据可以在需要时传递到任意数量的函数。

二维数组可视化

二维数组可视化在线操作-图码

二维数组,数据结构进阶宝典,算法,数据结构,线性回归,链表,排序算法,最小二乘法,柔性数组

数据结构可视化动画版

如何声明二维数组

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

int x = a[i][j];   

但是,它生成的数据结构如下所示。
 

二维数组,数据结构进阶宝典,算法,数据结构,线性回归,链表,排序算法,最小二乘法,柔性数组

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

我们如何访问二维数组中的数据

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

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

int  x = a[i][j];   

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

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

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

初始化二维数组

我们知道,在C编程中同时声明和初始化一维数组时,不需要指定数组的大小。然而,这不适用于二维数组。我们必须至少定义数组的第二个维度。

声明和初始化二维数组的语法如下。

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

二维数组中可以存在的元素数量始终等于(行数 * 列数)。

示例:将用户数据存储到二维数组中并打印。

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

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

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

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

下图显示了 3 X 3 二维数组。然而,这个数组需要映射到一维数组才能将其存储到内存中。
 

二维数组,数据结构进阶宝典,算法,数据结构,线性回归,链表,排序算法,最小二乘法,柔性数组

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

1.行主排序

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

二维数组,数据结构进阶宝典,算法,数据结构,线性回归,链表,排序算法,最小二乘法,柔性数组

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

二维数组,数据结构进阶宝典,算法,数据结构,线性回归,链表,排序算法,最小二乘法,柔性数组

2. 列主要排序

根据列主排序,二维数组的所有列都连续存储到内存中。上图中所示数组的内存分配如下。
 

二维数组,数据结构进阶宝典,算法,数据结构,线性回归,链表,排序算法,最小二乘法,柔性数组

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

二维数组,数据结构进阶宝典,算法,数据结构,线性回归,链表,排序算法,最小二乘法,柔性数组

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

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

按行主要顺序

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

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

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

例子 :文章来源地址https://www.toymoban.com/news/detail-802004.html

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   

到了这里,关于二维数组-数据结构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构 | 寻找二维数组的最大值和对应下标 | C语言代码

    题目:         本题目要求读入M(最大为10)行N(最大为15)列个元素,找出其中最大的元素,并输出其行列值。 输入格式:         输入在第一行中给出行数m和列数n。接下来输入m*n个整数。 输出格式:         输出最大值的行号,列号,值。 输入样例: 2 3 1 2 3 4 5 6 输

    2024年02月05日
    浏览(44)
  • java数据结构与算法刷题-----LeetCode240. 搜索二维矩阵 II

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 解题思路 法一:把整个数组遍历一遍,时间复杂度O(m*n) 法二:每一行用二分搜索,那么时间复杂度就是O(m * l o g 2 n log_2{n} l o g

    2024年01月22日
    浏览(48)
  • 【算法 & 高级数据结构】树状数组:一种高效的数据结构(一)

    🚀 个人主页 :为梦而生~ 关注我一起学习吧! 💡 专栏 :算法题、 基础算法~赶紧来学算法吧 💡 往期推荐 : 【算法基础 数学】快速幂求逆元(逆元、扩展欧几里得定理、小费马定理) 【算法基础】深搜 树状数组 (Binary Indexed Tree,BIT)是一种数据结构,用于高效地处理

    2024年03月11日
    浏览(51)
  • 【算法 & 高级数据结构】树状数组:一种高效的数据结构(二)

    🚀 个人主页 :为梦而生~ 关注我一起学习吧! 💡 专栏 :算法题、 基础算法、数据结构~赶紧来学算法吧 💡 往期推荐 : 【算法基础 数学】快速幂求逆元(逆元、扩展欧几里得定理、小费马定理) 【算法基础】深搜 数据结构各内部排序算法总结对比及动图演示(插入排序

    2024年03月26日
    浏览(75)
  • 数据结构与算法 | 数组(Array)

    数组(Array)应该是最基础的数据结构之一,它由相同类型的元素组成的集合,并按照一定的顺序存储在内存中。每个元素都有一个唯一的索引,可以用于访问该元素。 数组索引(Index): 数组中的每个元素都有一个唯一的整数索引,从0开始计数。索引用于访问数组中的元素

    2024年02月08日
    浏览(35)
  • 数据结构与算法(一): 稀疏数组

    在五子棋游戏或类似的游戏中,我们可以把整个棋盘想象成是一个有规律的二维数组,其值由0、1、2三个数字组成,0代表空白区域,1代表白子,2代表黑子。这种情况:即当一个数组中大部分元素为0或者为同一值时,存储该数组数据可以使用稀疏数组来对原始数组进行精简,

    2024年02月11日
    浏览(35)
  • JavaScript数据结构与算法整理------数组

            数组的标准定义: 一个存储元素的线性集合,元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量 ,几乎所有的编程语言都有类似的数据结构,而JavaScript的数组略有不同。         JavaScript中的数组是一种特殊的对象,用来表示偏

    2023年04月24日
    浏览(47)
  • 【数据结构和算法】寻找数组的中心下标

    Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列长度 2.1.4 寻找数组中第 k 小的元素 2

    2024年02月04日
    浏览(38)
  • 数据结构与算法-数组(附阿里面试题)

            给你一个文件里面包含全国人民(14亿)的年龄数据(0~180),现在要你统计每一个年龄   有多少人?          给定机器为 单台+2CPU+2G内存。不得使用现成的容器,比如map等。 (这一句可以忽略)         在以上情况下你该如何以最高效的方法来解决这个

    2024年02月13日
    浏览(28)
  • 【算法数据结构系列】哈夫曼树进阶解读

    作者:半身风雪 简介:移动开发全栈领域工作者

    2024年02月10日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包