이 기사에서는 Java 데이터 구조의 희소 행렬의 정의 및 사용에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
희소 행렬이 아닌 요소에 대한 트리플 클래스 :
패키지 com.clarck.datrastructure.matrix;/** * 스파 스 매트릭스의 압축 저장 * * 스파 스 매트릭스의 트리플 클래스 트리플 클래스 * @author clarck * */public class triple empless <triple> {// 행 번호, 열 번호, 요소 값, 기본 액세스 허가, 열, 값; public triple (int row, int column, int value) {if (row <0 || 열 <0) {throw new neveralargumentException ( "스파 스 유사 매트릭스 요소 트리플렛의 행/열 번호"); } this.row = 행; this.colum = 열; this.value = value; } / ** * 생성자를 복사하고 트리플 * * @param elem * / public triple (트리플 elem) {this (elem.row, elem.colum, elem.value); } @override public String toString () {return "(" + row + "," + column + "," + value + "); } /*** 두 트리플이 같습니까? 위치와 요소 값*/ public boolean equals (Object obj) {if (! (obj instance of triple)) false를 반환합니다. 트리플 elem = (트리플) obj; 이 this.row == elem.row && this.colum == elem.colum && this.value == elem.value; } /*** 요소 값에 관계없이 삼중 항 위치에 따라 두 트리플렛의 크기를 비교하고 트리플릿 분류 순서* /@override public int compareto (트리플 elem) {// 현재 트리플렛 객체는 작은 if (this.row <elem.row == elem.row && this.colum) return -colum); // (this.row == elem.row && this.colum == elem.colum) if equals 메소드와 다릅니다. 반환 0; // 현재 트리플 객체는 큰 리턴 1; } / *** 추가, += 운영자 함수* @param term* / public void add (트리플 term) {if (this.compareto (term) == 0) this.value += term.value; 그렇지 않으면 새로운 불법 행위 지출 ( "두 항목의 지수는 다르고 추가 할 수 없습니다"); } /** * 요소를 삭제하는 규칙 * * @return * /public boolean removable () {// 요소가 0으로 저장되지 않은 요소 is.value == 0; } / *** 대칭 위치 행렬 요소의 트리플을 반환합니다. @return* / public triple toSymmetry () {return new Triple (this.colum, this.row, this.value); } / ** * 추가 작업, 과부하 연산자 + * @return * / public triple plus (트리플 용어) {트리플 TMP = New Triple (this); tmp.add (용어); 반환 TMP; }}Sparse Matrix 클래스는 3 회 순서로 저장됩니다.
패키지 com.clarck.dattructure.matrix; import com.clarck.datrastructure.linear.seqlist;/** * 압축 스토리지 * * Sparse Matrix Triple Order Table * * @Author Clarck * */컬럼 및 컬럼에 저장된 스파 스 매트릭스 클래스. 열; // 스파스 매트릭스 트리플 오더 테이블 개인 seqlist <triple> 목록; / ** * 행을 구축, 열 열 매트릭스 * @param 줄 * @param 열 */ public seqsparsematrix (int rows, int columns) {if (rows <= 0 || 열 <= 0) 새로운 불법 자법 ( "매트릭스의 숫자 수 또는 열 수는 대체적이지 않음"); this.rows = 행; this.columns = 열; // 빈 순서 테이블을 작성하고 seqList () 생성자 this.list = new SeqList <Triple> (); } public seqsparsematrix (int rows, int columns, triple [] elems) {this (행, 열); // (int i = 0; i <elems.length; i ++) this.set (elems [i]); } / ** * 매트릭스 행 및 열의 J-th 열 요소, 정렬 순서 테이블의 순서 검색 알고리즘, o (n) * * @param i * @param j * @return * / public int get (int i, int j) {if (i <0 || i> = j <0 || j> = 컬럼) 경계를 벗어납니다 "); 트리플 항목 = 새로운 트리플 (i, j, 0); int k = 0; 트리플 elem = this.list.get (k); // 정렬 순서 목록에서 항목 객체를 찾으십시오 (k <this.list.list.list () && item.compareto (elem)> = 0) {// 트리플 요소의 위치 만 비교합니다. // find (i, j), 리턴 행렬 요소 k ++; elem = this.list.get (k); } 반환 0; } / ** * Triple * @param elem * / public void set (triple elem) {this.set (elem.row, elem.colum, elem.value); } / ** * 행렬 열의 열의 요소 값을 값으로 설정, 변경 또는 매트릭스 행의 주 순서에서 O (n) * * @param row * @param value * / public void set (int row, int column, int value)의 요소의 트리플을 값으로 변경하거나 삽입하십시오. if (row> = this.rows || column> = this.columns) 새로운 불법 행위 ( "경계에서 트리플의 행 또는 열 번호"); 트리플 elem = 새로운 트리플 (행, 열, 값); int i = 0; // 정렬 된 트리플 순서 테이블에서 elem 객체를 찾거나 변경 또는 삽입 중 (i <this.list.length ()) {트리플 항목 = this.list.get (i); // elem이 존재하는 경우 위치 행렬 요소를 변경하면 (elem.compareto (item) == 0) {// 주문 테이블의 i-th 요소를 this.list.set (i, elem)에 elem으로 설정하십시오. 반품; } // Elem이 큰 경우 뒤로 걸어가십시오 (Elem.comPareto (Item)> = 0) i ++; 다른 휴식; } this.list.insert (i, elem); } @override public String toString () {String str = "트리플 오더 테이블 :" + this.list.toString () + "/n"; str + = "sparse matrix" + this.getClass (). getSimplename () + "(" + rows + " *" + columns + ") : /n"; int k = 0; // k-th 요소를 반환합니다. K-ST 요소가 유효하지 않은 경우 NULL TRIPLE ELEM = this.list.get (k ++)를 반환합니다. for (int i = 0; i <this.rows; i ++) {for (int j = 0; elem = this.list.get (k ++); } else {str += string.format ( "%4d", 0); } str += "/n"; } return str; } / ** * 현재 행렬이 smat에 추가되는 행렬을 반환합니다. smat.columns) 새로운 불법 행위 exception을 던지십시오 ( "두 행렬은 다른 명령을 가지고 있으며 추가 할 수 없습니다"); // 구조 행*열 제로 매트릭스 SEQSPARSEMATRIX SMARTC = NEW SEQSPARSEMATRIX (this.rows, this.columns); int i = 0, j = 0; // 두 행렬의 순서 테이블을 각각 가로 지르십시오. 트리플 elemb = smart.list.get (j); // 두 트리플이 동일한 위치에서 매트릭스 요소를 나타내는 경우 (ELEMA.comPareto (elemb) == 0) {// 추가 결과는 0이 아닌 경우 (ELEMA.VALUE + ELEMB.VALUE! = 0) SMARTC.LIST.APPEND (New Triple (Elema.Row, ELEMA, ELEMA. elemb.value); i ++; J ++; } else if (elema.compareto (elemb) <0) {// 작은 트리플 사본을 SMATC 순서 테이블의 마지막 트리플 사본을 추가하여 Elema 요소를 복사하여 트리플 사본 생성자 메서드 SmartC.list.Append (new Triple (ELEMA))를 실행합니다. i ++; } else {smartc.list.append (New Triple (ELEMB)); J ++; }} // 현재 행렬 주문 테이블의 나머지 트리플 사본을 SMATC 주문 테이블의 마지막 트리플 사본 (i <this.list.length ()) smartc.list.append (new Triple (this.list.get (i ++))); // SMATC 주문 테이블의 마지막 The Smatc 순서 테이블에 나머지 트리플 사본을 추가하십시오 (J <SmartC.list.length ()) {Triple Elem = smat.list.get (j ++); if (elem! = null) {smatc.list.append (New Triple (elem)); }} return smartc; } / ** * 현재 행렬은 SMAT 행렬에 추가됩니다.이+= SMAT, 현재 행렬을 변경하며 알고리즘은 두 개의 다항식을 추가합니다 * * @Param Smat * / public void add (seqsparsematrix smat) {if (this.rows! = smat.rows! 불법적 인 관계 ( "두 행렬은 다른 순서가 있고 추가 될 수 없다"); int i = 0, j = 0; // 현재 매트릭스 트리플렛 주문 테이블에 매트의 각 트리플렛을 삽입 (또는 추가) (i <this.list.length () && j <smat.list.list.list ()) {트리플 ELEMA = this.list.get (i); 트리플 elemb = smart.list.get (j); // 두 트리플렛이 같은 위치에서 매트릭스 요소를 나타내는 경우 해당 요소 값이 추가됩니다. elemb.value); else this.list.remove (i); J ++; } else if (elema.compareto (elemb) <0) {// ELEMB 요소 I ++의 삽입 요소를 계속 찾으십시오. } else {// elemb 요소를 복사하여 ith 요소를 this.list.insert (i ++, new Triple (elemb))로 삽입합니다. J ++; }} // 나머지 트리플을 MAT의 현재 매트릭스 트리플렛 주문 테이블에 복사하는 동안 (j <smat.list.length ()) {this.list.append (new Triple (smat.list.get (j ++))); }} // 딥 카피 공개 seqsparsematrix (seqsparsematrix smat) {this (smat.rows, smat.columns); // 빈 순서 테이블, 기본 용량을 작성하십시오 .list = new seqlist <triple> (); // smat에있는 모든 트리플 객체를 (int i = 0; i <smat.list.length (); i ++) this.list.append (new Triple (smat.list.get (i))); } / *** 두 행렬이 동일한지* / public boolean Equals (Object obj) {if (this == obj) true; if (! seqsparsematrix smat = (seqsparsematrix) obj; 이 this.rows == smat.rows && this.columns == smat.columns && this.list.equals (smat.list); } /*** return transpose matrix* @return* /public seqsparsematrix transpose () {// 제로 행렬을 작성하고 행의 수와 열을 지정합니다. for (int i = 0; i <this.list.length (); i ++) {// 트리플 트랜스. 세트 삽입 (this.list.get (i) .tosymmetry ()); } 반환 트랜스; }}테스트 클래스 :
패키지 com.clarck.datarscructure.matrix;/** * 스파 스 매트릭스의 압축 저장 * * 스파 스 매트릭스 트리플 오더 테이블 * * 트리플 오더 테이블과 그 추가 작업으로 표시되는 스파 스 매트릭스 * * @author clarck * */public class seqsparsematrix_test {public void main [] {triple []) {triple []) {triple []) 트리플 (0, 2, 11), New Triple (0, 4, 17), New Triple (1, 1, 20), New Triple (3, 0, 19), New Triple (3, 5, 28), New Triple (4, 4, 50)}; seqsparsematrix smata = 새로운 seqsparsematrix (5, 6, Elemsa); System.out.print ( "a" + smata.toString ()); Triple [] Elemsb = {New Triple (0, 2, -11), New Triple (0, 4, -17), New Triple (2, 3, 51), New Triple (3, 0, 10), New Triple (4, 5, 99), New Triple (1, 1, 0)}; seqsparsematrix smatb = 새로운 seqsparsematrix (5,6, elemsb); System.out.print ( "B" + smatb.toString ()); seqsparsematrix smatc = 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)); seqsparsematrix smatd = 새로운 seqsparsematrix (smatb); smatb.set (0,2,1); System.out.print ( "B" + smatb.toString ()); System.out.print ( "d" + smatd.toString ()); System.out.println ( "a transpose" + smata.transpose (). toString ()); }}실행 결과 :
A Triple order table: ((0, 2, 11), (0, 4, 17), (1, 1, 20), (3, 0, 19), (3, 5, 28), (4, 4, 50)) Sparse matrix SeqSparseMatrix(5 * 6): 0 0 11 0 17 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 0 0 0 0 0 0 0 28 0 0 0 0 0 0 50 0B Triple order table: ((0, 2, -11), (0, 4, -17), (2, 3, 51), (3, 0, 10), (4, 5, 99))Sparse Matrix SeqSparseMatrix(5 * 6): 0 0 -11 0 -17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9A+= B TRIP 테이블 : 20), (2, 3, 51), (3, 0, 29), (3, 5, 28), (4, 4, 50), (4, 5, 99)) Sparse Matrix Seqsparsematrix (5 * 6) : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 51 0 0 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.). table: ((0, 2, 1), (0, 4, -17), (2, 3, 51), (3, 0, 10), (4, 5, 99))Sparse Matrix SeqSparseMatrix(5 * 6): 0 0 1 0 -17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 99A 전위 트리플 주문 테이블 : (0, 3, 29), (3, 4, 4, 4, 4) (5, 3, 28), (5, 4, 99)) Sparse Matrix Seqsparsematrix (6 * 5) : 0 0 0 29 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 99
Java 알고리즘에 대한 자세한 내용은이 사이트에 관심이있는 독자들이 주제를 볼 수 있습니다. "Java 데이터 구조 및 알고리즘 자습서", "Java Operation Dom Node Tips 요약", "Java 파일 및 디렉토리 작동 팁 요약"및 "Java Cache Operation Tips의 요약"을 볼 수 있습니다.
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.