返回

计算机考研408每日一题 day98之对称矩阵存储在数组中元素位置公式推导

前端

在计算机考研408的每日一题中,经常会遇到关于对称矩阵存储在数组中的问题。为了高效利用空间,对称矩阵通常只存储其对角线及对角线上方的元素,而对角线及对角线以下的元素则可以利用对称性得到。本文将详细推导对称矩阵中任意元素在由其对角线及对角线上方元素构成的一维数组中的存储位置。

推导过程

设A是n*n的对称矩阵,将A的对角线及对角线上方的元素以列为主的次序存放在一维数组B[1..n(n+1)/2]中。对于任意元素aij(1≤i,j≤n,且i≤j),其在数组B中的位置可以用以下公式计算:

pos = (i-1) * i / 2 + j

证明

对于对角线上的元素(i=j),其在数组B中的位置显然为:

pos = (i-1) * i / 2 + i = i(i-1)/2 + i = i(i+1)/2

对于对角线上方的元素(i<j),其在数组B中的位置可以这样理解:

  • 先将矩阵A划分为两个部分:左上角的ii子矩阵和右下角的(n-i)(n-i)子矩阵。
  • 由于A是对称矩阵,因此右下角的子矩阵是对称的,其对角线及对角线上方的元素可以看作是左上角子矩阵的对角线及对角线上方元素在右下角子矩阵中的对称元素。
  • 因此,aij在数组B中的位置等于aij在左上角子矩阵中的位置加上右下角子矩阵中对应元素的位置。

左上角子矩阵中aij的位置为:

pos = (i-1) * i / 2 + j

右下角子矩阵中aij的对称元素的位置为:

pos = (n-i)*(n-j) / 2 + (n-i) + (n-j) = (n-i)(n-j+1) / 2

因此,aij在数组B中的位置为:

pos = (i-1) * i / 2 + j + (n-i)(n-j+1) / 2 = (i-1) * i / 2 + j + (n-i) * (n-j) / 2 + (n-i) / 2 = (i-1) * i / 2 + j + n * (n-i) / 2 - j * (n-i) / 2 + (n-i) / 2 = (i-1) * i / 2 + n * (n-i) / 2 + (n-i) / 2 = (i-1) * i / 2 + n * (n-i) / 2 + n / 2 - i / 2 = (i-1) * i / 2 + (n-i) * (n+i) / 2 = (i-1) * i / 2 + (n^2 - i^2) / 2 = (i-1) * i / 2 + n(n+1) / 2 - i(i+1) / 2 = (i-1) * i / 2 + n(n+1) / 2 - i^2 / 2 - i / 2 = (i-1) * i / 2 + n(n+1) / 2 - i * (i+1) / 2 = (i-1) * i / 2 + n(n+1) / 2 - i(i+1) / 2 = (i-1) * i / 2 + n(n+1) / 2 - i(i+1) / 2

实例

考虑一个4*4的对称矩阵A:

A = | 1  2  3  4 |
    | 2  5  6  7 |
    | 3  6  8  9 |
    | 4  7  9 10 |

按照上述公式计算,矩阵A的对角线及对角线上方元素在数组B中的位置如下:

B[1] = a11 = 1
B[2] = a12 = 2
B[3] = a13 = 3
B[4] = a14 = 4
B[5] = a22 = 5
B[6] = a23 = 6
B[7] = a24 = 7
B[8] = a33 = 8
B[9] = a34 = 9
B[10] = a44 = 10

总结

通过上述推导,我们可以得到对称矩阵中任意元素在由其对角线及对角线上方元素构成的一维数组中的存储位置公式:

pos = (i-1) * i / 2 + j

掌握这个公式,对于解决计算机考研408每日一题中此类问题至关重要。