Panduan Algortihm Sliding Window dan Cara Mengimplementasikannya di Go

Panduan Algortihm Sliding Window dan Cara Mengimplementasikannya di Go
Pembaca seperti Anda membantu mendukung MUO. Saat Anda melakukan pembelian menggunakan tautan di situs kami, kami dapat memperoleh komisi afiliasi. Baca selengkapnya.

Melakukan operasi pada urutan angka dan karakter merupakan aspek penting dalam pemrograman. Algoritma jendela geser adalah salah satu algoritma standar untuk melakukan hal tersebut.





Video MUO hari ini GULIR UNTUK MELANJUTKAN ISI

Ini adalah solusi elegan dan serbaguna yang telah diterapkan di banyak domain. Dari manipulasi string hingga traversal array dan optimalisasi kinerja, algoritma ini dapat berperan.





Jadi, bagaimana cara kerja algoritma jendela geser, dan bagaimana Anda bisa mengimplementasikannya di Go?





Memahami Algoritma Jendela Geser

Ada banyak algoritma teratas yang berguna untuk diketahui sebagai seorang programmer, dan jendela geser adalah salah satunya. Algoritme ini berkisar pada konsep sederhana dalam mempertahankan jendela dinamis atas serangkaian data, untuk memproses dan menganalisis subkumpulan data tersebut secara efisien.

Anda dapat menerapkan algoritme saat menyelesaikan masalah komputasi yang melibatkan array, string, atau rangkaian data.



Ide inti di balik algoritma jendela geser adalah untuk menentukan jendela dengan ukuran tetap atau variabel dan memindahkannya melalui data masukan. Hal ini memungkinkan Anda menjelajahi berbagai subkumpulan masukan tanpa komputasi berlebihan yang dapat menghambat kinerja.

bisakah saya menggunakan game ps3 di ps4?

Berikut adalah representasi visual cara kerjanya:





  Dua tampilan menunjukkan serangkaian angka. Jendela geser yang berisi 3 angka disorot pada masing-masing angka, satu langkah lebih maju dalam kasus kedua.

Batasan jendela dapat disesuaikan sesuai dengan kebutuhan masalah spesifik.

Menerapkan Algoritma Sliding Window di Go

Anda dapat menggunakan masalah pengkodean populer untuk mempelajari cara kerja algoritma jendela geser: menemukan jumlah terbesar dari sub-array dengan panjang tertentu.





Tujuan dari masalah sampel ini adalah untuk menemukan ukuran sub-array k yang unsur-unsurnya berjumlah nilai terbesar. Fungsi solusi mengambil dua parameter: array input dan representasi bilangan bulat positif k .

Biarkan array sampel menjadi angka , seperti yang ditunjukkan kode di bawah ini:

 nums := []int{1, 5, 4, 8, 7, 1, 9} 

Dan biarkan panjang sub-array menjadi k , dengan nilai 3:

 k := 3 

Anda kemudian dapat mendeklarasikan suatu fungsi untuk mencari jumlah maksimum sub-array dengan panjang k:

 func maximumSubarraySum(nums []int, k int) int { 
    // body
}

Anda mungkin berpikir jendela harus berupa array yang menyimpan salinan elemen target. Meskipun ini merupakan pilihan, kinerjanya buruk.

Sebaliknya, Anda hanya perlu menentukan batas jendela untuk melacaknya. Misalnya, dalam kasus ini, jendela pertama akan memiliki indeks awal 0 dan indeks akhir k-1 . Dalam proses menggeser jendela, Anda akan memperbarui batas-batas ini.

Langkah pertama untuk menyelesaikan masalah ini adalah mendapatkan jumlah sub-array pertama berukuran k. Tambahkan kode berikut ke fungsi Anda:

 var windowStart, windowEnd, maxSum, windowSum int 
windowStart = 0

for i := 0; i < k; i++ {
    windowSum += nums[i]
}

maxSum = windowSum

Kode di atas mendeklarasikan variabel yang diperlukan untuk algoritma dan menemukan jumlah jendela pertama dalam array. Ini kemudian diinisialisasi jumlah maksimal dengan jumlah jendela pertama.

Langkah selanjutnya adalah geser jendela dengan mengulangi melalui angka array dari indeks k sampai akhir. Di setiap langkah menggeser jendela:

  1. Memperbarui jendelaJumlah dengan menambahkan elemen saat ini dan mengurangi elemen di jendelaMulai .
  2. Memperbarui jumlah maksimal jika nilai baru dari jendelaJumlah lebih besar dari itu.

Kode berikut mengimplementasikan jendela geser. Tambahkan ke maksimumSubarraySum fungsi.

 for windowEnd = k; windowEnd < len(nums); windowEnd++ { 
    windowSum = windowSum + nums[windowEnd] - nums[windowStart]

    if windowSum > maxSum {
        maxSum = windowSum
    }

    // slide window forward
    windowStart++
}

Saat perulangan selesai, Anda akan mendapatkan jumlah terbesar jumlah maksimal , yang dapat Anda kembalikan sebagai hasil dari fungsi:

 return maxSum 

Fungsi lengkap Anda akan terlihat seperti ini:

 func maximumSubarraySum(nums []int, k int) int { 
    var windowStart, windowEnd, maxSum, windowSum int
    windowStart = 0

    for i := 0; i < k; i++ {
        windowSum += nums[i]
    }

    maxSum = windowSum

    for windowEnd = k; windowEnd < len(nums); windowEnd++ {
        windowSum = windowSum + nums[windowEnd] - nums[windowStart]

        if windowSum > maxSum {
            maxSum = windowSum
        }

        // slide window forward
        windowStart++
    }

    return maxSum
}

Anda dapat menentukan fungsi utama untuk menguji algoritme, menggunakan nilai angka Dan k dari tadi:

 func main() { 
    nums := []int{1, 5, 4, 8, 7, 1, 9}
    k := 3
    fmt.Println(maximumSubarraySum(nums, k))
}

Output dalam hal ini adalah 19 , yang merupakan jumlah dari sub-array [4, 8, 7], yang merupakan yang terbesar.

Anda sekarang dapat menerapkan teknik yang sama untuk masalah serupa, bahkan dalam bahasa lain, seperti menangani elemen berulang dalam jendela menggunakan a Peta hash Java , Misalnya.

Algoritma Optimal Menghasilkan Aplikasi yang Efisien

Algoritme ini merupakan bukti kekuatan solusi efisien dalam pemecahan masalah. Jendela geser memaksimalkan kinerja dan menghilangkan komputasi yang tidak perlu.

Pemahaman yang kuat tentang algoritma jendela geser dan implementasinya di Go membekali Anda untuk menangani skenario dunia nyata saat membangun aplikasi.