数组对称_数据结构串和数组(二)

数组的基本概念

数组是一个二元组(idx,value)的集合,对每个idx,都有一个value值与之对应。idx称为下标,可以由一个整数、两个整数或多个整数构成,下标含有d(d≥1)个整数称为维数是d。

数组按维数分为一维、二维和多维数组。

一维数组A是n(n>1)个相同类型元素a0,a1,…,an-1构成的有限序列,其逻辑表示为A=(a0,a1,…,an-1),其中,A是数组名,ai(0≤i≤n-1)是数组A中序号为i的元素。

一个二维数组可以看作是每个数据元素都是相同类型的一维数组的一维数组。

以此类推

73bc51eb2810013744033318a98ebbc4.png数组具有以下特点

(1)数组中各元素都具有统一的数据类型。

(2)d(d≥1)维数组中的非边界元素具有d个前驱元素和d个后继元素。

(3)数组维数确定后,数据元素个数和元素之间的关系不再发生改变,特别适合于顺序存储。

(4)每个有意义的下标都存在一个与其相对应的数组元素值。

d维数组抽象数据类型

28ce035eebdfe1d29dec89694b8fcf6a.png

数组的主要操作是存取元素值,没有插入和删除操作,所以数组通常采用顺序存储方式来实现。

一维数组

一维数组的所有元素依逻辑次序存放在一片连续的内存存储单元中。

其起始地址为第一个元素a0的地址即LOC(a0)。

假设每个数据元素占用k个存储单元。

则任一数据元素ai的存储地址LOC(ai)就可由以下公式求出

a4db9640ce00e2bbe2a58c091e366051.png

d维数组

以m行n列的二维数组Am×n=(aij)为例讨论(二维数组也称为矩阵)。

195dd0573931b0108b408353a4d4b8cc.png

按行优先存储

假设每个元素占k个存储单元,LOC(a00)表示a00元素的存储地址。对于元素aij

ai,j前面有0~i-1共i行,每行n个元素,共有i×n个元素。

在第i行中前面有a[i,0..j-1],共j个元素。

合起来,ai,j前面有i×n+j个元素。

17f52ed788a8df0671bcc3646ef9d805.png

按列优先存储

假设每个元素占k个存储单元,LOC(a00)表示a00元素的存储地址。对于元素aij

ai,j前面有0~j-1共j列,每列m个元素,共有j×m个元素。

在第j列中前面有a[0..i-1,j],共i个元素。

合起来,ai,j前面有j×m+i个元素。则:

e496fe8b47c3a1bc13221d856a4c23fb.png

3ac4f61d69f97ff953bc5115c1d1ded1.png

例子:设有二维数组a[1..50,1..80],其a[1][1]元素的地址为2000,每个元素占2个存储单元,若按行优先存储,则元素a[45][68]的存储地址为多少?若按列优先存储,则元素a[45][68]的存储地址为多少?

按行优先存储

元素a[45][68]前面有1~44行,每行80个元素,计44×80个元素。

在第45行中,元素a[45][68]前面有a[45][1..67]计67个元素,这样元素a[45][68]前面存储的元素个数=44×80+67。

LOC(a[45][68])=2000+(44×80+67)×2=9174。

例子:设有二维数组a[1..50,1..80],其a[1][1]元素的地址为2000,每个元素占2个存储单元,若按行优先存储,则元素a[45][68]的存储地址为多少?若按列优先存储,则元素a[45][68]的存储地址为多少?

按列优先存储

元素a[45][68]前面有1~67列,每列50个元素,计67×50个元素。

在第68列中,元素a[45][68]前面有a[1..44][68]计44个元素,这样元素a[45][68]前面存储的元素个数=67×50+44。

LOC(a[45][68])=2000+(67×50+44)×2=8788。

特殊矩阵的压缩存储

5fc6771acbc0f7c02da69f756bb77cb1.png

对称矩阵的压缩存储

45b19ddb8eed41891aa4e7a545eb760f.png

a193d4d7ac0d7c12de4b9a5a99067fc2.png

f2c9b026752fe38a6649e18199cd8e49.png

三角矩阵的压缩存储

a702793522aee2de1d1d58f745a737fd.png

7e2df007f73788ef12c0ed3bb630a5eb.png

035333f314e3f49178ed4a998014ce14.png

f16a13d14b34bdea2cd95a273c76dfd4.png

对角矩阵的压缩存储

fb86755608c98a70af9f9da1341c25ce.png

af333face8209420abc23995d5a2020c.png

稀疏矩阵

一个阶数较大的矩阵中的非零元素个数s相对于矩阵元素的总个数t十分小时,即s<

例如一个100×100的矩阵,若其中只有100个非零元素,就可称其为稀疏矩阵。

稀疏矩阵和特殊矩阵的不同点:

特殊矩阵的特殊元素(值相同元素、常量元素)分布有规律。

稀疏矩阵的特殊元素(非0元素)分布没有规律。

稀疏矩阵的三元组表示

a33e9241d2464c672cc8464c27314b21.png

三元组表示中每个元素的类定义如下:

ae7d65613d026608808db3e0289b1408.png

设计稀疏矩阵三元组存储结构类TupClass如下:

ee38a8628f78976c1d47fc2e0e28c97d.png

TupClass类中包含如下基本运算方法:

   其中,data列表用于存放稀疏矩阵中所有非零元素,通常按行优先顺序排列。这种有序结构可简化大多数稀疏矩阵运算算法。

7e5614836b15751b87721ee640fbc39f.png

稀疏矩阵的十字链表表示

每个非零元素对应一个结点

a0c99522aa97f06fbe4e2a9b1d5adb13.png

每行的所有结点链起来构成一个带行头结点的循环单链表。以h[i](0≤i≤m-1)作为第i行的头结点。

42964cf6e7fa6a5034ab1a5f04adb787.png

每列的所有结点链起来构成一个带列头结点的循环单链表。以h[i](0≤i≤m-1)作为第i列的头结点。

e634a1d985982b55040377d51be9d0bd.png

行、列头结点可以共享

4215f4f0777f4c0c98b0544f985b157e.png

增加一个总头结点,并把所有行、列头结点链起来构成一个循环单链表

f077ef321a900d3da25515b75400c665.png

为了统一,设计结点类型如下:

34ebe1b4c1d7531acc8d0b78bf04c771.png

7e2923f1fe9652858daffc6fef23f8c1.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值