Monday 28 August 2017

Java moving average queue


Jauh lebih sederhana versi: public class MovingAverageInSlidingWIndow int windowsize Antrian antrian int sum public MovingAverageInSlidingWIndow (int windowsize) this. windowsize windowsize this. queue LinkedList baru () this. sum 0 menemukan moving average setelah memasukkan item n ke dalam aliran data private double findMovingAverage (int N) jika (queue. size () gt windowsize - 1) jumlah sum - queue. poll () queue. offer (n) jumlah sum n return (double) jumlah queue. size () public static void main (String args) int Windowsize 3 MovingAverageInSlidingWIndow m new MovingAverageInSlidingWIndow (windowsize) untuk (int i 1 i lt 20 i) System. out. println (quotAfter Menambahkan kuota ke antrian: Rata-rata adalah: quot m. findMovingAverage (i)) Kita dapat bertahan Jumlah elemen saat ini dalam antrian dalam variabel global. Dengan demikian, mengurangi perhitungan pada metode next (). Kelas publik MovingAverage LinkedList queue int int ukuran 0 jumlah penjumlahan antrian Inisialisasi struktur data Anda di sini. Public MovingAverage (int size) this. queue new LinkedList () this. size size public double next (int val) queue. offer (val) sum val if (queue. size () gtthis. size) sum - queue. poll () Menerapkan Antrian FIFO Panjang-Tetap di Jawa Ketika bekerja dengan data deret waktu, seseorang sering perlu menghitung jumlah angka berturut-turut untuk jangka waktu yang telah ditentukan. Bayangkan misalnya menghitung moving average dengan ukuran tetap. Mari lihat seri waktu yang sangat singkat. Dengan asumsi rata-rata bergerak dengan panjang 4 menghasilkan deret berikut: Rumus untuk rata-rata bergerak dengan panjang 4 adalah: MA t (Jumlah semua elemen dari t-3 sampai t) 4 Bagaimana kita menerapkan ini dengan efisien dalam kode Java Masalahnya adalah kita perlu menghitung Sum dalam formula untuk setiap moving average. Tentu saja adalah mungkin untuk selalu mengulangi semua angka dalam kerangka waktu saat ini untuk melakukannya, tapi ini tidak perlu lambat. Sebagai gantinya, kita bisa mengurangi elemen terakhir dalam kerangka waktu dan menambahkan yang terbaru ke Sum. Dengan cara ini kita dapat menyimpan sejumlah besar perhitungan yang tidak perlu. Masih kita harus melacak apa sebenarnya elemen lama dan baru. Kita harus menyimpan angka-angka ini di suatu tempat. Struktur data yang sesuai akan menjadi antrian nomor urut pertama (in-first-out (FIFO). Tapi bagaimana sebenarnya antrian FIFO dapat diimplementasikan dalam bahasa pemrograman (non-fungsional) seperti Java Ide pertama biasanya menggunakan implementasi berbasis array dan menggeser posisi elemen dalam array dengan berulang kali membuat sedikit salinan bergeser dari Array. Pada contoh di atas, kita perlu membuat array baru lima kali, sekali untuk setiap Sum baru yang dihitung. Hal ini tentu saja sangat tidak efisien, karena pembuatan array di memori relatif lambat. Implementasi berdasarkan kelas seperti java. util. ArrayList atau java. util. Vector sudah jauh lebih baik, karena secara internal mereka mengandalkan array dan indeks yang lebih panjang. Masih ini bukan solusi terbaik, karena begitu indeks internal bergerak keluar dari batas array internal, salinan baru dari array internal harus dibuat. Alternatif khas untuk menerapkan antrian FIFO adalah dengan demikian menggunakan linked list: Keuntungannya jelas, tidak ada lagi penyalinan atau pembuatan ulang array di memori. Yang harus kita lakukan hanyalah memanipulasi beberapa petunjuk. Tentu saja kita kehilangan keuntungan untuk menilai secara langsung elemen dalam antrian berdasarkan indeks, tapi untuk tujuan kita - menghitung rata-rata bergerak - ini adalah sesuatu yang tidak ingin kita lakukan. Kemarin, tiba-tiba terpikir oleh saya bahwa sebenarnya ada alternatif yang lebih baik lagi jika panjang antrian tetap (seperti pada contoh kita). Kita bisa menggunakan cincin secara efektif. Menambahkan nomor baru ke antrian dan menjatuhkan yang tertua sama saja dengan mengganti elemen tertua di ring ini dengan yang baru. Secara internal, kita dapat lagi menggunakan sebuah array dari panjang tetap dalam kombinasi dengan indeks yang berputar. Beginilah kodenya seperti di Jawa. Pertama, mari kita membuat antarmuka Antrian kita sendiri: Antarmuka ini agak menyimpang dari perpustakaan yang disediakan di perpustakaan Jawa tapi ini tidak penting untuk saat ini. Selanjutnya, pelaksanaan antrian kita: Kutipan antrian melalui deret antrian. Menambahkan elemen baru di kepala antrian secara otomatis menghapus elemen tertua dalam antrian - tidak menyalin susunan atau mengatur ulang referensi objek yang diperlukan. Berbeda dengan linked list kita sebenarnya bisa mengakses setiap elemen di ring secara langsung dengan metode get. Akhirnya, kita bisa membuat subclass dari objek antrian kita yang dengan anggun akan digulung saat nilai baru ditambahkan ke dalam antrian. Kita bisa menggunakan kelas sekarang. Panjang rata-rata bergerak awalnya diatur melalui panjang array yang diberikan kepada konstruktornya. Saya perlu melacak jam kerja 7 hari terakhir dalam loop pembacaan file datar. Ini digunakan untuk mengukur kelelahan dari daftar pekerjaan. Saat ini saya memiliki sesuatu yang berhasil, tapi sepertinya agak verbose dan saya tidak yakin apakah ada pola yang lebih ringkas. Saat ini, saya memiliki kelas Java dengan array statis untuk menyimpan data x hari terakhir, lalu saat membaca file, saya memotong elemen pertama dan memindahkan 6 lainnya (untuk keseluruhan putaran keseluruhan) satu per satu. Pengolahan array statis ini dilakukan dengan metodenya sendiri. Pertanyaan saya: apakah ini pendekatan desain yang masuk akal, atau adakah sesuatu yang menyilaukan dan sederhana untuk melakukan tugas ini Terima kasih guys tanya 30 Agustus 11 jam 14:33 Terima kasih banyak guys: Saya punya pesannya: gunakan benda tingkat lebih tinggi dan eksploitasi Metode yang relevan atau penyangga melingkar. Jawaban yang bagus, semuanya. Ketika Anda memikirkannya, Anda selalu membutuhkan akses ke keseluruhan rangkaian sehingga Anda bisa menyingkirkan entri pertama - yang saya tidak yakin dengan kemampuan saya sendiri. Saya merasa lega bahwa saya tidak dapat melewati satu kapal pun dan pada dasarnya berada pada jalur yang masuk akal, jika tidak efisien dan singkat Inilah yang saya sukai dari situs ini: jawaban berkualitas tinggi dan relevan dari orang-orang yang mengetahui kemampuan mereka. Ndash Pete855217 30 Agu 11 11 di 15:05 Mengapa Anda menginisialisasi runningTotal ke null Apa jenisnya Dimana dideklarasikan Akan lebih baik jika Anda memasukkan beberapa contoh kode yang menyerupai kode Java yang sebenarnya. Pindah, kritik saya adalah sebagai berikut: fungsi Anda terlalu banyak. Suatu fungsi, atau metode, harus bersifat kohesif. Lebih tepat, mereka harus melakukan satu hal dan satu hal saja. Lebih buruk lagi, apa yang terjadi dalam lingkaran Anda saat x 5 Anda menyalin runningTotal6 ke runningTotal5. Tapi kemudian Anda memiliki dua salinan dengan nilai yang sama pada posisi 5 dan 6. Dalam desain Anda, fungsi Anda menggerakkan item pada array Anda menghitung total barang cetakan ke kesalahan standar mengembalikan totalnya. Saran pertama saya adalah tidak memindahkan barang-barang ke dalam array. Sebagai gantinya, terapkan buffer lingkaran dan gunakan sebagai pengganti array. Ini akan mempermudah disain anda. Saran kedua saya adalah memecah hal-hal menjadi fungsi yang kohesif: memiliki struktur data (buffer melingkar) yang memungkinkan Anda menambahkannya (dan itu memasukkan entri tertua kapan pun mencapai kapasitasnya.) Miliki struktur data yang menerapkannya. Interator memiliki fungsi yang menghitung total pada iterator (Anda tidak peduli jika Anda menghitung total dari daftar, daftar atau bufer melingkar.) Jangan menyebutnya total. Sebut itu jumlah, apa yang Anda komputasi. Thats apa Id lakukan :) Itu info bagus luis, namun ingat fungsi ini adalah bagian kecil dari fungsionalitas kelas, dan akan berlebihan untuk menambahkan terlalu banyak kode untuk membuatnya sempurna. Anda secara teknis benar, dan saya mengerti kode saya tidak banyak, tapi pada saat yang sama kadang-kadang lebih baik berbuat salah pada kode yang lebih kecil dan lebih jelas daripada memilih kesempurnaan. Mengingat kemampuan Java saya, bahkan membuat pseudocode yang Anda gambarkan kompilasi akan membuat saya meniup anggaran saya untuk ini (), namun terimakasih atas deskripsi yang jelas. Ndash Pete855217 31 Agustus 11 at 2:23 Hmmm, ini bukan tentang kesempurnaan, tapi tentang praktik industri mapan yang telah kita ketahui selama 3 dekade terakhir. Kode bersih selalu satu yang dipartisi. Kami memiliki beberapa dekade bukti yang menunjukkan bahwa ini adalah cara untuk pergi dalam kasus umum (dalam hal efisiensi biaya, pengurangan cacat, pemahaman, dll.). Kecuali itu adalah kode membuang jauh untuk hal satu kali. Tidak perlu melakukan hal ini bila seseorang memulai analisis masalah dengan cara ini. Coding 101, memecah masalah dan kode berikut, tidak berlebihan atau sulit) ndash luis. espinal 31 Agustus 11 at 15:55 Tugas Anda terlalu sederhana dan pendekatan yang Anda adopsi tentu saja bagus untuk pekerjaan itu. Namun, jika Anda ingin menggunakan desain yang lebih baik, Anda harus menyingkirkan semua gerakan angka itu dengan lebih baik menggunakan antrian FIFO dan memanfaatkan metode push and pop dengan baik sehingga kode tersebut tidak mencerminkan pergerakan data apa pun, hanya dua tindakan logika. Data baru dan hapus data lebih tua dari 7 hari. Jawab 30 Agustus pukul 14:49

No comments:

Post a Comment