精华内容
下载资源
问答
  • 下三角矩阵的压缩存储

    千次阅读 2017-11-01 11:50:12
    输出原来的矩阵;输出压缩一维数组;根据输入行号列号,从压缩矩阵中计算出元素值 #include<stdio.h> int main(){ inta[5][5]={ //定义原二维数组 1,0, 0, 0, 0, 5,9, 0, 0, 0, 4,6,...

    输出原来的矩阵;输出压缩后的一维数组;根据输入的行号列号,从压缩矩阵中计算出元素的值

    #include<stdio.h>
    
    int main(){
    
           inta[5][5]={           //定义原二维数组
    
                  1,0, 0, 0, 0,
    
                  5,9, 0, 0, 0,
    
                  4,6, 8, 0, 0,
    
                  2,3, 44,55,0,
    
                  7,11,12,13,14
    
           };
    
           intb[30],x,y,k;
    
           printf("原二维数组:\n");    //输出原二维数组
    
       for(x=0;x<5;x++)
    
           {
    
                  for(y=0;y<5;y++)
    
                  {
    
                         printf("%d",a[x][y]);
    
                  }
    
                  printf("\n");
    
           }
    
           printf("压缩后的一维数组:\n");
    
           intt=0;              
    
       for(int i=0;i<5;i++)        //将二维数组中非0值压缩至一维数组中
    
           {
    
                  for(intj=0;j<5;j++)
    
                  {
    
                         if(i>=j)              //特殊矩阵,只压下三角的值
    
                         {
    
                                k=i*(i+1)/2+j;          //二维数组和一维数组中原值的对应关系
    
                                b[k]=a[i][j];   
    
                                t++;
    
                         }
    
                         else
    
                                b[15]=0;        
    
                  }
    
           }
    
           for(intl=0;l<t;l++)      //输出一维数组
    
           {
    
                  printf("%d",b[l]);
    
           }
    
           printf("\n");
    
       printf("输入要查询的行号 列号:");   //输出要查询的数据
    
       printf("\n");
    
           scanf("%d%d",&x,&y);
    
           printf("您查询的数据是:\n");
    
           if(x<y)         //如果上三角直接输出0
    
           printf("0\n");
    
           else           //下三角输出一维数组中对应的值
    
       printf("%d\n",b[(x-1)*(x)/2+y-1]);
    
           return0;
    
    }

     

    展开全文
  • c++实现下三角矩阵的压缩存储

    千次阅读 2015-04-04 19:52:48
    c++实现下三角矩阵的压缩存储

    下三角矩阵中任一元素在一维数组中的下标k与i,j的对应关系为:当i>=j,k=i*(i+1)/2+j;当i<j,k=n*(n+1)/2

    IDE为vs2013.

    // 2.5.4.1symmetry.cpp : 定义控制台应用程序的入口点。
    //下三角矩阵的压缩
    //下三角矩阵中任一元素在一维数组中的下标k与i,j的对应关系为:当i>=j,k=i*(i+1)/2+j;当i<j,k=n*(n+1)/2
    #include "stdafx.h"
    #include<iostream>
    using namespace std;
    const int N = 5;
    int _tmain(int argc, _TCHAR* argv[])
    {
    	int a[N][N] = { { 3, 0, 0, 0, 0 }, 
    							{ 6, 2, 0, 0, 0 },
    							{ 4, 8, 1, 0, 0 }, 
    							{ 7, 4, 6, 0, 0 }, 
    							{ 8, 2, 9, 5, 7 } };
    	int array[N * (N + 1) / 2+1] = { 0 };//将n*n个元素存储到n*(n+1)/2+1个长度的一维数组中
    	int i, j;
    	for (i = 0; i < N; i++)//输出矩阵
    	{
    		for (j = 0; j < N; j++)
    		{
    			cout << a[i][j] << " ";
    		}
    		cout << endl;
    	}
    	for (i = 0; i < N; i++)
    	{
    		for (j = 0; j <= i; j++)
    		{
    			array[i * (i + 1) / 2 + j] = a[i][j]; //存储下三角中的元素
    		}
    	}
    	array[N*(N + 1) / 2 ] = a[0][4];//存储对角线上方的常数
    	cout<<"请输入行号和列号:";
    	cin>>i>>j;
    	cout<<i<<"行"<<j<<"列的元素值是:";
    	if (i >= j)
    	{
    		cout<<array[i * (i + 1)/2 + j]<<endl;//输出下三角的元素
    	}
    	else
    	{
    		cout << array[N*(N + 1) / 2] << endl;//输出对角线上方的常量
    	}
    	system("pause");
    	return 0;
    }
    


    展开全文
  • 源代码:// 4_a1.cpp -- 下三角矩阵的压缩存储定义 /* * -> 题目要求: * 1.已知矩阵A[5][5]是一个下三角矩阵,如下图 * 1 0 0 0 0 * 4 7 0 0 0 * 6 9 5 0 0 * 1 8 4 1 0 * 2 3 0 9 6 * 2.要求...
      源代码:
    // 4_a1.cpp -- 下三角矩阵的压缩存储定义
    
    /* 
     * -> 题目要求:
     * 1.已知矩阵A[5][5]是一个下三角矩阵,如下图
     *   1 0 0 0 0
     *   4 7 0 0 0
     *   6 9 5 0 0
     *   1 8 4 1 0
     *   2 3 0 9 6
     * 2.要求编写算法把矩阵A采用压缩存储,存储到一维数组B[16]中;
     * 3.能依次输出B中各元素的值以验证该算法功能已实现。
     * 4.此题的源程序保存为4_a1.cpp。
     **/
    
    /*
     * -> 题目及相关知识点分析:
     * 1. 所用知识:本次题目,要求用到的知识有数组的定义和压缩存储的方法。
     * 2. 数组的定义:对于数组定义,实际上最原始的是将[n][n]的数组展开为一个n*n的一维数组。
     * 3. 数组的定义:如果想用更符合思路的定义,减少计算量,还可以使用嵌套存放数据的方式来定义二维数组,
     *                不过估计这样的效率不会很高,所以在各教材上才没有说。
     * 4. 压缩存储的思路:
     *    01.目的:实质上,题目就是要将a[5][5]每一个元素在b[16]中找到一个个相对应的元素;调用a[][],存放b[].
     *    02.需求:需要知道a[i][j]跟b[n]之间的逻辑关系;
     *    03.为什么题目给出16 ?  在a中,现在可以知道的是 0 < i <= 5, 0 < j <= 5;
     *    04. 下三角矩阵中,右上角的元素全为零,可以放在同一个地址中,这就是所谓的压缩了。
     *    05. 这样一来,5*5=25, 5*5/2+5/2+1=15个有元素的地址,再另加上一个存放0的地址,刚刚好,15+1=16。
     *    06. 我想,这就是为什么题目要求将a[5][5]存放在b[16]中的原因了。
     *    07. 注意,刚刚 5*5/2+5/2+1=15的原因是:
     *    08. 先计算5*5一共有多少个元素,再除以2,取得半个矩阵的个数,然后再加上5/2,获得左上角与右上角的连线的元素个数的一半,
     *        此时,在n为偶数的矩阵中,刚刚好可以计算出有元素的地址是多少。
     *        假如,n为奇数的矩阵,因为刚刚用了两次除以2的取整除法,都会有一个余数,最后一步+1实际上就是将两次余数0.5+0.5相加。
     *    09.矩阵中零元素的存放特性:可以看出,当i<j时,a[i][j]存放的就是零元素了,也就是说,这是判断存放时if-else里面的条件之一。
     *    10.矩阵中下三角元素的存放特性:
     *    11.b[k]-a[i][j], 0-[1][1], 1-[2][1], 2-[2][2], 3-[3][1], 4-[3][2], 5-[3][3], 6-[4][1], 7-[4][2], 8-[4][3], 9-[4][4]
     *       可以看出,在每一行中,当j从0递增到i时,即停止,进入i递增,实际上,我们要算出的就是从上面数下来,数了多少个数。
     *       先观察k与i的规律,可以看出,k = k-1+i,仔细列出表可以看出0+1+2+3+4+...i = k,即该式为一次方求和公式,i(i-1)/2,0<i<n
     *       以前数学没学好,费了N大的功夫,终于把一次方求和的公式推出来了,最后,只差一步,j,整个完整的公式就是i(i-1)/2+j-1
     *       晕:做数据结构的题目简直就是在做数学题目啊~
     *       附:一次方求和公式推导过程:1+2+3+...n = s, s = n(n-1)/2,图表  c = r = n
     *          数值:1 2 3 4 5 6,下面将数值以列的方式1+1+1=数值的方式排列出来
     *                1 1 1 1 1 1
     *                0 1 1 1 1 1
     *                0 0 1 1 1 1
     *                0 0 0 1 1 1
     *                0 0 0 0 1 1
     *                0 0 0 0 0 1
     *          假如将1加到6就是将第1列的1移到第5列中,第2列中的1移到第4列中,这样刚刚可以看出,在这个一矩阵中,6*6,
     *          而满1的位置刚刚占了整个矩阵的一半,跟刚刚所说的原理一样,6*6/2+(对角线)6/2=6*(6+1)/2, 即n(n+1)/2
     *          由于这时需要用到的情况是下标从零开始的,所以,n = n - 1, 式子就变为 (n-1)n/2,于是i(i-1)/2就出来啦。
     *    12.这样一来,总结一下下三角矩阵算法中b[k]与a[i][j]之间的关系:
     *       i >= j 时,k = i(i-1)/2 +j-1
     *       i < j  时,k = n-1最后一位存放0
     **/
    
    #include <iostream>
    using std::cin;
    using std::cout;
    using std::endl;
    
    class TwiArr
    {
    private:
    	double * ta;			// 存放顺序表的数组
    	int arrsize;			// 记录矩阵行列长度
    	int maxsize;			// 记录顺序表总长度
    	enum a{defaultsize = 5};// 默认矩阵行列长度
    	int leftsize;			// 记录现在的位置
    
    // 构造、析构
    	void init(int ms)
    	{
    		int judgejo(ms % 2);	// 用于判断奇偶
    		if (judgejo == 0)		// 偶数
    		{ 
    			maxsize = ms * ms / 2 + ms / 2;
    		}
    		else					// 奇数
    		{
    			maxsize = ms * ms / 2 + ms / 2 + 2;
    		}
    		ta = new double[maxsize];	// 将数组中的数将被初始化为零
    		for (int i = 0; i != maxsize; ++i)
    		{
    			ta[i] = 0;
    		}
    		arrsize = ms;
    		leftsize = 0;
    		return;
    	}
    	void removeall()
    	{
    		delete [] ta;
    		leftsize = 0;
    		maxsize = 0;
    		return;
    	}
    
    public:
    // 构造,析构
    	TwiArr(int ms = defaultsize){init(ms);}
    	~TwiArr(){removeall();}
    // 修改距阵中的值
    	void changeelem(const double &, int vi, int vj);
    // 显示距阵
    	void display();
    };
    
    /*
     * 函数名称:TwiArr::display
     * 函数功能:将两种形式显示TwiArr.ta里面的值。
     * 函数参数:无。
     */
    
    void TwiArr::display()
    {
    	cout << "-> 以下数组以b[k]的顺序显示:" << endl;
    	cout << "   ";
    	for (int i = 0; i != maxsize; ++i)
    	{
    		cout <<  ta[i];
    		if (i != maxsize - 1)
    			cout << " | ";
    		else 
    			cout << endl;
    	}
    	cout << endl;
    	cout << "-> 以下数组以a[i][j]的顺序显示:" << endl;
    	for (int i = 1; i <= arrsize; ++i)
    	{
    		cout << "    ";
    		for (int j = 1; j <= arrsize; ++j) 
    		{
    			if ( i < j)
    			{
    				cout << ta[(maxsize - 1)] ;
    			}
    			else
    			{
    				cout << ta[(i*(i-1)/2 + j-1)];
    			}
    			cout << "  ";
    		}
    		cout << endl;
    	}
    	return ;
    }
    
    /*
     * 函数名称:TwiArr::changeelem
     * 函数功能:将单个元素的值赋入TwiArr中的数据成员*ta里面存储。
     * 函数参数:该函数有三个形参,第一个为double形用于修改二维数组里面值的参数
     *           第二个与第三个为用于用户调用的二维数组的行与列。
     */
    void TwiArr::changeelem(const double & value,int vi, int vj)
    {	
    	if ( vi < vj)		// 因为这个为下三角矩阵,所以当vi<vj时,直接返回,如果程序再完善,这里还应出现错误信息。
    	{
    		return;
    	}
    	else
    	{
    		ta[(vi*(vi-1)/2 + vj-1)] = value;
    	}
    	return;
    }
    
    // --------------------------------------------------------- main start -----------------------------------------------
    
    int main()
    {
    	cout << "----------------------- 现在开始二维数组的顺序表测试 ---------------------------\n";
    	cout << " -> 刚开始测试时,未赋值的数组:\n\n";
    	TwiArr test;
    	test.display();
    	cout << endl;
    
    	cout << endl << " -> 现开始赋值后的测试:\n\n";
    	void giveValue(TwiArr &);
    	giveValue(test);
    	test.display();
    	system("pause");	
    	return 0;
    }
    
    void giveValue(TwiArr & test)
    {
    	/* 给二维数组初始化下面的值
    	 *   1 0 0 0 0
    	 *   4 7 0 0 0
    	 *   6 9 5 0 0
    	 *   1 8 4 1 0
         *   2 3 0 9 6
         */
    	test.changeelem(1, 1, 1);
    	test.changeelem(4, 2, 1);
    	test.changeelem(7, 2, 2);
    	test.changeelem(6, 3, 1);
    	test.changeelem(9, 3, 2);
    	test.changeelem(5, 3, 3);
    	test.changeelem(1, 4, 1);
    	test.changeelem(8, 4, 2);
    	test.changeelem(4, 4, 3);
    	test.changeelem(1, 4, 4);
    	test.changeelem(2, 5, 1);
    	test.changeelem(3, 5, 2);
    	test.changeelem(0, 5, 3);
    	test.changeelem(9, 5, 4);
    	test.changeelem(6, 5, 5);
    	return;
    }
    


    运行结果:

    ----------------------- 现在开始二维数组的顺序表测试 ---------------------------
    
     -> 刚开始测试时,未赋值的数组:
    
    -> 以下数组以b[k]的顺序显示:
       0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0
    
    -> 以下数组以a[i][j]的顺序显示:
        0  0  0  0  0
        0  0  0  0  0
        0  0  0  0  0
        0  0  0  0  0
        0  0  0  0  0
    
    
     -> 现开始赋值后的测试:
    
    -> 以下数组以b[k]的顺序显示:
       1 | 4 | 7 | 6 | 9 | 5 | 1 | 8 | 4 | 1 | 2 | 3 | 0 | 9 | 6 | 0
    
    -> 以下数组以a[i][j]的顺序显示:
        1  0  0  0  0
        4  7  0  0  0
        6  9  5  0  0
        1  8  4  1  0
        2  3  0  9  6
    请按任意键继续. . .


     

    展开全文
  • /* ...*All rights reserved. *文件名称:Annpion.cpp *作者:王耀鹏 ...*问题描述:下三角矩阵的压缩存储及基本运算 *输入描述:输入第n行的n个数 *输出描述:输出下三角矩阵 */ #include #include #define N 4 vo
    /*
    *Copyright (c) 2014,烟台大学计算机学院
    *All rights reserved.
    *文件名称:Annpion.cpp
    *作者:王耀鹏
    *完成日期:2015年12月16日
    *版本号:v1.0
    *
    *问题描述:下三角矩阵的压缩存储及基本运算
    *输入描述:输入第n行的n个数
    *输出描述:输出下三角矩阵
    */
    #include <stdio.h>
    #include <malloc.h>
    #define N 4
    void Init(int *&b)//为N阶对称矩阵初始化存储数据的一维数组B
    {
        b= (int *)malloc(sizeof(int )*(N*(N+1)/2+1));
    }
    int Value(int b[], int i, int j)//返回存储在b[M]中,对应二维数组A[i][j]的值
    {
        if(j>i)
            return 0;
        else
            return b[i*(i+1)/2+j];
    }
    void Assign(int b[], int e, int i, int j)//将e赋值给对应二维数组元素A[i][j],要存储到B[M]中
    {
        if(j>i)
            b[N*(N+1)/2]=e;
        else
            b[i*(i+1)/2+j]=e;
    }
    void Disp(int b[])//输出压缩存储在b中的对称矩阵
    {
        for(int i=0;i<N;++i)
        {
            for(int j=0;j<N;++j)
                printf("%4d",Value(b,i,j));
            printf("\n");
        }
    }
    void Destroy(int b[])//销毁存储空间
    {
        free(b);
    }
    int main()
    {
        int *b1;  //指向整型的指针,待初始化
        int i, j;
        int v;
        Init(b1);
        printf("请输入下三角矩阵(只需要输入下三角部分即可)\n");
        for(i=0;i<N;i++)
        {
            printf("输入第%d行的%d个数据元素: ", i+1, i+1);
            for(j=0; j<=i; j++)
            {
                 scanf("%d", &v);
                 Assign(b1, v, i, j);
            }
        }
        Disp(b1);
        Destroy(b1);
        return 0;
    }
    

    运行结果:


    展开全文
  • 数据结构--三角矩阵的压缩存储

    千次阅读 2020-01-19 13:56:47
    三角矩阵 三角矩阵的常用压缩方式有两种: 线性压缩 使用三角形的二维数组压缩 线性压缩存储三角矩阵 下三角矩阵: ...以下三角矩阵的线性压缩存储为例,进行实现: ... * 下三角矩阵线性压缩存储 */ public cl...
  • 返回目录:Chilan Yu:《数据结构》目录链接​zhuanlan.zhihu.com5.3.1 规律分布的特殊矩阵特殊矩阵压缩存储的压缩原则是:对有规律的元素和值相同的元素只分配一个存储单元,对于零元素不分配空间。1. 三角矩阵三角...
  • 一.三角矩阵的概念以主对角线划分三角矩阵有下三角矩阵和上三角矩阵下三角矩阵...压缩原理根据上、下三角矩阵的特殊性(有一小半部分的元素都为一个常数C或者0)我们可以考虑将这一半的空间压缩到一个元素(多对一的映...
  • 矩阵的压缩存储–特殊矩阵–三角矩阵三角矩阵大体分为三类:对称矩阵、下三角矩阵和上三角矩阵。#include #include #define N 100 int a[N][N], sa[2*N]; int main(void) { int i, j, k; int n, m; printf("请...
  • (1)稀疏矩阵的特点在一个m×n的矩阵中,设矩阵中有i个元素不为零,并令△=i/(m×n),称△为稀疏因子。通常当△≤0.05时。...(2)稀疏矩阵的压缩存储原理只存储非零元素ai,j和相应的行、列序号i、j...
  • 特殊矩阵的压缩存储

    2020-08-03 18:48:39
    一维数组的存储结构 二维数组的存储结构 行优先存储 列优先存储 对称矩阵的压缩存储 ...三角矩阵的压缩存储 下三角矩阵行优先 上三角矩阵行优先 三对角矩阵的压缩存储 稀疏矩阵的压缩存储 ...
  • 矩阵的压缩存储

    2021-04-06 19:39:34
    四、对称矩阵的压缩存储 压缩策略:只存储主对角线+下三角区 如何方便使用? 汇总 列优先 五、三角矩阵 下三角矩阵 压缩策略: 映射关系: 下三角矩阵 六、三对角矩阵的压缩存储 三对角矩阵又称带状矩阵 ...
  • 已知矩阵A[5][5]是一个下三角矩阵,如下图 要求编写算法把矩阵A采用压缩存储,存储到一维数组B[16]中, 并且依次输出B中各元素值以验证该算法功能已实现 */ #include using namespace std; const int m=5; const ...
  • 对称矩阵(1)特点矩阵中行数等于列数,即它是一个方阵,且第i行第j列的元素与第j行第i列的...对称矩阵(2)对称矩阵的压缩存储原理根据对称矩阵的特点(ai,j=aj,i),行数=列数,所以只要存储下三角部分的矩阵元素,其...
  • 数据结构----三角矩阵压缩存储中下标计算

    千次阅读 多人点赞 2019-01-07 13:07:06
    一.三角矩阵的概念 以主对角线划分三角矩阵有下三角矩阵和上三角矩阵 下三角矩阵:矩阵(除主对角线)的上...根据上、下三角矩阵的特殊性(有一小半部分的元素都为一个常数C或者0)我们可以考虑将这一半的空间压缩到一...
  • 对称矩阵:设一个N*N的方阵A,A中任意...以矩阵的对角线为分隔,分为上三角和下三角。如下面矩阵:对称矩阵压缩存储时只需要存储i*(i+1)/2个数据。对称矩阵与压缩矩阵的关系是:对称矩阵SymmetricMatrix[i][j] =压缩...
  • 特殊矩阵的压缩存储,包含对称矩阵,上下三角矩阵,对角矩阵,稀疏矩阵
  • 数据结构-二维数组-三角矩阵压缩存储

    万次阅读 多人点赞 2017-09-29 16:01:41
    数据结构-二维数组-三角矩阵压缩存储一、什么是三角矩阵前情提要三角矩阵也是属于一类特殊二维数组矩阵,同样也用压缩存储方式,能够更好节约存储空间,二维数组三角矩阵分为上三角矩阵和下三角矩阵,其实现...
  • /* ...*All right resvered . *文件名称: 对称矩阵压缩存储的实现与应用.cpp *作 者: 郑兆涵 ...问题:写出下三角矩阵的压缩存储结构,以及相关的基本运算的实现 程序代码: #include #include #defi
  • 对称矩阵的压缩存储

    千次阅读 2021-01-27 23:36:37
    主要分享对特殊矩阵中对称矩阵的压缩存储,如果其中有一些错误请多多包涵。 目录 1>什么是对称矩阵 2>压缩存储的必要性 3>分析步骤 4>代码实现 1>什么是对称矩阵 对称矩阵是一种特殊的矩阵:...
  • 对称矩阵、稀疏矩阵的压缩存储1)对称矩阵的压缩存储 对称矩阵顾名思义就是符合行和列的个数相同,并且矩阵中存储的数据上三角和下三角中对应位置上的元素值是相等的。为了能够减少存储的空间,我们可以只存储上三角...
  • 矩阵的压缩存储 压缩矩阵:为多个值相同的元素只分配一个存储空间,对零元素不分配存储空间。目的是节省存储空间 特殊矩阵:具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布有一定规律性的矩阵。...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 246
精华内容 98
关键字:

下三角矩阵的压缩存储