稀疏矩阵
来源:互联网 发布:MySQL concat array 编辑:程序博客网 时间:2024/05/29 07:34
有的时候我们需要将二维数组进行压缩, 实现资源的充分利用
比如: a[4][4]={
1, 2, 0, 0
4, 0, 0, 3
0, 5
};
数组为0的空间都是没有利用的, 所以就需要将为的地方进行压缩
功能实现查找, 转置
重要的代码都在下面, 注释也写了
声明如下:
#include <stdio.h>#include <stdlib.h>#include "稀疏矩阵-define-结构体.h"// 结构体 1 , 储存数组的位置以及数字struct Note{ ElemType num; // 两个用来储存行号和列号 int i_Note; int j_Note;};// 存储标号struct NUM{ // i_times用来储存二维数组每行所出现的次数 // i_num用来储存每行的第一个数在稀疏矩阵里的位置 int *i_times; int *i_num;};struct P_Note{ // 析构 ~P_Note() { delete[]P_NUM->i_num; delete[]P_NUM->i_times; delete P_NUM; delete[]a; } struct Note * a; struct NUM * P_NUM; // 储存数组的边界大小 int i_P_Note_Max; int j_P_Note_Max; // 储存非零的元素个数 int num;};// 构造void Creat(P_Note ¬e, int i_p, int j_p);// 创造稀疏矩阵, 对其进行初始化void Creat_P_Note(P_Note &, ElemType p[][N], int i_p, int j_p);// 进行转置void Transpose_P_Note(P_Note &, P_Note &);// 查找ElemType Find(P_Note &, int, int);// 计算标号void Count(P_Note &);// 输出void Print(P_Note &, int, int);
函数定义
#include "稀疏矩阵-声明-结构体.h"// 创造稀疏矩阵, 对其进行初始化void Creat_P_Note(P_Note ¬e, ElemType p[][N], int i_p, int j_p){ note.num = 0; // 计算元素除0的个数 for (int i = 0; i < i_p; i++) for (int j = 0; j < j_p; j++) if (p[i][j]) note.num++; Creat(note, i_p, j_p); int t = 0; // 将非0的元素储存起来 for(int i = 0; i < i_p; i++) for (int j = 0; j < j_p; j++) if (p[i][j]) { note.a[t].i_Note = i; note.a[t].j_Note = j; note.a[t].num = p[i][j]; t++; } Count(note);}// 构造void Creat(P_Note ¬e, int i_p, int j_p){ // 将数组全部进行初始化 note.P_NUM = new NUM; note.i_P_Note_Max = i_p; note.j_P_Note_Max = j_p; note.a = new Note[note.num]; note.P_NUM->i_num = new int[i_p](); note.P_NUM->i_times = new int[j_p]();}// 计算标号void Count(P_Note ¬e){ int t = note.i_P_Note_Max; int i; for (i = 0; i < t; i++) note.P_NUM->i_num[i] = 0; int t1 = note.num; for (i = 0; i < t1; i++) note.P_NUM->i_num[note.a[i].i_Note]++; note.P_NUM->i_times[0] = 0; for (i = 1; i < t; i++) note.P_NUM->i_times[i] = note.P_NUM->i_times[i - 1] + note.P_NUM->i_num[i - 1];}// 进行转置void Transpose_P_Note(P_Note ¬e, P_Note &Temp){ // 将两个数组变革进行创建 Temp.P_NUM = new NUM; Temp.i_P_Note_Max = note.j_P_Note_Max; Temp.j_P_Note_Max = note.i_P_Note_Max; Temp.a = new Note[note.num]; Temp.P_NUM->i_num = new int[note.j_P_Note_Max](); Temp.P_NUM->i_times = new int[note.j_P_Note_Max](); // 分别进行初始化 int t = note.j_P_Note_Max; int i, j; for (j = 0; j < t; j++) Temp.P_NUM->i_num[j] = 0; int num = note.num; for (j = 0; j < num; j++) Temp.P_NUM->i_num[note.a[j].j_Note]++; Temp.P_NUM->i_times[0] = 0; for (j = 1; j < t; j++) Temp.P_NUM->i_times[j] = Temp.P_NUM->i_times[j - 1] + Temp.P_NUM->i_num[j - 1]; // 实现转置 for (j = 0; j < num; j++) { t = Temp.P_NUM->i_times[note.a[j].j_Note]++; Temp.a[t].num = note.a[j].num; Temp.a[t].i_Note = note.a[j].j_Note; Temp.a[t].j_Note = note.a[j].i_Note; }}// 查找// 使用一次循环, 实现输出ElemType Find(P_Note ¬e, int i_note, int j_note){ int i_max = note.i_P_Note_Max; int j_max = note.j_P_Note_Max; if (i_max < i_note || i_note < 0 || j_note < 0 || j_note > j_max) exit(0); // 采用2个表格进行查找 int times = note.P_NUM->i_num[i_note]; int t = note.P_NUM->i_times[i_note]; int num; for (int i = 0; i < times; i++) { num = note.a[t].num; if (j_note == note.a[t++].j_Note) return num; } return 0;}// 二维数组的输出void Print(P_Note ¬e, int i_p, int j_p){ int t = 0; for (int i = 0; i < i_p; i++) { for (int j = 0; j < j_p; j++) if (i == note.a[t].i_Note && j == note.a[t].j_Note) printf("%d ", note.a[t++].num); else printf("0 "); printf("\n"); }}
define如下
#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define ElemType int#define ElemType_Ch chartypedef int* PElemType;const int N = 5;
阅读全文
0 0
- 稀疏矩阵
- 稀疏矩阵
- 稀疏矩阵
- 稀疏矩阵
- 稀疏矩阵
- 稀疏矩阵
- 稀疏矩阵
- 稀疏矩阵
- 稀疏矩阵
- 稀疏矩阵
- 稀疏矩阵
- 稀疏矩阵
- 稀疏矩阵
- 稀疏矩阵
- 稀疏矩阵
- 稀疏矩阵
- 稀疏矩阵
- 稀疏矩阵
- go语言中select与switch的区别
- 自顶向下 逐步求精
- First Missing Positive Leetcode
- 用Java生成随机检查作业的程序
- SqlServer邮件
- 稀疏矩阵
- React学习笔记
- SpringJdbcTemplate模板类使用小记
- [LeetCode] Longest Palindromic Substring
- 2017年年末目标
- maya(学习笔记)之Arnold渲染器二
- 高并发下的抽奖优化
- UVa1388
- Java应用debug功能