Melhor desempenho durante varredura de matriz 3D

4 respostas
G

Boa tarde, senhores.

Estou com uma dúvida aqui, preocupado com desempenho e entendimento de código.

Tenho uma matriz de três dimensões do tipo 10x10x10 Preciso percorre-la até encontrar um determinado valor, depois disso anoto em que posição se encontrava e paro a varredura. Como tenho três laços, um dentro do outro, pois estou varrendo uma matriz a solução não fica nada elegante, pois um break não pararia todos os laços, apenas o último, o mais interno neste caso. A melhor opção seria usar condições, se ainda não encontrou o arquivo, continuar a procura logo após cada for. Por exemplo.

//Matriz preenchida com 1(uns)
        matrix3D[8][8][9] = 0;
        int posicaok = 0;
        for (int i = 0; i < 10; i++){
        if (posicaok != 0){
              break;
        }
            for (int j = 0; j < 10; j++){
            if (posicaok != 0){
                  break;
            }
                for (int k = 0; k < 10; k++){
                    if (matrix3D[i][j][k] == 0){
                        System.out.println("posicao: " + i + j + k);
                        posicaok = k;
                        break;
                    }
                }
            }
        }

Nada elegante, dai pensei em usar while:

//Parando
        posicaok = 0;
        int i = 0,
            j = 0,
            k = 0;
        do{
            if (k == 9) {
                j++;
                k = -1;
            }
            if (j == 10) {
                i++;
                j = 0;
            }
            k++;
        }while((i < 10) && (matrix3D[i][j][k] != 0));
        posicaok = k;
        System.out.println("posicaok = " + posicaok);

Preciso ainda testar qual das duas tem o melhor desempenho, acredito que a segunda, porém o código não está muito legível. Gostaria da opinião de vocês quanto aos métodos e se alguém teria uma melhor sugestão. Não testei a fundo ambos os métodos, então talvez tenha problemas de implementação. Só os fiz para ilustrar melhor meu problema.

Abraços.

Jorge

4 Respostas

ViniGodoy

Um break não… mas que tal um return? Você ainda poderia usar um labeled break, mas acho que um return é mais elegante:

public void encontrarPosicoes(int valor) { for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) { for (int k = 0; k < matrix[i][j].length; k++) { if (matrix[i][j][k] == valor) { System.out.printf("Posição %i %i %i %n", i, j, k); return; } } } } }

B

De qualquer maneira (nem estou vendo o que você quer fazer), você pode usar um “labeled break” para sair de uma determinada quantidade de loops (o “break” normal só sai do mais interno).

M

Com o label ficaria assim:

loop:
for (int i = 0; i < matrix.length; i++) {
      for (int j = 0; j < matrix[i].length; j++) {
         for (int k = 0; k < matrix[i][j].length; k++) {
             if (matrix[i][j][k] == valor) {
               System.out.printf("Posição %i %i %i %n", i, j, k);
               break loop;
             }
         }
      }
}
G

Obrigado a todos pelas respostas, vou verificar qual deles tem o melhor desempenho, pois isso é minha preocupação inicial, desconhecia a opção de labeled break e achei interessante, talvez venha a utiliza-la, pois estou convertendo um software de fortran para java e creio que acabei usando em algumas ocasiões.

Por enquanto ficarei com a solução do Vinigodoy, pois acabará facilitando a documentação.

Abraços.

Criado 2 de dezembro de 2009
Ultima resposta 2 de dez. de 2009
Respostas 4
Participantes 4