Java数据结构之对称矩阵的压缩算法---

特殊矩阵

特殊矩阵是指这样一类矩阵,其中有许多值相同的元素或有许多零元素,且值相同的元素或零元素的分布有一定规律。一般采用二维数组来存储矩阵元素。但是,对于特殊矩阵,可以通过找出矩阵中所有值相同元素的数学映射公式,只存储相同元素的一个副本,从而达到压缩存储数据量的目的。

特殊矩阵的压缩存储

只存储相同矩阵元素的一个副本。此种压缩存储方法是:找出特殊矩阵数据元素的分布规律,只存储相同矩阵元素的一个副本。

n阶对称矩阵的压缩存储对应关系

  aij=aji   1<=i<=n,1<=j<=n

 元素个数m = n*(n+1)/2

打印对称矩阵第i行,第j列的元素,与一维数组的下标关系为:

i*(i-1)/2+j-1  当i>=j

k=

j*(j-1)/2+i-1  当i<j

采用不等长的二维数组

Java语言支持不等长的二维数组,对于n阶对称矩阵,也可以通过只申请存储下三角(或上三角)矩阵元素所需的二维数组,来达到压缩存储的目的。

不等长的二维数组结构

 1 //对称矩阵的压缩算法
 2 public class SymeMatric {
 3
 4     double[] a;// 矩阵元素
 5     int n; // 矩阵的阶数
 6     int m;// 一维数组的元素的个数--长度
 7
 8     public SymeMatric(int n) {
 9         // 对称矩阵中不重复元素,保存到一维数组中所需要的一维数组的长度
10         // 2阶对称矩阵对应(1+2=3)维数组,3阶对称矩阵对应1+2+3=6维数组,
11         // 4阶对称矩阵对应1+2+3+4维数组,n阶对称矩阵对应前n项和,
12         // 所以一维数组的长度m的值为1,2,3...n的前n项和
13         m = n * (n + 1) / 2;
14         a = new double[m];
15         this.n = n;
16     }
17
18     // 通过一个二维数组来初始化
19     public void evalute(double[][] b) {
20         int k = 0;
21         for (int i = 0; i < n; i++) {
22             for (int j = 0; j < n; j++) {
23                 // i >= j表示只保存下三角元素
24                 if (i >= j) {
25                     a[k++] = b[i][j];
26                 }
27             }
28         }
29     }
30
31     // 通过一个一维数组来初始化,那么这个一维数组就是对称矩阵元素的一个副本
32     public void evalute(double[] b) {
33         for (int k = 0; k < m; k++) {
34             a[k] = b[k];
35         }
36     }
37
38     // 对称矩阵相加
39     public SymeMatric add(SymeMatric b) {
40         SymeMatric t = new SymeMatric(n);
41         int k;
42         for (int i = 1; i <= n; i++) {
43             for (int j = 1; j <= n; j++) {
44                 if (i >= j) {
45                     k = i * (i - 1) / 2 + j - 1;
46                 } else {
47                     k = j * (j - 1) / 2 + i - 1;
48                 }
49                 // 求和
50                 t.a[k] = a[k] + b.a[k];
51             }
52         }
53         return t;
54     }
55
56     // 打印对称矩阵,这个才是关键!!
57     public void print() {
58         int k;
59         for (int i = 1; i <= n; i++) {
60             for (int j = 1; j <= n; j++) {
61                 if (i >= j) {
62                     k = i * (i - 1) / 2 + j - 1;
63                 } else {
64                     k = j * (j - 1) / 2 + i - 1;
65                 }
66                 System.out.print(" " + a[k]);
67             }
68             System.out.println();
69         }
70     }
71
72 }
 1 public class Test {
 2     public static void main(String[] args) {
 3
 4         SymeMatric m1 = new SymeMatric(3);
 5         SymeMatric m2 = new SymeMatric(3);
 6         SymeMatric m3;
 7
 8         double[][] a = { { 1, 0, 0 }, { 2, 3, 0 }, { 4, 5, 6 } };
 9         double[] b= {1,2,3,4,5,6};
10
11         m1.evalute(a);
12         m2.evalute(b);
13
14         m1.print();
15         System.out.println();
16         System.out.println();
17         m2.print();
18     }
19 }
时间: 2024-10-07 14:08:03

Java数据结构之对称矩阵的压缩算法---的相关文章

Java数据结构之二叉搜索树

Java数据结构之二叉搜索树 1.二叉搜索树组成 二叉搜索树又称为二叉排序树,它或者是一颗空树,或者是一颗具有如下特性的非空二叉树,需要满足一下三个条件: (1)若它的左子树非空,则左子树上所有结点的关键字均小于根结点的关键字: (2)若它的右子树非空,则右子树上所有结点的关键字均大于(可以等于)根结点的关键字. (3)左子树右子树本身又各是一颗二叉搜索树 在算法描述中,均以结点值的比较来代表其关键字的比较,因为若结点的值为类类型时,该类必须实现系统提供的java.lang.comparable

Java数据结构和算法之递归

四.递归 递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面:   阶乘 在java当中的基本形式是: Public  void  mothed(int n){//当满足某条件时: Mothed(n‐1): } 递归二分查找 Java二分查找实现,欢迎大家提出交流意见.  /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: *     1.要求所查找的数组已有序,并且其中元素已实现Comparable<T>接口,如Integ

Java数据结构和算法(二)——数组

数组的用处是什么呢?--当你需要将30个数进行大小排列的时候,用数组这样的数据结构存储是个很好的选择,当你是一个班的班主任的时候,每次要记录那些学生的缺勤次数的时候,数组也是很有用.数组可以进行插入,删除,查找等. 1)创建和内存分配 Java中有两种数据类型,基本类型和对象类型,也有人称为引用类型,Java中把数组当成对象,创建数组时使用new操作符. int array[] = new int[10]; 既然是对象,那么array便是数组的一个引用,根据Java编程思想(一) -- 一切都是

Java数据结构与算法之集合

线性表.链表.哈希表是常用的数据结构,在进行Java开发时,SDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中. 一.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object.一些Collection允许相同元素而另一些不行.一些能排序而另一些不行.Java  SDK不提供直接继承自Collection的类,Java  SDK提供的类都是继承自Collection的"子接口"如List和Set

Java数据结构和算法之栈与队列

二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表. 栈的修改是按后进先出的原则进行. 每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除. 图1 [示例]元素是以a1,a2,-,a

Java数据结构和算法之数组与简单排序

一.数组于简单排序 数组 数组(array)是相同类型变量的集合,可以使用共同的名字引用它.数组可被定义为任何类型,可以是一维或多维.数组中的一个特别要素是通过下标来访问它.数组提供了一种将有联系的信息分组的便利方法. 一维数组 一维数组(one‐dimensional array )实质上是相同类型变量列表.要创建一个数组,你必须首先定义数组变量所需的类型.通用的一维数组的声明格式是: type var‐name[ ]; 获得一个数组需要2步: 第一步,你必须定义变量所需的类型. 第二步,你必

Java数据结构和算法之链表

三.链表 链结点 在链表中,每个数据项都被包含在'点"中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中都包含一个对下一个点引用的字段(通常叫做next)但是本身的对象中有一个字段指向对第一个链结点的引用. 单链表 用一组地址任意的存储单元存放线性表中的数据元素. 以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  = 结点(表示数据元素 或 数据元素的映象) 以"结点的序列&q

Java数据结构和算法之哈希表

五.哈希表 一般的线性表.树中,记录在结构中的相对位置是随机的即和记录的关键字之间不存在确定的关系,在结构中查找记录时需进行一系列和关键字的比较.这一类查找方法建立在"比较"的基础上,查找的效率与比较次数密切相关.理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应.因而查找时,只需根据这个对应关系f找到给定值K的像f(K).若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上,由此不需

java数据结构与算法之顺序表与链表深入分析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 ??数据结构与算法这门学科虽然在大学期间就已学习过了,但是到现在确实也忘了不少,因此最近又重新看了本书-<数据结构与算法分析>加上之前看的<java数据结构>也算是对数据结构的进一步深入学习了,于是也就打算