Este artigo descreve a definição e o uso da matriz esparsa das estruturas de dados Java. Compartilhe -o para sua referência, como segue:
Classe Triple para Matriz Sparse Elementos diferentes de zero:
pacote com.clarck.datastructure.matrix;/** * armazenamento compactado da matriz esparsa * * classe tripla de elementos diferentes de zero da matriz esparsa * * @author clarck * */public class de implementos triplos comparáveis <preple> {// número de linha, número da coluna, valor do elemento, o elemento, permissões de acesso a defensores, permissões public Triple (INT linha, coluna int, int valor) {if (linha <0 || coluna <0) {lança new ilegalargumentException ("o número de linhas/coluna de trigêmeos de elemento matricial esparso não é positivo"); } this.row = linha; this.colum = coluna; this.value = value; } / ** * Copie o construtor e copie um triplo * * @param elem * / public triple (triplo elem) {this (elem.row, elem.colum, elem.value); } @Override public string tostring () {return "(" + row + "," + coluna + "," + value + ")"; } /*** Os dois triplos são iguais? Compare os valores de posição e elemento*/ public boolean é igual a (object obj) {if (! (Obj instanceof triplo)) retornar false; Triplo elem = (triplo) obj; retornar this.row == elem.row && this.colum == elem.colum && this.value == elem.value; } /*** Compare os tamanhos de dois trigêmeos de acordo com a posição trigêmeo, independentemente do valor do elemento, e concorda com a ordem dos trigêmeos classificando* /@Override public int compareto (triple elem) {// o objeto Triplet atual é pequeno se (this.row <eMem.row | // igual, diferente do método igual se (this.row == elem.row && this.colum == elem.colum) retorna 0; // O objeto triplo atual é grande retorno 1; } / *** adição, += função do operador* @param termo* / public void add (triplo termo) {if (this.comPeto (termo) == 0) this.value += termo.value; Caso contrário, lançar novas itens ilegalArgumentException ("os expoentes dos dois itens são diferentes e não podem ser adicionados"); } /** * Convenção para excluir elementos * * @return * /public boolean removable () {// elementos não armazenados como 0 return this.value == 0; } / *** Retorne um triplo de um elemento da matriz de posição simétrica* @return* / public triple tosymmetry () {retorna novo triplo (this.colum, this.row, this.value); } / ** * Operação de adição, operador de sobrecarga + * @return * / public triple plus (termo triplo) {triplo tmp = novo triplo (this); tmp.add (termo); retornar tmp; }}Aulas de matriz esparsa armazenadas em ordem de triplicado:
pacote com.clarck.datastructure.matrix; importar com.clarck.datastructure.linear.seqlist;/** * armazenamento compactado de matriz esparsa * * matriz esparsa @author/matelaTring */public segreds seglors slows e a classe de reta -mater/atumsrix * */publicl Classtr seglored em uma ordem tripla * * @author/clarck */público linhas, colunas; // tabela de pedidos triplos da matriz esparsa / ** * Construa linhas linhas, colunas coluna zero matriz * * @param linhas * @param colunas */ public seqsparsematrix (int linhas, int colunas) {if (linhas <= 0 || colunas <= 0) lança um novo ilegalArgumentException ("o número de rodovias ou colunas de colunas de colunas de matrix que não é o número de robinas ou colunas de mata. this.rows = linhas; this.columns = colunas; // Construa uma tabela de pedidos vazia e execute o construtor seqlist () this.list = new seqlist <Triple> (); } public seqsparsematrix (int linhas, colunas int, triplo [] elems) {this (linhas, colunas); // Insira um triplo de um elemento na ordem principal para (int i = 0; i <elems.length; i ++) this.set (elems [i]); } / ** * Retorne o elemento J-TH da coluna da linha e coluna da matriz, o algoritmo de pesquisa de pedidos da tabela de pedidos de classificação, o (n) * * @param i * @param j * @return * / public int (int i, int j) {if (i <0 || i> = linhas | O elemento matricial sai dos limites "); Item triplo = novo triplo (i, j, 0); int k = 0; Triplo elem = this.list.get (k); // Encontre objetos do item na lista de pedidos de classificação While (k <this.list.length () && item.compareto (elem)> = 0) {// compara apenas as posições dos elementos triplos, ou seja, elem.row == i && elem.column == j if (item.compareto (elem) == 0) // encontre (i, j), retorna o elemento da matriz k ++; elem = this.list.get (k); } retornar 0; } / ** * Defina o elemento matricial com triplo * @param elem * / public void set (triple elem) {this.set (elem.row, elem.colum, elem.value); } / ** * Defina o valor do elemento da coluna da coluna da matriz para valorizar, alterar ou inserir um triplo de um elemento na lista de pedidos de classificação na ordem principal das linhas da matriz, o (n) * * @param linha * @param column * @param value * / public void set (int line, int (int) {0. if (linha> = this.Rows || coluna> = this.columns) lança nova ilegalArgumentException ("a linha ou o número de triplos dos limites"); Triplo elem = novo triplo (linha, coluna, valor); int i = 0; // Encontre o objeto Elem na tabela de pedidos triplos classificados, ou altere ou insira while (i <this.list.length ()) {triplo item = this.list.get (i); // Se elem existir, altere o elemento da matriz de posição if (elem.compareto (item) == 0) {// Defina o elemento i-é retornar; } // Ande para trás quando elem é grande (elem.compareto (item)> = 0) i ++; mais quebrar; } this.list.insert (i, elem); } @Override public string tostring () {string str = "Tabela de pedidos triplos:" + this.list.toString () + "/n"; str + = "matriz esparsa" + this.getclass (). getSImpleName () + "(" + linhas + " *" + colunas + "): /n"; int k = 0; // Retorna o elemento K-és, se o número de sequência especificado por K for inválido, ele retorna nulo triplo elem = this.list.get (k ++); para (int i = 0; i <this.rows; i ++) {for (int j = 0; j <this.columns; j ++) if (elem! elem = this.list.get (k ++); } else {str += string.format ("%4d", 0); } str += "/n"; } retornar str; } / ** * Retorne a matriz em que a matriz atual é adicionada ao smat, smatc = this+smat, não altera a matriz atual, o algoritmo adiciona a dois polinômios * * @param smat * @return * / public seqsParSematrix mais (seqsParSematrix Smatrat) {if (ift.Sans! Smat.Columns) Jogue nova ilegalArgumentException ("as duas matrizes têm ordens diferentes e não podem ser adicionadas"); // construir linhas*colunas zero matriz seqsparsematrix smartc = new seqsparseMatrix (this.rows, this.columns); int i = 0, j = 0; // atravessa a tabela de pedidos das duas matrizes, respectivamente, enquanto (i <this.List.Length () && j <smart.list.length ()) {triple elema = this.list.get (i); Triplo elemb = smart.list.get (j); // Se dois triplos representam elementos da matriz na mesma posição, os valores de elemento correspondentes são adicionados se (elema.compareto (eleMB) == 0) {// O resultado da adição não é zero, então um novo elemento é criado se (neema.value + eleMb.value! = 0) smart.list.append (newemMeema.r) elemb.value)); i ++; j ++; } else if (elema.compareto (elemb) <0) {// Adicione a cópia tripla menor ao último da tabela de pedidos smatc // copie o elemento Elema para executar o método do construtor de copiar triplo Smartc.List.Append (novo triplo (elema)); i ++; } else {smartc.list.append (novo triplo (elemb)); j ++; }} // Adicione a cópia tripla restante da tabela de pedidos da matriz atual ao último da tabela de pedidos SMATC enquanto (i <this.list.length ()) smartc.list.append (new triple (this.list.get.get (i ++))); // Adicione a cópia tripla restante em Smart ao último da tabela de pedidos smatc while (j <smartc.list.length ()) {triple elem = smat.list.get (j ++); if (elem! = null) {smatc.list.append (novo triplo (elem)); }} retornar smartc; } / ** * A matriz atual é adicionada à matriz smat, este+= smat, altere a matriz atual e o algoritmo adiciona os dois polinômios * * @param smat * / public void add (seqsparsematrix smat) {if (this.rows! IlegalargumentException ("as duas matrizes têm ordens diferentes e não podem ser adicionadas"); int i = 0, j = 0; // inserir (ou adicione) cada trigêmeo de tapete na tabela de pedidos de trigêmeos da matriz atual enquanto (i <this.list.length () && j <smat.list.length ()) {triple elema = this.list.get (i); Triplo elemb = smart.list.get (j); // Se dois trigêmeos representam elementos da matriz na mesma posição, os valores de elemento correspondentes serão adicionados se (elema.compareto (eleMB) == 0) {// O resultado da adição não é 0, então um novo elemento é criado se (eleMa.Vleue +ELemb.value! = 0) this.list.set.. elemb.value)); caso contrário, this.List.Remove (i); j ++; } else if (elema.compareto (elemb) <0) {// Continue procurando o elemento de inserção do elemento elex i ++; } else {// copie o elemento elemb para inserir o elemento ITH como this.list.insert (i ++, novo triplo (elemb)); j ++; }} // Copie os triplos restantes no MAT na tabela de pedidos de triplos da matriz atual enquanto (j <smat.list.length ()) {this.list.append (new triple (smat.list.get (j ++))); }} // cópia profunda seqsparsematrix (seqsparsematrix smat) {this (smat.rows, smat.columns); // Crie uma tabela de pedidos vazia, capacidade padrão this.List = new seqlist <Triple> (); // copie todos os objetos triplos em smat para (int i = 0; i <smat.list.length (); i ++) this.list.append (novo triplo (smat.list.get (i))); } / *** Compare se duas matrizes são iguais* / public boolean equals (objeto obj) {if (this == obj) retorna true; if (! (OBJ Instância de seqsparseMatrix)) retornar false; SEQSPARSEMATRIX SMAT = (SEQSPARSEMATRIX) OBJ; Retorne this.Rows == SMAT.ROWS && this.columns == Smat.Columns && this.list.equals (smat.list); } /*** Retorne a matriz transposta* @return* /public seqsparsematrix transpose () {// Construa uma matriz zero, especifique o número de linhas e colunas seqsparsematrix trans = novo seqsparseMatrix (colunas, linhas); for (int i = 0; i <this.List.Length (); i ++) {// insira o triplo trans.set (this.list.get (i) .tosymmetry ()); } retornar trans; }}Classe de teste:
pacote com.clarck.datastructure.matrix;/** * armazenamento comprimido de matriz esparsa * * Matriz esparsa Tabela de pedidos triplos * * matriz esparsa representada por tabela de pedidos triplos e suas operações de adição [Public) (public @Author Clarck * */public class SeqsSemematrix_test [public vorn Voin Vorn. Triplo (0, 2, 11), novo triplo (0, 4, 17), novo triplo (1, 1, 20), novo triplo (3, 0, 19), novo triplo (3, 5, 28), novo triplo (4, 4, 50)}; Seqsparsematrix smata = novo seqsparsematrix (5, 6, elemsa); System.out.print ("a" + smata.toString ()); Triplo [] elemsb = {novo triplo (0, 2, -11), novo triplo (0, 4, -17), novo triplo (2, 3, 51), novo triplo (3, 0, 10), novo triplo (4, 5, 99), novo triplo (1, 0)}; Seqsparsematrix smatb = novo 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 = novo 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 ()); }}Resultados em execução:
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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1, 20), (2, 3, 51), (3, 0, 29), (3, 5, 28). triple order 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 0 0 0 0 0 0 0 0 0 0 0 4, 50), (5, 3, 28), (5, 4, 99)) Matriz esparsa seqsparsematrix (6 * 5): 0 0 0 29 0 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 0 0 0
Para obter mais informações sobre os algoritmos Java, os leitores interessados neste site podem visualizar os tópicos: "Estrutura de dados Java e tutorial de algoritmo", "Resumo das dicas de nó da operação Java Dom", "Resumo de dicas de operação de Java e Operação de Java" e "Resumo de Java cache" Tips "TIPS"
Espero que este artigo seja útil para a programação Java de todos.