數組之特殊矩陣的壓縮儲存

數組是你們已經很熟悉的一種數據類型,幾乎全部的程序設計語言都把數組類型定爲固有類型,在這我就再也不介紹數組的基礎知識(如:定義等知識)了。下面咱們直接看矩陣的儲存,通常狀況下,矩陣使用二維數組儲存的,可是,對於數據量很是大的矩陣,這樣儲存就顯得乏力了,又浪費空間資源,下面咱們就看看有沒有更好的儲存方法呢。很明顯,咱們能夠用一位數組壓縮儲存有些矩陣,下面就來研究幾個特殊矩陣吧。ios

(1)對稱矩陣數組

若n階矩陣A中的元素知足下述性質:aij=aji   0<=i,j<=n-1則稱爲n階對稱矩陣。spa

很明顯,咱們只用爲每一對對稱元素分配一個儲存空間,則可將n2個元素壓縮儲存到n(n+1)/2個元的空間中。設計

假設以一維數組a[n(n+1)/2]做爲n階對稱矩陣的儲存結構,則a[k]與矩陣元素之間存在着一一對應的關係:當i>=j時,k=i*(i+1)/2+j;當i<j時,k=j*(j+1)+i;code

代碼以下:blog

 1 #include<iostream>
 2 #include<iomanip>
 3 using namespace std;
 4 int main()
 5 {
 6     while(1)
 7     {
 8         int n,a[1000];
 9     cin>>n;
10     cout<<"請輸入"<<n*(n+1)/2<<"個數:";
11     for(int i=0;i<n*(n+1)/2;i++)
12         cin>>a[i];
13     for(int i=0;i<n;i++)
14     {
15         for(int j=0;j<n;j++)
16         {
17             if(i>=j)
18                 cout<<setw(3)<<a[i*(i+1)/2+j]<<" ";
19             else
20                 cout<<setw(3)<<a[j*(j+1)/2+i]<<" ";
21         }
22         cout<<endl;
23     }
24     cout<<"節約"<<n*n-n*(n+1)/2<<"個空間."<<endl;
25     }
26 
27     return 0;
28 }

(2)上、下三角矩陣ip

所謂上、下三件矩陣是指矩陣上(下)三角(不包括對角線)中的元素均爲常數c或0的n階矩陣。則除了和對稱矩陣同樣,只儲存其下(上)三角中的元素以外,再加一個儲存常數c的儲存空間便可。ci

示例代碼以下:資源

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
    while(1)
    {
        int n,a[1000];
        cin>>n;
        cout<<"請輸入"<<n*(n+1)/2+1<<"個數:";
        for(int i=0;i<n*(n+1)/2+1;i++)
            cin>>a[i];
     //上三角
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(i<=j)
                cout<<setw(3)<<a[(2*n-i+1)*i/2+(j-i)]<<" ";
            else
                cout<<setw(3)<<a[n*(n+1)/2]<<" ";
        }
        cout<<endl;
    }
    cout<<"節約"<<n*n-n*(n+1)/2-1<<"個空間."<<endl;
    }
    //下三角
     /*for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(i>=j)
                cout<<setw(3)<<a[i*(i+1)/2+j]<<" ";
            else
                cout<<setw(3)<<a[n*(n+1)/2]<<" ";
        }
        cout<<endl;
    }*/
    return 0;
}

(3)對角矩陣(帶狀矩陣)it

對角矩陣是指全部的非0元素都集中在以主對角線爲中心的袋裝區域中,即除了主對角線上和直接在對角線上、下方若干條對角線上的元素以外,全部其餘的元素皆爲0。對角矩陣

假設對角矩陣的半寬爲d,則對於n階矩陣須要n*(2*d+1)-d*d-d+1個儲存空間,原理與上面的幾乎同樣,就不重複了,下面看實現代碼吧

#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{
    int n,d,a[100],m;
    cin>>n>>d;
    cout<<"請輸入"<<(n*(2*d+1)-d*d-d+1)<<"個數:";
    for(int i=0;i<n*(2*d+1)-d*d-d+1;i++)
        cin>>a[i];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(fabs(i-j)<=d)
                cout<<setw(3)<<a[(i*(2*d+1)-d)+(j-i+d)]<<" ";
            else
                cout<<setw(3)<<a[n*(2*d+1)-d*d-d]<<" ";
        }
        cout<<endl;
    }
    cout<<"節約"<<n*n-(n*(2*d+1)-d*d-d+1)<<"個空間."<<endl;
    return 0;
}

上面是比較簡單的矩陣壓縮儲存,更復雜的待續。。。。

相關文章
相關標籤/搜索