1. 程式人生 > >對稱矩陣壓縮和三種解壓縮方式

對稱矩陣壓縮和三種解壓縮方式

#include<iostream>
#include<stdio.h>
#include<math.h>
#define SIZE 5
using namespace std;

int* Compress(int *m) {
    int*n = (int*)malloc(sizeof(int)*(SIZE*(SIZE+1)/2));
    int i = 0;
    int j = 0;
    int k = 0;
    for (i = 0; i < SIZE; i++) {
        for (j = 0; j < SIZE; j++, k++) {
            if
(i >= j)k = i*(i + 1) / 2 + j; else k = j*(j + 1) / 2 + i; n[k] = m[i*SIZE+j]; } } return n; } int* Decompress1(int* n) { int * m = (int*)malloc(sizeof(int)*SIZE*SIZE); int i = 0; int j = 0; int k = 0; for (i = 0; i < SIZE; i++) { for
(j = 0; j <= i; j++) { if (i >= j)k = i*(i + 1) / 2 + j ; else k = j*(j + 1) / 2 + i; m[j*SIZE+i] = m[i*SIZE+j] = n[k]; } } return (int*)m; } int * Decompress2(int* n) { int * m = (int*)malloc(sizeof(int)*SIZE*SIZE); int i = 0; int j = 0
; int k = 0; for (k = 0; k < (SIZE*(SIZE + 1) / 2); k++) { for (i = 0; (i + 1)*(i + 2) / 2 < k + 1; i++); j = k - i*(i + 1) / 2; m[j*SIZE+i] = m[i*SIZE + j] = n[k]; } return m; } int * Decompress3(int * n) { int * m = (int*)malloc(sizeof(int)*SIZE*SIZE); int i = 0; int j = 0; int k = 0; for (k = 0; k < (SIZE)*(SIZE + 1) / 2; k++) { i =ceil( sqrt(2*k*1.0 + 2.25) - 1.5); j = k - i*(i + 1) / 2; m[j*SIZE + i] = m[i*SIZE + j] = n[k]; } return m; } int main() { int p[SIZE][SIZE] = { 1,5,1,3,7,5,0,8,0,0,1,8,9,2,6,3,0,2,5,1,7,0,6,1,3}; printf("壓縮前:\n"); for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) printf("%d ", p[i][j]); printf("\n"); } int* p1 = Compress((int*)p); printf("壓縮後:\n"); for (int i = 0; i < (SIZE*(SIZE + 1) / 2); i++)printf("%d ", p1[i]); printf("\n"); printf("解壓前:\n"); for (int i = 0; i < (SIZE*(SIZE + 1) / 2); i++)printf("%d ", p1[i]); printf("\n"); printf("解壓後:\n"); int* p2 = Decompress1((int*)p1); for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) printf("%d ", p2[i*SIZE+j]); printf("\n"); } printf("解壓後:\n"); p2 = Decompress2((int*)p1); for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) printf("%d ", p2[i*SIZE + j]); printf("\n"); } printf("解壓後:\n"); p2 = Decompress3((int*)p1); for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) printf("%d ", p2[i*SIZE + j]); printf("\n"); } }