博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构--三角矩阵的压缩存储
阅读量:2445 次
发布时间:2019-05-10

本文共 8306 字,大约阅读时间需要 27 分钟。

三角矩阵

在这里插入图片描述

三角矩阵的常用压缩方式有两种:

  • 线性压缩
  • 使用三角形的二维数组压缩

线性压缩存储三角矩阵

下三角矩阵:

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
上三角矩阵:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以下三角矩阵的线性压缩存储为例,进行实现:

package pers.zhang.array;/** * @author zhang * @date 2020/1/19 - 13:34 * * 下三角矩阵线性压缩存储 */public class DownTriangleMatrix {
//下三角矩阵的阶数 private int rows; //存储矩阵元素的一维数组 private int element[]; //构造rows阶下三角矩阵 public DownTriangleMatrix(int rows){
if(rows <= 0) throw new IllegalArgumentException("矩阵行数非正数:" + rows); this.rows = rows; //rows阶下三角矩阵需要存储rows*(rows+1)/2个元素 this.element = new int[rows * (rows + 1) / 2]; } //构造rows阶下三角矩阵,初值由mat提供,mat按行主序顺序存储rows阶下三角矩阵元素 public DownTriangleMatrix(int rows, int mat[]){
this(rows); int n = element.length <= mat.length ? element.length : mat.length; for (int i = 0; i < n; i++)//mat元素不足时补0,忽略多余元素 this.element[i] = mat[i]; } //深拷贝 public DownTriangleMatrix(DownTriangleMatrix mat){
this(mat.rows, mat.element); } //返回矩阵第i行第j列元素值,O(1) public int get(int i, int j) {
if (i < 0 || i >= rows || j < 0 || j >= rows) throw new IndexOutOfBoundsException("矩阵元素的行或列序号越界"); return i < j ? 0 : element[i * (i + 1) / 2 + j];//按线性压缩存储地址寻找矩阵元素 } //设置矩阵第i行第j列元素值为value,O(1) public void set(int i, int j, int value){
if (i < 0 || i >= rows || j < 0 || j >= rows) throw new IndexOutOfBoundsException("矩阵元素的行或列序号越界"); this.element[i * (i + 1) / 2 + j] = value; } //返回下三角矩阵所有元素的描述字符串,行主序遍历 public String toString(){
String str =" 下三角矩阵" + this.getClass().getName() + "(" + this.rows + "阶):\n"; for (int i = 0; i < this.rows; i++){
for (int j = 0; j < this.rows; j++) str += String.format("%4d", this.get(i,j)); str += "\n"; } return str; } //当前下三角矩阵与mat矩阵相加,this+=mat,各对应元素相加,改变当前矩阵 public void add(DownTriangleMatrix mat){
if (this.rows != mat.rows) throw new IllegalArgumentException("两个矩阵阶数不同,不能相加"); for (int i = 0; i < this.element.length; i++) this.element[i] += mat.element[i]; } //返回当前矩阵与mat相加后的矩阵,=this+mat,各对应元素相加,不改变当前矩阵 public DownTriangleMatrix plus(DownTriangleMatrix mat){
DownTriangleMatrix matc = new DownTriangleMatrix(this);//深拷贝 matc.add(mat); return matc; //返回对象引用 } //比较两个同阶矩阵是否相等 public boolean equals(Object obj){
if (this == obj) return true; if (!(obj instanceof DownTriangleMatrix)) return false; DownTriangleMatrix mat=(DownTriangleMatrix)obj; if (this.rows != mat.rows) return false; for (int i = 0; i < this.element.length; i++) if (this.element[i] != mat.element[i]) //比较对应元素是否相等 return false; return true; }}

测试:

package pers.zhang.array;/** * @author zhang * @date 2020/1/19 - 14:00 */public class DownTriangleMatrix_ex {
public static void main(String args[]) {
int m1[]={
1,2,3,4,5,6,7,8,9,10,11,12}; DownTriangleMatrix mata=new DownTriangleMatrix(4,m1); //忽略m1多余元素 System.out.print("A"+mata.toString()); int m2[]={
1,0,1,0,0,1}; DownTriangleMatrix matb=new DownTriangleMatrix(4,m2); //m2元素不足时补0 matb.set(3,3,1); System.out.print("B"+matb.toString()); DownTriangleMatrix matc = mata.plus(matb); System.out.print("C=A+B"+mata.plus(matb).toString()); mata.add(matb); System.out.println("A+=B"+mata.toString()); System.out.println("C.equals(A)?"+matc.equals(mata)); }}/*A 下三角矩阵pers.zhang.array.DownTriangleMatrix(4阶): 1 0 0 0 2 3 0 0 4 5 6 0 7 8 9 10B 下三角矩阵pers.zhang.array.DownTriangleMatrix(4阶): 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1C=A+B 下三角矩阵pers.zhang.array.DownTriangleMatrix(4阶): 2 0 0 0 2 4 0 0 4 5 7 0 7 8 9 11A+=B 下三角矩阵pers.zhang.array.DownTriangleMatrix(4阶): 2 0 0 0 2 4 0 0 4 5 7 0 7 8 9 11C.equals(A)?true */

使用三角形的二维数组压缩存储三角矩阵

下三角矩阵:

在这里插入图片描述

上三角矩阵:

在这里插入图片描述

实现:

package pers.zhang.array;/** * @author zhang * @date 2020/1/19 - 14:17 * * 三角矩阵的二维数组压缩存储 */public class TriangleMatrix {
//上或下三角矩阵标识 private boolean up; //三角形的二维数组存储矩阵非零元素 private int element[][]; //构造rows阶零矩阵,up为true时上三角矩阵 public TriangleMatrix(int rows, boolean up){
this.up = up; this.element = new int[rows][];//若rows<0,Java将抛出负数组长度异常NegativeArraySizeException if (up)//上三角矩阵 for (int i = 0; i< this.element.length; i++) this.element[i] = new int[rows-i];//数组元素初值为0 else //下三角矩阵 for (int i = 0; i < this.element.length; i++) this.element[i] = new int[i+1]; } //构造rows阶矩阵,由二维数组mat提供元素 public TriangleMatrix(int rows, boolean up, int mat[][]){
this(rows, up); for (int i = 0; i < mat.length && i < this.element.length; i++) //mat元素不足时补0,忽略多余元素 for (int j = 0; j < mat[i].length && j < this.element[i].length; j++) this.element[i][j] = mat[i][j]; } //深拷贝 public TriangleMatrix(TriangleMatrix mat){
this(mat.element.length, mat.up, mat.element); } //返回矩阵第i行第j列元素值,O(1) public int get(int i, int j){
if (up) return i>j ? 0 : this.element[i][j-i]; else return i

测试:

package pers.zhang.array;/** * @author zhang * @date 2020/1/19 - 15:54 */public class TriangleMatrix_ex {
public static void main(String args[]) {
int m1[][]={
{
1,2,3,4},{
5,6,7},{
8,9},{
10}}; TriangleMatrix mata=new TriangleMatrix(4,true,m1); //矩阵对象,初值不足时自动补0,忽略多余元素 System.out.print("A"+mata.toString()); TriangleMatrix matb=new TriangleMatrix(4,true); matb.set(0,0,1); matb.set(0,3,1); matb.set(1,1,1); matb.set(3,3,1); System.out.print("B"+matb.toString()); TriangleMatrix matc = mata.plus(matb); System.out.print("C=A+B"+matc.toString()); mata.add(matb); System.out.print("A+=B"+mata.toString()); System.out.println("C.equals(A)?"+matc.equals(mata)); int m2[][]={
{
1},{
2,3},{
4,5,6},{
7,8,9,10}}; TriangleMatrix matd=new TriangleMatrix(4,false,m2); //矩阵对象,初值不足时自动补0,忽略多余元素 System.out.print("\nD"+matd.toString()); TriangleMatrix mate=new TriangleMatrix(4,false); mate.set(0,0,1); mate.set(1,1,1); mate.set(3,0,1); mate.set(3,3,1); System.out.print("E"+mate.toString()); TriangleMatrix matf = matd.plus(mate); System.out.print("F=D+E"+matf.toString()); matd.add(mate); System.out.print("D+=E"+matd.toString()); System.out.println("F.equals(D)?"+matc.equals(mata)); System.out.println("B.equals(E)?"+matb.equals(mate)+"\n"); TriangleMatrix matg = matb.transpose(); System.out.print("B的转置矩阵G"+matg.toString()); System.out.println("G.equals(E)?"+matg.equals(mate)+"\n"); TriangleMatrix math = mate.transpose(); System.out.print("E的转置矩阵H"+math.toString()); System.out.println("H.equals(B)?"+math.equals(matb)); }}/*程序运行结果如下:A TriangleMatrix(4阶): 1 2 3 4 0 5 6 7 0 0 8 9 0 0 0 10B TriangleMatrix(4阶): 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1C=A+B TriangleMatrix(4阶): 2 2 3 5 0 6 6 7 0 0 8 9 0 0 0 11A+=B TriangleMatrix(4阶): 2 2 3 5 0 6 6 7 0 0 8 9 0 0 0 11C.equals(A)?trueD TriangleMatrix(4阶): 1 0 0 0 2 3 0 0 4 5 6 0 7 8 9 10E TriangleMatrix(4阶): 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1F=D+E TriangleMatrix(4阶): 2 0 0 0 2 4 0 0 4 5 6 0 8 8 9 11D+=E TriangleMatrix(4阶): 2 0 0 0 2 4 0 0 4 5 6 0 8 8 9 11F.equals(D)?trueB.equals(E)?falseB的转置矩阵G TriangleMatrix(4阶): 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1G.equals(E)?trueE的转置矩阵H TriangleMatrix(4阶): 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1H.equals(B)?true*/

转载地址:http://rypqb.baihongyu.com/

你可能感兴趣的文章
apache 证书配置_Apache配置错误AH02572:无法配置至少一个证书和密钥
查看>>
web设置字体粗细css_Web上使用CSS的可变字体
查看>>
css 垂直对齐_CSS垂直对齐属性
查看>>
为您的网站提供动力的100种Jamstack工具,API和服务
查看>>
api restful_构建RESTful API的13种最佳实践
查看>>
wordpress用途_8个热门WordPress多用途主题及其炫酷功能
查看>>
用于Angular,React和Vue.js的Bootstrap UI库
查看>>
使用MongoDB Stitch在10分钟内构建一个Slack应用
查看>>
struts2 css失效_CSS体系结构和可维护CSS的三大Struts
查看>>
php使用nginx建网站_如何使用预建网站来刷新网站的外观
查看>>
使用React和PHP开发游戏:它们的兼容性如何?
查看>>
哈巴狗入门指南
查看>>
js设置css自定义变量_CSS变量实用指南(自定义属性)
查看>>
http建立个人服务器工具_建立网站和页面的最佳7种工具
查看>>
前端框架浏览器兼容解决方案_前端框架:定制与即用型解决方案
查看>>
驯服Snoo:使用Reddit API
查看>>
php页面不渲染显示源代码_PHP如何执行-从源代码到渲染
查看>>
Sourcehunt 17.1:值得关注的7个有趣PHP软件包
查看>>
使用转发装饰器实现模块化架构
查看>>
旅行者 问题_旅行者-管理员UI可以使Laravel更加平易近人吗?
查看>>