数据结构基础(一)数组,矩阵

时间:2022-07-24
本文章向大家介绍数据结构基础(一)数组,矩阵,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

数据结构基础(一)

有一个等式,数据结构+算法=程序,说明了数据结构对于计算机程序设计的重要性。数据结构是指数据元素的集合(或数据对象)及元素间的相互关系和构造方法。数据对象中元素之间的相互关系称为数据的逻辑结构,数据元素及元素之间关系的存储形式称为存储结构(或物理结构)。

数据结构按照逻辑关系的不同,分为线性结构和非线性结构两种,线性结构又可分为树结构和图结构。

1.1 数组

1.数组的定义和基本运算

数组是程序中最常用的数据结构,数组的本质是内存中一段大小固定,地址连续的存储单元。

一维数组是一个长度固定,下标有序的线性序列。二位数组则是一个矩阵结构,本质上是以数组作为数组元素的数组,即“数组的数组”。以二维数组A[m,n]为例,其结构如图2-1所示:

A[m,n]可以看做一个行向量形式的线性序列:

Am,n =[[a11,a12…a1n],[a21,a22…a2n],…,[ am1,am2…amn]];

也可以看做一个列向量形式的线性序列

Am,n =[[a11,a21…am1],[a12,a22…am2],…,[ a1n,a2n…amn]];

二维数组的本质是一维数组的数组

数组的结构特点:

  1. 数组元素数目固定,一旦定义不可改变。
  2. 数组中的元素具有相同的类型。
  3. 数组下标具有上下界的约束且有序。

数组的两个基本运算:

  1. 给定一组下标,存取相应的数据元素。
  2. 给定一组下标,更改相应元素的值。

在程序设计语言中,把数组看做是具有共同名字的相同类型的多个变量的集合。

2. 数组元素的存储

数组适合采用顺序存储结构,对于数组一旦确定了其维数和各维的长度,便可分配存储空间。所以,只要给出一组下标便可求出相应数组元素的存储位置,在数组的顺序存储结构中,数组元素的位置和其下标呈线性关系。

二维数组的存储结构可分为以行为主存储和以列为主存储两种方式

设每个数组元素占用L个单元,m,n为数组的行数和列数,Loc(a11)表示元素a11的地址,以行为主:

Loc(aij)=Loc(a11)+(i-1)×n+(j-1) ×L

以列为主:

Loc(aij)=Loc(a11)+(j-1)×m+(i-1) ×L

推广至多维数组,按下标顺序(以行为主)存储时,先排最右的下标,从右至左到最左下标,而逆下标顺序正好相反。

3.矩阵

在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 [1] ,最早来自于方程组的系数及常数所构成的方阵。这一概念由19世纪英国数学家凯利首先提出。在数据结构中,主要讨论如何在节省存储空间的前提下,正确高效的运算矩阵。

在实际应用中,经常出现一些阶数很高的矩阵,同时在矩阵中有很多值相同的元素并且它们的分布有一定的规律——称为特殊矩阵(special matrix),对称矩阵就是其中一种。对称矩阵的特点是:在一个n阶方阵中,有aij=aji(1≤i,j≤n)。可以对这类矩阵进行压缩存储,从而节省存储空间,并使矩阵的各种运算能有效进行。

(1) 对称矩阵

对称矩阵关于主对角线对称,因此只需存储下三角部分(包括主对角线)即可。这样,原来需要存储n×n个存储单元,现在只需要n×(n+1)/2个存储单元,节约了大约一半的存储单元。当n较大时,这是比较可观的一部分存储单元。

如何只存储下三角部分的元素呢?由于下三角中共有n×(n+1)/2个元素,可将这些元素按行存储到一个数组SA[n(n+1)/2]中。这样,下三角中的元素aij(i≥j)存储到SA[k]中,在数组SA中的下标k和i、j的关系为:k=i×(i-1)/2+j-1,寻址的计算方法如图所示。

Java代码实现对称矩阵存储压缩:

//对称矩阵的压缩算法
publicclass SymmetricMatrix {
 privatestaticfinalintN = 3;// 矩阵的阶数
 int[][] a = newint[N][N];//矩阵
 int[] SA = newint[N * (N + 1) / 2];//一维数组
 publicvoid init() {
 for (int i = 0; i < N; i++) {
 for (int j = 0; j <= i; j++) {
 a[i][j] = a[j][i] = i + j;
            }
        }
 //把矩阵压缩为一维数组存储
 int count = 0;
 for (int i = 0; i < N; i++) {
 for (int j = 0; j <= i; j++) {
 SA[count] = a[i][j];
                count++;
            }
        }
    }
 // 打印对称矩阵
 publicvoid printMatrix() {
 for (int i = 0; i < N; i++) {
 for (int j = 0; j < N; j++) {
                System.out.print(a[i][j] + " ");
            }
            System.out.println();
        }
    }
 //查找
 publicint find(int i, int j) {
 returnSA[i * (i + 1) / 2 + j];
    }
 //打印数组
 publicvoid printSA() {
 for (int i : SA) {
            System.out.print(i + " ");
        }
    }
 publicstaticvoid main(String[] args) {
        SymmetricMatrixmatrix = new SymmetricMatrix();
        matrix.init();
        matrix.printMatrix();
        System.out.println("------------分割线----------");
        matrix.printSA();
        System.out.println();
 int result = matrix.find(2, 1);
        System.out.println();
        System.out.println(result);
    }
}

(2)稀疏矩阵

在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵。稀疏矩阵常使用三元组存储法,三元组表示法就是在存储非零元的同时,存储该元素所对应的行下标和列下标。稀疏矩阵中的每一个非零元素由一个三元组(i,j,aij)唯一确定。矩阵中所有非零元素存放在由三元组组成的数组中。