Java数据结构之对称矩阵的压缩算法---
aij=aji 1<=i<=n,1<=j<=n
元素个数m = n*(n+1)/2
i*(i-1)/2+j-1 当i>=j
k=
j*(j-1)/2+i-1 当i<j
//对称矩阵的压缩算法
public class SymeMatric { double[] a;// 矩阵元素
int n; // 矩阵的阶数
int m;// 一维数组的元素的个数--长度 public SymeMatric(int n) {
// 对称矩阵中不重复元素,保存到一维数组中所需要的一维数组的长度
// 2阶对称矩阵对应(1+2=3)维数组,3阶对称矩阵对应1+2+3=6维数组,
// 4阶对称矩阵对应1+2+3+4维数组,n阶对称矩阵对应前n项和,
// 所以一维数组的长度m的值为1,2,3...n的前n项和
m = n * (n + 1) / 2;
a = new double[m];
this.n = n;
} // 通过一个二维数组来初始化
public void evalute(double[][] b) {
int k = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// i >= j表示只保存下三角元素
if (i >= j) {
a[k++] = b[i][j];
}
}
}
} // 通过一个一维数组来初始化,那么这个一维数组就是对称矩阵元素的一个副本
public void evalute(double[] b) {
for (int k = 0; k < m; k++) {
a[k] = b[k];
}
} // 对称矩阵相加
public SymeMatric add(SymeMatric b) {
SymeMatric t = new SymeMatric(n);
int k;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i >= j) {
k = i * (i - 1) / 2 + j - 1;
} else {
k = j * (j - 1) / 2 + i - 1;
}
// 求和
t.a[k] = a[k] + b.a[k];
}
}
return t;
} // 打印对称矩阵,这个才是关键!!
public void print() {
int k;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i >= j) {
k = i * (i - 1) / 2 + j - 1;
} else {
k = j * (j - 1) / 2 + i - 1;
}
System.out.print(" " + a[k]);
}
System.out.println();
}
} }
public class Test {
public static void main(String[] args) {
SymeMatric m1 = new SymeMatric(3);
SymeMatric m2 = new SymeMatric(3);
SymeMatric m3;
double[][] a = { { 1, 0, 0 }, { 2, 3, 0 }, { 4, 5, 6 } };
double[] b= {1,2,3,4,5,6};
m1.evalute(a);
m2.evalute(b);
m1.print();
System.out.println();
System.out.println();
m2.print();
}
}
Java数据结构之对称矩阵的压缩算法---的更多相关文章
- java数据结构至对称矩阵压缩存储
刚刚刷java选择题,遇到的对称矩阵压缩存储问题,我们知道对称矩阵是aij=aji的矩阵,压缩存储可以采用一维数组和二维数组存储. 此处只讨论一维数组存储的形式,设数组下标从0开始,对称矩阵为n维矩阵 ...
- Java数据结构和算法 - 二叉树
前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树 ...
- Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用
Java数据结构之---Queue队列 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在 ...
- JAVA数据结构系列 栈
java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...
- Java数据结构之树和二叉树(2)
从这里始将要继续进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来 ...
- Java数据结构之树和二叉树
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
- Java数据结构之线性表(2)
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
- Java数据结构之线性表
从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...
- java 数据结构 图
以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客,主要是在自己理解的基础上进行记录. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示 ...
随机推荐
- vim操作
2.vi的基本操作 a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(comm ...
- C++强制类型转换
C语言强制类型转换过于粗暴,任意类型之间都可以进行转换,编译很难判断其正确性; 难于定位,在源码中无法快速定位所有使用强制类型转换的语句. C++将强制类型转换分为4种不同的类型:static_cas ...
- Spring 000 框架简介 (转载)
转载自:https://my.oschina.net/myriads/blog/37922 1.使用框架的意义与Spring的主要内容 随着软件结构的日益庞大,软件模块化趋势出现,软件开发也需要多人合 ...
- Android高级之十二讲之如何降低应用内存消耗
安卓应用的内存往往是有限的,从开始的8M到16M,24M,32M,48M,64M等逐步变大,但内存的变大是由于分辨率的提高导致,并不意味着可以随意声明使用内存,而不及时回收(即使Java有自己的垃圾回 ...
- Nginx配置加入css缓存配置后,css等文件not found
现在配置: location / { root /root/html/product; } Probably another block had definition for the static f ...
- ubuntu不能正常登录
在ubuntu登录界面,输入密码后,出现一个界面后一闪而过又返回登录界面.查看auth.log发现如下错误 May 15 15:42:19 tim-vm lightdm: pam_unix(light ...
- C语言如何开发简单的插件
linux 通过dlopen来实现: #include "polygon.h" #include <stdlib.h> #include <dlfcn.h> ...
- 如何设置jvm内存
本文向大家简单介绍一下进行JVM内存设置几种方法,安装Java开发软件时,默认安装包含两个文件夹,一个JDK(Java开发工具箱),一个JRE(Java运行环境,内含JVM),其中JDK内另含一个JR ...
- simple_tag,filte,分页以及cookie和装饰器
自定义simple_tag 内置的方法 首先Django中包含了很多内置的方法: 这里通过lower实现 在views视图函数中写如下代码: def tp3(request): name= " ...
- .NET编译项目时出现《此实现不是 Windows 平台 FIPS 验证的加密算法的一部分》处理方法
有用户提出在编译代码时出现源文件“D:\.......ervice.cs”未能打开(“此实现不是 Windows 平台 FIPS 验证的加密算法的一部分.”)的问题,如下图所示: 对于上面的问题,只需 ...