Java数据结构之稀疏矩阵定义与用法示例
本文实例讲述了Java数据结构之稀疏矩阵定义与用法。分享给大家供大家参考,具体如下:
稀疏矩阵非零元素的三元组类:
packagecom.clarck.datastructure.matrix; /** *稀疏矩阵的压缩存储 * *稀疏矩阵非零元素的三元组类 * *@authorclarck * */ publicclassTripleimplementsComparable{ //行号,列号,元素值,默认访问权限 introw,colum,value; publicTriple(introw,intcolum,intvalue){ if(row<0||colum<0){ thrownewIllegalArgumentException("稀疏矩阵元素三元组的行/列序号非正数"); } this.row=row; this.colum=colum; this.value=value; } /** *拷贝构造方法,复制一个三元组 * *@paramelem */ publicTriple(Tripleelem){ this(elem.row,elem.colum,elem.value); } @Override publicStringtoString(){ return"("+row+","+colum+","+value+")"; } /** *两个三元组是否相等,比较位置和元素值 */ publicbooleanequals(Objectobj){ if(!(objinstanceofTriple)) returnfalse; Tripleelem=(Triple)obj; returnthis.row==elem.row&&this.colum==elem.colum &&this.value==elem.value; } /** *根据三元组位置比较两个三元组的大小,与元素值无关,约定三元组排序次序 */ @Override publicintcompareTo(Tripleelem){ //当前三元组对象小 if(this.row 三元组顺序存储的稀疏矩阵类:
packagecom.clarck.datastructure.matrix; importcom.clarck.datastructure.linear.SeqList; /** *稀疏矩阵的压缩存储 * *稀疏矩阵三元组顺序表 * *三元组顺序存储的稀疏矩阵类 * *@authorclarck * */ publicclassSeqSparseMatrix{ //矩阵行数、列数 privateintrows,columns; //稀疏矩阵三元组顺序表 privateSeqListlist; /** *构造rows行,colums列零矩阵 * *@paramrows *@paramcolumns */ publicSeqSparseMatrix(introws,intcolumns){ if(rows<=0||columns<=0) thrownewIllegalArgumentException("矩阵行数或列数为非正数"); this.rows=rows; this.columns=columns; //构造空顺序表,执行SeqList()构造方法 this.list=newSeqList (); } publicSeqSparseMatrix(introws,intcolumns,Triple[]elems){ this(rows,columns); //按行主序插入一个元素的三元组 for(inti=0;i =rows||j<0||j>=columns) thrownewIndexOutOfBoundsException("矩阵元素的行或列序号越界"); Tripleitem=newTriple(i,j,0); intk=0; Tripleelem=this.list.get(k); //在排序顺序表list中顺序查找item对象 while(k =0){ //只比较三元组元素位置,即elem.row==i&&elem.column==j if(item.compareTo(elem)==0) returnelem.value; //查找到(i,j),返回矩阵元素 k++; elem=this.list.get(k); } return0; } /** *以三元组设置矩阵元素 * *@paramelem */ publicvoidset(Tripleelem){ this.set(elem.row,elem.colum,elem.value); } /** *设置矩阵第row行第column列的元素值为value,按行主序在排序顺序表list中更改或插入一个元素的三元组,O(n) * *@paramrow *@paramcolumn *@paramvalue */ publicvoidset(introw,intcolumn,intvalue){ //不存储值为0元素 if(value==0) return; if(row>=this.rows||column>=this.columns) thrownewIllegalArgumentException("三元组的行或列序号越界"); Tripleelem=newTriple(row,column,value); inti=0; //在排序的三元组顺序表中查找elem对象,或更改或插入 while(i =0) i++; else break; } this.list.insert(i,elem); } @Override publicStringtoString(){ Stringstr="三元组顺序表:"+this.list.toString()+"\n"; str+="稀疏矩阵"+this.getClass().getSimpleName()+"("+rows+"*" +columns+"):\n"; intk=0; //返回第k个元素,若k指定序号无效则返回null Tripleelem=this.list.get(k++); for(inti=0;i (); //复制smat中所有三元组对象 for(inti=0;i 测试类:
packagecom.clarck.datastructure.matrix; /** *稀疏矩阵的压缩存储 * *稀疏矩阵三元组顺序表 * *三元组顺序表表示的稀疏矩阵及其加法运算 * *@authorclarck * */ publicclassSeqSparseMatrix_test{ publicstaticvoidmain(Stringargs[]){ Triple[]elemsa={newTriple(0,2,11),newTriple(0,4,17), newTriple(1,1,20),newTriple(3,0,19), newTriple(3,5,28),newTriple(4,4,50)}; SeqSparseMatrixsmata=newSeqSparseMatrix(5,6,elemsa); System.out.print("A"+smata.toString()); Triple[]elemsb={newTriple(0,2,-11),newTriple(0,4,-17), newTriple(2,3,51),newTriple(3,0,10), newTriple(4,5,99),newTriple(1,1,0)}; SeqSparseMatrixsmatb=newSeqSparseMatrix(5,6,elemsb); System.out.print("B"+smatb.toString()); SeqSparseMatrixsmatc=smata.plus(smatb); System.out.print("C=A+B"+smatc.toString()); System.out.println(); smata.add(smatb); System.out.print("A+=B"+smata.toString()); System.out.println("C.equals(A)?"+smatc.equals(smata)); SeqSparseMatrixsmatd=newSeqSparseMatrix(smatb); smatb.set(0,2,1); System.out.print("B"+smatb.toString()); System.out.print("D"+smatd.toString()); System.out.println("A转置"+smata.transpose().toString()); } }运行结果:
A三元组顺序表:((0,2,11),(0,4,17),(1,1,20),(3,0,19),(3,5,28),(4,4,50)) 稀疏矩阵SeqSparseMatrix(5*6): 00110170 0200000 000000 19000028 0000500 B三元组顺序表:((0,2,-11),(0,4,-17),(2,3,51),(3,0,10),(4,5,99)) 稀疏矩阵SeqSparseMatrix(5*6): 00-110-170 000000 0005100 1000000 0000099 C=A+B三元组顺序表:((1,1,20),(2,3,51),(3,0,29),(3,5,28),(4,4,50),(4,5,99)) 稀疏矩阵SeqSparseMatrix(5*6): 000000 0200000 0005100 29000028 00005099 A+=B三元组顺序表:((1,1,20),(2,3,51),(3,0,29),(3,5,28),(4,4,50),(4,5,99)) 稀疏矩阵SeqSparseMatrix(5*6): 000000 0200000 0005100 29000028 00005099 C.equals(A)?true B三元组顺序表:((0,2,1),(0,4,-17),(2,3,51),(3,0,10),(4,5,99)) 稀疏矩阵SeqSparseMatrix(5*6): 0010-170 000000 0005100 1000000 0000099 D三元组顺序表:((0,2,-11),(0,4,-17),(2,3,51),(3,0,10),(4,5,99)) 稀疏矩阵SeqSparseMatrix(5*6): 00-110-170 000000 0005100 1000000 0000099 A转置三元组顺序表:((0,3,29),(1,1,20),(3,2,51),(4,4,50),(5,3,28),(5,4,99)) 稀疏矩阵SeqSparseMatrix(6*5): 000290 020000 00000 005100 000050 0002899更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。