上三角矩阵的压缩存储

理论推演:

相对于下三角矩阵, 上三角矩阵, 只是, 计算数组的位序有一些区别, 上三角矩阵, 我们默认,下三角区域是一个数值, 所以我们在赋值下三角区域时 , 改变一个值,相当于改变下三角区域了全部的值。

压缩矩阵后 上三角区域的数组位序, 对应着此点之前有多少个数据节点。

如上图所示,i <= j时, k = i*(2*n - i + 1)/2 + j - i.

这个计算原理 , 我们可以想象成一个梯形 , 上底加下底括住乘高除以2.

假设是 (i, j ) ,那就代表着, 此点之前 有 i 行数据节点 , 那么 从第一行到第 i行 , 就是一个梯形.

下底 == n   , 上底 此时是 第 i 行, 我们就看对角线, 此时对角线 第i行, 交叉的点, 是第 i 个元素 , 那么, 此元素之前就有 (i - 1)个元素 , 这(i - 1)个元素属于下三角区域, 我们上三角区域在此行就是 (n - i +1 ), 这也就是 上底, 那这个梯形的高, 就是 i , 因为是第i行(从1开始算),  

所以 (i , j) 之前一个有 i*(2*n - i + 1)/2个元素 , 加上 后面的是 (j - i + 1)个元素, 但是数组是从 0开始算, 所以 数组位序就是 k = i*(2*n - i + 1)/2 + j - i.

所以 上三角压缩矩阵 和下三角矩阵不同的就是, 在判断坐标时候, 区分一下分别属于哪个矩阵, 然后进行对应数组位序的转换, 

函数功能:

//为N阶上三角矩阵初始化成的一维数组分配空间
void Init_triangular_matrix(int *&matrix);
//返回二维上三角矩阵的值(压缩存取)
int get_Value_triangular_matrix(int matrix[],int x,int y);
//把值传进二维上三角矩阵矩阵(压缩存储)
void Assign_triangular_matrix(int matrix[],int input_value,int x,int y);
//输出展示压缩存储的上三角矩阵矩阵
void Display_triangular_matrix(int matrix[]);
//销毁上三角矩阵存储空间
void Destroy_triangular_matrix(int matrix[]);

函数实现:

#define max_wide 4

/**************************************************
函数名: Init_triangular_matrix
功  能: 初始化上三角矩阵,为其分配存储空间
参  数: int *&matrix:给对应矩阵分配空间
返回值: 无
**************************************************/
void Init_triangular_matrix(int *&matrix)
{
    //给地址分配空间
    matrix = (int*)malloc(sizeof(int)*(max_wide*(max_wide+1)/2));
}
/**************************************************
函数名: get_Value_triangular_matrix
功  能: 得到上三角矩阵的值(因为是压缩存储,所以需要转换)
参  数: (1)int matrix[]:上三角矩阵矩阵存储数据的一维数组
        (2)int x:对应的横坐标
        (3)int y:纵坐标
返回值: int:对应坐标的值
**************************************************/
int get_Value_triangular_matrix(int matrix[],int x,int y)
{
    if(x <= y)
    {
        return matrix[x*(2*max_wide-x+1)/2+y-x];
    }
    else    //下三角,则直接返回末尾
    {
        return matrix[max_wide*(max_wide+1)/2];
    }
}
/**************************************************
函数名: Assign_triangular_matrix
功  能: 给压缩上三角矩阵赋值(和取值一样,也是通过一维数组转换)
参  数: (1)int matrix[]:要赋值的上三角压缩矩阵
        (2)int input_value:要赋的值
        (3)int x:对应的横坐标
        (4)int y:对应的纵坐标
注 意: 下三角, 相当于整体赋值一个数,下三角则正常赋值
返回值: 无
**************************************************/
void Assign_triangular_matrix(int matrix[],int input_value,int x,int y)
{
    if(x <= y)
    {
        matrix[x*(2*max_wide-x+1)/2+y-x] = input_value;
    }
    else      //上三角整体赋值
    {
        matrix[max_wide*(max_wide+1)/2] = input_value;
    }
    return;
}
/**************************************************
函数名: Display_triangular_matrix
功  能: 输出展示上三角矩阵(调用取值函数)
参  数: int matrix[]:要展示的上三角矩阵
返回值: 无
**************************************************/
void Display_triangular_matrix(int matrix[])
{
    int i,j;
    for(i = 0; i<max_wide; i++)
    {
        for(j = 0; j<max_wide; j++)
        {
            printf("%5d",get_Value_triangular_matrix(matrix,i,j));
        }
        printf("\n\n");
    }
}
/**************************************************
函数名: Destroy_triangular_matrix
功  能: 销毁下三角矩阵的空间
参  数: int matrix[]:要销毁的压缩下三角矩阵
返回值: 无
**************************************************/
void Destroy_triangular_matrix(int matrix[])
{
    free(matrix);
}

main函数调用:

int main()
{
    int *matrix_test1;
    int line,row;//行,列
    int input_value;
    Init_triangular_matrix(matrix_test1);
    printf("\n请输入对称矩阵下三角常量:\n");
    scanf("%d",&input_value);
    matrix_test1[max_wide*(max_wide+1)/2] = input_value;
    printf("\n下面请输入对称矩阵上三角部分即可:\n");
    for(line = 0; line < max_wide; line++)
    {
        printf("\n请输入第%d行的%d个数据元素:\n",line+1,(max_wide-line));
        for(row = line; row < max_wide; row++)
        {
            scanf("%d",&input_value);
            Assign_triangular_matrix(matrix_test1,input_value,line,row);
        }
    }
    Display_triangular_matrix(matrix_test1);
    Destroy_triangular_matrix(matrix_test1);
    return 0;
}

完整代码main.cpp包含功能函数

#include <stdio.h>
#include <malloc.h>
#define max_wide 4

//为N阶上三角矩阵初始化成的一维数组分配空间
void Init_triangular_matrix(int *&matrix);
//返回二维上三角矩阵的值(压缩存取)
int get_Value_triangular_matrix(int matrix[],int x,int y);
//把值传进二维上三角矩阵矩阵(压缩存储)
void Assign_triangular_matrix(int matrix[],int input_value,int x,int y);
//输出展示压缩存储的上三角矩阵矩阵
void Display_triangular_matrix(int matrix[]);
//销毁上三角矩阵存储空间
void Destroy_triangular_matrix(int matrix[]);

/**************************************************
函数名: Init_triangular_matrix
功  能: 初始化上三角矩阵,为其分配存储空间
参  数: int *&matrix:给对应矩阵分配空间
返回值: 无
**************************************************/
void Init_triangular_matrix(int *&matrix)
{
    //给地址分配空间
    matrix = (int*)malloc(sizeof(int)*(max_wide*(max_wide+1)/2));
}
/**************************************************
函数名: get_Value_triangular_matrix
功  能: 得到上三角矩阵的值(因为是压缩存储,所以需要转换)
参  数: (1)int matrix[]:上三角矩阵矩阵存储数据的一维数组
        (2)int x:对应的横坐标
        (3)int y:纵坐标
返回值: int:对应坐标的值
**************************************************/
int get_Value_triangular_matrix(int matrix[],int x,int y)
{
    if(x <= y)
    {
        return matrix[x*(2*max_wide-x+1)/2+y-x];
    }
    else    //下三角,则直接返回末尾
    {
        return matrix[max_wide*(max_wide+1)/2];
    }
}
/**************************************************
函数名: Assign_triangular_matrix
功  能: 给压缩上三角矩阵赋值(和取值一样,也是通过一维数组转换)
参  数: (1)int matrix[]:要赋值的上三角压缩矩阵
        (2)int input_value:要赋的值
        (3)int x:对应的横坐标
        (4)int y:对应的纵坐标
注 意: 下三角, 相当于整体赋值一个数,下三角则正常赋值
返回值: 无
**************************************************/
void Assign_triangular_matrix(int matrix[],int input_value,int x,int y)
{
    if(x <= y)
    {
        matrix[x*(2*max_wide-x+1)/2+y-x] = input_value;
    }
    else      //上三角整体赋值
    {
        matrix[max_wide*(max_wide+1)/2] = input_value;
    }
    return;
}
/**************************************************
函数名: Display_triangular_matrix
功  能: 输出展示上三角矩阵(调用取值函数)
参  数: int matrix[]:要展示的上三角矩阵
返回值: 无
**************************************************/
void Display_triangular_matrix(int matrix[])
{
    int i,j;
    for(i = 0; i<max_wide; i++)
    {
        for(j = 0; j<max_wide; j++)
        {
            printf("%5d",get_Value_triangular_matrix(matrix,i,j));
        }
        printf("\n\n");
    }
}
/**************************************************
函数名: Destroy_triangular_matrix
功  能: 销毁下三角矩阵的空间
参  数: int matrix[]:要销毁的压缩下三角矩阵
返回值: 无
**************************************************/
void Destroy_triangular_matrix(int matrix[])
{
    free(matrix);
}


int main()
{
    int *matrix_test1;
    int line,row;//行,列
    int input_value;
    Init_triangular_matrix(matrix_test1);
    printf("\n请输入对称矩阵下三角常量:\n");
    scanf("%d",&input_value);
    matrix_test1[max_wide*(max_wide+1)/2] = input_value;
    printf("\n下面请输入对称矩阵上三角部分即可:\n");
    for(line = 0; line < max_wide; line++)
    {
        printf("\n请输入第%d行的%d个数据元素:\n",line+1,(max_wide-line));
        for(row = line; row < max_wide; row++)
        {
            scanf("%d",&input_value);
            Assign_triangular_matrix(matrix_test1,input_value,line,row);
        }
    }
    Display_triangular_matrix(matrix_test1);
    Destroy_triangular_matrix(matrix_test1);
    return 0;
}

运行展示:

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值