Wednesday 4 October 2017

Java Mobile Media Coda


Molto più semplice versione: public class MovingAverageInSlidingWIndow int WindowSize coda coda int riassumere MovingAverageInSlidingWIndow pubblico (int WindowSize) this. windowsize WindowSize this. queue nuova LinkedList () this. sum 0 reperti media mobile dopo aver inserito voce n in flusso di dati doppia findMovingAverage privato (int n) se (queue. size () gt WindowSize - 1) sum sum - queue. poll () queue. offer (n) sum sum n ritorno (doppio) sum queue. size () void main (args public String statica) int WindowSize 3 MovingAverageInSlidingWIndow m nuovo MovingAverageInSlidingWIndow (WindowSize) for (int i 1 i lt 20 i) System. out. println (quotAfter Aggiunta quot i quot alla coda: media è: quot m. findMovingAverage (i)) possiamo semplicemente persistere della corrente somma di elementi in coda nella variabile globale. Così, riducendo il calcolo del metodo next (). public class LinkedList media mobile dimensione della coda int int somma 0 detiene somma coda di inizializzare la struttura di dati qui. Media mobile pubblica (int size) this. queue nuova LinkedList () this. size dimensione pubblica doppia successivo (int val) queue. offer (val) sum val se (queue. size () gtthis. size) sum - queue. poll () L'implementazione di una lunghezza fissa FIFO coda in Java Quando si lavora con i dati di serie temporali, spesso si ha la necessità di calcolare le somme di numeri consecutivi per un periodo di tempo predeterminato. Immaginate per esempio il calcolo di una media mobile con una dimensione fissa. Let39s un'occhiata a una serie temporale molto semplice. Ipotizzando una media mobile di lunghezza 4 risultati nel seguente matrice: La formula per una media mobile di lunghezza 4 quindi è: MA t (somma di tutti gli elementi da T-3 per t) 4 Come potremmo efficacemente implementare questo nel codice Java Il problema è che abbiamo bisogno di calcolare la somma nella formula per ogni media mobile. Naturalmente è possibile ribadire sempre su tutti i numeri nel lasso di tempo corrente di farlo, ma questo è inutilmente lento. Invece, possiamo semplicemente sottrarre l'ultimo elemento nel lasso di tempo e aggiungere il più recente di Somma. In questo modo siamo in grado di salvare un numero significativo di calcoli inutili. Ancora dobbiamo tenere traccia di ciò che in realtà sono i vecchi ei nuovi elementi. Dobbiamo salvare questi numeri da qualche parte. Una struttura dati appropriata sarebbe un first-in-first-out (FIFO) coda di numeri. Ma esattamente come può una coda FIFO essere realizzato in un (non funzionale) linguaggio di programmazione come Java La prima idea è tipicamente utilizzare un'implementazione basata su array e di spostare la posizione degli elementi dell'array ripetutamente creando leggermente spostato copie la matrice. Nel precedente esempio, avremmo bisogno di creare un nuovo array cinque volte, una per ogni nuova somma calcolata. Questo naturalmente è molto inefficiente, perché la creazione di un array in memoria è relativamente lento. Implementazioni basate su classi come java. util. ArrayList o java. util. Vector sono già molto meglio, perché internamente si basano su array più lunghe e indici. Comunque questo non è la soluzione migliore, perché una volta che gli indici interni si muovono al di fuori dei confini interni array39s deve essere creata una nuova copia della matrice interna. Una tipica alternativa per implementare code FIFO è quindi usando una lista collegata: Il vantaggio è evidente, non è più copia o array ri-creazione in memoria. Tutto ciò che dobbiamo fare sta manipolando alcune indicazioni. Naturalmente si perde il vantaggio di valutare direttamente un elemento in coda per indice, ma per il nostro scopo - calcolare medie mobili - questo è qualcosa che non vogliamo fare comunque. Oggi, improvvisamente pensato che vi è in realtà un'alternativa ancora migliore se la lunghezza della coda è fissa (come nel nostro esempio). Siamo in grado di utilizzare in modo efficace un anello. Aggiunta di un nuovo numero alla coda e rilasciando il più antico è uguale semplicemente sostituendo l'elemento più antico in questo anello con uno nuovo. Internamente, possiamo utilizzare ancora un array di lunghezza fissa in combinazione con un indice di rotazione. Questo è il modo in cui il codice è simile a Java. In primo luogo, let39s creare la nostra interfaccia di coda: Questa interfaccia devia in qualche modo da quello previsto nelle librerie Java, ma questo non è importante, per ora. Successivamente, l'attuazione di una coda: Il quotrollsquot coda attraverso l'anello. L'aggiunta di un nuovo elemento alla testa della coda rimuove automaticamente l'elemento meno recente nella coda - nessuna copia di matrici o ripristino di riferimenti a oggetti richiesti. A differenza delle liste collegate possiamo effettivamente accedere a ciascun elemento sul ring direttamente con il metodo get. Infine, siamo in grado di creare una sottoclasse del nostro oggetto di coda che sarà gentilmente rotolare come nuovi valori vengono aggiunti nella queuering. Siamo in grado di utilizzare la classe ora. La lunghezza della media mobile è inizialmente impostata attraverso la lunghezza della matrice dato alle sue constructor. I bisogno di tenere traccia degli ultimi 7 giorni ore di lavoro in un ciclo di lettura di file flat. Il suo essere utilizzati per misurare fatigueability di turni di lavoro. In questo momento ho qualcosa che funziona, ma sembra piuttosto prolisso e Im non sicuro se theres un modello di questo è più succinta. Attualmente, ho una classe Java con un array statico per contenere i dati ultimi x giorni, poi come ho letto attraverso il file, ho recidere il primo elemento e spostare gli altri 6 (per una settimana in totale rotolamento) indietro di una. La lavorazione di questo array statico è fatto in un proprio metodo per esempio. La mia domanda: è questo un approccio progettuale ragionevole, o c'è qualcosa di assolutamente ovvio e semplice per eseguire questa operazione Grazie ragazzi ha chiesto 30 ago 11 in 14:33 Grazie mille ragazzi: I39ve ottenuto il messaggio: utilizzare un oggetto di livello superiore e sfruttare il metodi rilevanti o un buffer circolare. Grandi risposte, tutti loro. Quando si pensa a questo proposito, è sempre necessario l'accesso a tutta la gamma in modo da poter sbarazzarsi di quel primo ingresso - che wasn39t 100 sicuro per conto mio. I39m sollevato dal fatto che ho perso un po 'hadn39t 1 liner e era fondamentalmente su un ragionevole, se traccia non efficiente e concisa Questo è quello che mi piace di questo sito: alta qualità, relative risposte da parte di persone che conoscono il loro SHT. ndash Pete855217 30 agosto 11 alle 15:05 Perché si inizializza RunningTotal su null Qual è il suo tipo in cui è dichiarata Sarebbe bene se si mette alcuni esempi di codice che assomigliano codice Java vero e proprio. Passando, la mia critica sarebbe il seguente: la vostra funzione non troppo. Una funzione, o un metodo, dovrebbe essere coesa. Più in modo appropriato, si dovrebbe fare una cosa e una cosa sola. Peggio ancora, che cosa accade nella vostra per ciclo quando x 5 Si copia runningTotal6 in runningTotal5. ma poi si hanno due copie dello stesso valore in posizione 5 e 6. Nel tuo disegno, la funzione movesshuffles gli elementi dell'array calcola la roba stampe totali per errore standard restituisce il totale Fa troppo. Il mio primo suggerimento è di non muoversi roba in giro nella matrice. Invece, implementare un buffer circolare e utilizzarlo invece della matrice. E 'semplificherà il vostro disegno. Il mio secondo suggerimento è quello di abbattere le cose in funzioni che sono coesa: avere una struttura di dati (un buffer circolare) che consente di aggiungere ad esso (e che scende la voce più vecchia ogni volta che raggiunge la sua capienza.) Hanno la struttura di dati implementare un interator avere una funzione che calcola il totale sul iteratore (non vi preoccupate se si sta calcolando il totale di un array, elenco o bufer circolare.) Non chiamare è totale. Chiamatela somma, che è quello che si sta Computing. Questo è quello che Id fare :) That39s informazioni grande Luis, tuttavia ricordate questa funzione è una piccola parte della funzionalità della classe, e sarebbe eccessivo aggiungere troppo codice per renderlo perfetto. Sei tecnicamente corretta, e ho capito il mio codice fa 39too much39, ma allo stesso tempo a volte it39s meglio sbagliare sul lato della più piccola, il codice più chiaro che andare per la perfezione. Dato le mie capacità Java, anche facendo il pseudocodice che si descrive compilare avrebbe mi soffio il bilancio su questo (), ma grazie per la descrizione chiara. ndash Pete855217 31 agosto 11 alle 02:23 Hmmm, it39s non si tratta di perfezione, ma sulle pratiche industriali consolidate che abbiamo conosciuto per gli ultimi 3 decenni. codice pulito è sempre uno che è partizionato. Abbiamo decenni di prove che indicano questa è la strada da percorrere nel caso generale (in termini di costo-efficienza, riduzione dei difetti, la comprensione, ecc). a meno che non si getta codice per una sorta di una volta di cosa. Non è mai costosa fare questo quando si inizia qualsiasi analisi problema in questo modo. Coding 101, scomporre il problema e il codice segue, né eccessivo né difficile) ndash luis. espinal 31 agosto 11 alle 15:55 Il vostro compito è troppo semplice e il aproach avete adottato è certamente un bene per il lavoro. Tuttavia, se si desidera utilizzare un design migliore, è necessario sbarazzarsi di tutto quel movimento numero è meglio utilizzare una coda FIFO e fare buon uso di metodi push e pop in questo modo il codice riflettere solito qualsiasi spostamento dei dati, solo le due azioni logiche di nuovi dati e rimuovere i dati più vecchi di 7 giorni. risposto 30 ago 11 in 14:49

No comments:

Post a Comment