Monday 24 July 2017

Fila Média Móvel Java


Se o desempenho deste código é crítico, então pode fazer sentido evitar alocações de heap para Candle s. Eu acho que a maneira mais razoável de fazer isso seria fazer Candle em uma estrutura. Embora os tipos de valor mutable sejam maus. Então eu também refatorei Candle para ser imutável. Isso também significa que a implementação do newestCandle teria que mudar, provavelmente em um par de campos duplos (ou, alternativamente, uma classe mutável e reinicializável separada). Não vejo nenhum outro problema potencial de desempenho em seu código. Mas quando se trata de desempenho, você sempre deve confiar no perfil, não na intuição (ou em alguém). Além disso, não gosto de alguns nomes de seus métodos. Especificamente: ValueUpdated. Os nomes dos métodos normalmente devem estar na forma de fazer algo, não aconteceu algo. Então eu acho que um nome melhor seria UpdateValue. Adicionar. Modificar. Estas são as duas operações fundamentais do seu MovingAverage e eu acho que esses nomes não expressam bem o significado. Eu os chamaria de algo como MoveAndSetCurrent e SetCurrent. respectivamente. Embora tal nomeação indique que as operações fundamentais deveriam ser Mover e Definir atual. Preciso acompanhar os últimos 7 dias de trabalho em um loop de leitura de arquivos planos. Está sendo usado para medir a fatigabilidade das listas de trabalho. Agora eu tenho algo que funciona, mas parece bastante detalhado e não tenho certeza se há um padrão que é mais sucinto. Atualmente, eu tenho uma classe Java com uma matriz estática para armazenar os últimos dados de x dias, então, ao ler o arquivo, retiro o primeiro elemento e mova os outros 6 (por um total de uma semana) de volta por um. O processamento desta matriz estática é feito em seu próprio método, ou seja. A minha pergunta: esta é uma abordagem de design razoável, ou há algo cegamente óbvio e simples para fazer esta tarefa. Obrigado, eles pediram 30 de agosto 11 às 14:33. Obrigado, pessoal: eu recebi a mensagem: use um objeto de nível superior e explore o Métodos relevantes ou um buffer circular. Excelentes respostas, todas elas. Quando você pensa sobre isso, você sempre precisa ter acesso a toda a matriz para que você possa se livrar daquela primeira entrada - da qual eu não tinha certeza por minha conta. Eu aliviei que eu não tivesse perdido algum liner e estava basicamente em uma faixa razoável, se não eficiente e fácil. Isto é o que eu adoro neste site: respostas de alta qualidade e relevantes de pessoas que conhecem o seu sht. Ndash Pete855217 30 de agosto 11 às 15:05 Por que você inicializa o runningTotal para null O que é seu tipo Onde é declarado Isso faria bem se você colocar alguns exemplos de código que se assemelham ao código Java real. Continuando, minha crítica seria a seguinte: sua função faz demais. Uma função ou método deve ser coeso. Mais apropriadamente, eles devem fazer uma coisa e uma coisa apenas. Pior ainda, o que acontece no seu loop for quando x 5 Você copia runningTotal6 em runningTotal5. Mas então você tem duas cópias do mesmo valor na posição 5 e 6. No seu projeto, sua função movesshuffles os itens em sua matriz calcula o material total de impressões para o erro padrão retorna o total. Faz demais. Minha primeira sugestão não é mover coisas na matriz. Em vez disso, implemente um buffer circular e use-o em vez da matriz. Isso simplificará seu design. A minha segunda sugestão é dividir as coisas em funções que são coesas: tenha uma estrutura de dados (um buffer circular) que lhe permita adicionar a ela (e isso diminui a entrada mais antiga sempre que ela atinja sua capacidade). Interator tem uma função que calcula o total no iterador (você não se importa se você estiver calculando o total de uma matriz, lista ou bufer circular). Não o chame total. Chame isso de soma, que é o que você está informando. Isso é o que eu faço :) Essa é a ótima informação de luis, no entanto, lembre-se de que esta função é uma pequena parte da funcionalidade da classe, e seria um excesso para adicionar muito código para torná-la perfeita. Você é tecnicamente correto, e eu entendo que meu código faz 39 muito muito39, mas, ao mesmo tempo, às vezes é melhor errar ao lado de um código menor e mais claro do que ir para a perfeição. Dadas as minhas habilidades em Java, mesmo fazer o pseudocódigo que você descreve a compilação me faria soprar meu orçamento neste (), mas obrigado pela descrição clara. Ndash Pete855217 31 de agosto 11 às 2:23 Hmmm, não é sobre a perfeição, mas sobre práticas industriais estabelecidas que conhecemos há 3 décadas. O código limpo é sempre um que é particionado. Temos décadas de evidências que indicam que este é o caminho a seguir no caso geral (em termos de custo-eficiência, redução de defeitos, compreensão, etc.). A menos que seja um código descartável por um tipo de coisa única. Nunca é dispendioso fazer isso quando se inicia qualquer análise de problema dessa maneira. Codificação 101, quebra o problema e o código segue, nem excesso nem dificuldade) ndash luis. espinal Aug 31 11 às 15:55 Sua tarefa é muito simples e o enfoque que você adotou é certamente bom para o trabalho. No entanto, se você quiser usar um design melhor, você deve se livrar de todo esse movimento numérico, você usa uma fila FIFO e faz bom uso de métodos push e pop, de modo que o código não reflete qualquer movimento de dados, apenas as duas ações de lógica De novos dados e remova dados com mais de 7 dias. Resposta 30 de agosto 11 às 14: 49Muito mais simples versão: classe pública MovingAverageInSlidingWIndow int windowsize Fila de fila int sum public MovingAverageInslidingWIndow (int windowsize) this. windowsize windowsize this. queue new LinkedList () this. sum 0 encontra a média móvel depois de inserir o item n em Fluxo de dados privado double findMovingAverage (int n) if (queue. size () gt windowsize - 1) sum sum - queue. poll () queue. offer (n) sum sum s return (double) soma queue. size () public static Void main (String args) int windowsize 3 MovingAverageInslidingWIndow m new MovingAverageInslidingWIndow (windowsize) para (int i 1 i lt 20 i) System. out. println (quotAfter Adicionando quot i quot para a fila: Average is: quot m. findMovingAverage (i )) Podemos simplesmente persistir a soma atual dos elementos na fila na variável global. Assim, reduzindo a computação no próximo () método. Classe pública MovingAverage LinkedList fila int size int sum 0 contém soma da fila Inicialize sua estrutura de dados aqui. Public MovingAverage (tamanho int) this. queue new LinkedList () this. size tamanho public double next (int val) queue. offer (val) sum val if (queue. size () gtthis. size) sum - queue. poll ()

No comments:

Post a Comment