Este artigo estuda principalmente o conteúdo relacionado à maior submatriz nas matrizes de programação Java, conforme detalhado abaixo.
Encontrar uma boa pessoa pode mudar sua vida; Encontrar um bom livro, não é?
Recentemente, tive muitas idéias quando li " as soluções ideais para o algoritmo e a estrutura de dados do Sr. Recomenda -se que os blogueiros que tenham hobbies nessa área também façam assistir.
O algoritmo da maior matriz da matriz baseada em pilha explicada no livro é muito clássica, mas o blogueiro tem capacidade limitada e não conseguiu entender minuciosamente a essência do algoritmo. No entanto, com base nessa idéia, o blogueiro criou um algoritmo simples para lidar com esse tipo de problema, que está resumido da seguinte forma.
Ideia central
Vamos dar uma olhada em uma foto primeiro, e podemos entendê -la aproximadamente.
Como mostrado na figura, cada rodada é uma operação e nosso núcleo é a operação interna para cada rodada.
Calcule o comprimento máximo de cada camada continuamente e ininterrupta
Em outras palavras, somos a matriz mais importante para calcular as rodadas de baixo para cima e, em seguida, podemos calcular a área da submatriz máxima contínua que pode ser obtida nesta rodada para cada rodada. Em seguida, você só precisa comparar os maiores dados para cada rodada e retornar para encontrar a área da maior submatriz contínua da matriz.
Código
Ok, com as idéias principais acima estabelecidas, podemos começar a escrever código. (Embora eu não tenha dito isso com muita clareza, por favor me perdoe).
pacote pack_and_queue;/*** @author guo pu <br>* calcule a área da maior área de retângulo contínuo com base na matriz*/public class maxrectangle {public static void main (string [] args) {integer [] arr = {2, 1, 3, 5, 7, 6, 4} Integher main maxRectanGlearea (ARR); System.out.println ("A área da maior área de retângulo contínua da matriz é:" + maxRectangle);}/*** @param Arr* @RETURN A área máxima inteira do retângulo contínua [RESULTO [Integer [Interectlea] [integro) [integro) [integro) [integro) [integro) [integro) [integro) [integro) [integro) [integro) [integro [integração integrante Calcule a matriz percorrendo o comprimento contínuo de baixo para cima para (int i = 1; i <= arr.length; i ++) {// O valor temporário do comprimento contínuo acumulado na rodada atual é implementado intime e 0; a perda da parte anterior dos dados para (int j = 1; j <= arr.length; j ++) {if (arr [j - 1]> = i) {templen += 1; templen_max = templen;} else {templen = 0;}} Result [i - 1] = i * templen_Max; O comprimento ininterrupto da camada é: "+Templen_max);} // Encontre o número com o maior valor numérico na matriz do conjunto de resultados, ou seja, a área do maior domínio retangular na área de continuidade encontrada int mamarea = 0; para (int i = 0; resultado. resultado [i];} // retorna a área do campo de retângulo contínuo máximo obtido pelo retorno da maxaréia;}}Os comentários no código também são relativamente abrangentes, por isso não vou entrar em muitos detalhes.
teste
A seguir, é apresentado um teste da matriz. Primeiro, vamos testá -lo com a matriz mostrada na imagem no início deste artigo.
Inteiro [] arr = {2,1,3,5,7,6,4} ・・・・A área da maior área retangular contínua da matriz é: 16
Em seguida, modificamos os valores dos elementos na matriz para testar ainda mais se os resultados estão corretos.
Inteiro [] arr = {2,1,3,1,7,6,4} ・・・・A área da maior área retangular contínua da matriz é: 12
Depois que o próprio blogueiro testou, o algoritmo funciona normalmente. :)
Parte de otimização
Falando na parte de otimização, a primeira coisa que podemos ver é encontrar o valor máximo na matriz do conjunto de resultados na última etapa.
De fato, podemos realmente aplicar outra variável para registrar a área da maior submatriz da rodada até agora. No entanto, essa otimização não desempenha um grande papel e não há melhorias significativas na complexidade do tempo.
Outro ponto, acho que o melhor ponto de entrada é adicionar um julgamento ao realizar cálculos para cada rodada para decidir se o percorrer para baixo antes da rodada atual. Se os elementos da matriz flutuarem bastante, o nível de otimização ainda é muito bom.
Resumir
Esse pequeno algoritmo é mais requintado, e a única coisa mais falha é que a complexidade do tempo é um pouco mais intensa. Se os leitores estão procurando um algoritmo com uma complexidade relativamente baixa, faça um desvio.
É muito bom se você deseja apenas encontrar um resultado. Pelo menos é muito mais eficiente que o método violento de computação.
O exposto acima é todo o conteúdo deste artigo sobre a solução simples para a submatriz máxima nas matrizes de programação Java. Espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!