Algoritma Kadence: Subarray Bersebelahan Jumlah Terbesar

⚡ Ringkasan Cerdas

Algoritma Kadane menemukan sub-array berurutan dengan jumlah terbesar dalam waktu linear dengan tracGunakan metode "running maximum" (mencari nilai maksimum yang terus bertambah) alih-alih memindai setiap kemungkinan sub-array. Trik pemrograman dinamis klasik ini bermanfaat untuk masalah saham, keuangan, dan sinyal.

  • 🎯 Definisi masalah: Subarray yang berdekatan adalah urutan elemen yang berurutan; tujuannya adalah subarray dengan jumlah aritmatika tertinggi di dalam array campuran positif dan negatif.
  • 🐢 Kekerasan Brutal: Dua loop bersarang mengevaluasi setiap indeks awal dan akhir dalam waktu O(N²) dan mencetak jendela pemenang menggunakan penanda awal dan akhir.
  • ⚡ Wawasan Kadane: Atur ulang jumlah berjalan setiap kali elemen saat ini melebihi akumulator, terusping Hanya awalan terbaik yang masih bisa berkembang menjadi jawaban.
  • 🧭 Contoh Kerja: Penjelasan singkat tentang sebuah array yang berisi angka negatif menunjukkan bagaimana max_sum dan current_sum berkembang selangkah demi selangkah hingga nilai maksimum sebenarnya tercapai.
  • ???? Cakupan Bahasa: Kedua C++ ke Python Implementasi pendekatan sederhana dan Algoritma Kadane menunjukkan transisi dari waktu O(N²) ke O(N).
  • 📊 Kompleksitas: Algoritma Kadane berjalan dalam waktu O(N) dengan ruang tambahan O(1), secara dramatis mengungguli metode brute-force pada array input yang besar.

Algoritma Kadane Jumlah Terbesar Subarray Berurutan

Berapakah Jumlah Subarray Berurutan Terbesar?

Subarray adalah bagian kontinu dari sebuah array. Ini bisa berupa elemen tunggal dari array atau sebagian kecil dari array. Subarray bersebelahan dengan jumlah terbesar berarti subarray yang memiliki nilai jumlah maksimum.

Sebagai contoh, perhatikan larik {-10, 5, 1, 6, -9, 2, -7, 3, -5}. Sub-lariknya bisa berupa {-10, 5, 1, 6}, {5, 1, 6}, atau {2, -7, 3, -5}, dan seterusnya. Namun, {5, 1, 6, 3} tidak dapat menjadi sub-larik karena elemen-elemennya tidak berurutan.

Jumlah Sub-baris Berdampingan Terbesar

Jika Anda perhatikan, di antara semua sub-array, sub-array yang disorot {5, 1, 6} memiliki nilai penjumlahan maksimum:

Subarray Berdekatan dengan Jumlah Terbesar yang Disorot

Jumlah sub-array {5, 1, 6} adalah 12, jumlah maksimum di antara semua kemungkinan sub-array dari array di atas. Jadi, untuk array ini, sub-array berurutan dengan jumlah maksimum adalah {5, 1, 6}.

Pendekatan Sederhana untuk Menyelesaikan Subarray Berurutan dengan Jumlah Terbesar

Cara sederhana untuk menyelesaikan masalah ini adalah dengan menggunakan dua loop untuk mencari semua subarray, menghitung jumlahnya, dan kemudian mencari nilai maksimumnya.

Berikut adalah diagram alir untuk pendekatan sederhana dalam menemukan sub-array berurutan dengan jumlah terbesar. Ini adalah pendekatan brute-force, karena kita menelusuri setiap sub-array yang mungkin.

Pendekatan sederhana untuk Memecahkan Jumlah Terbesar

Berikut langkah sederhana untuk melakukan ini.

Langkah 1) Inisialisasi jumlah_maksimum dengan nilai bilangan bulat minimum dan atur mulai ke akhir ke nol.

Langkah 2) membiarkan i ke j menjadi indeks array di mana j lebih besar atau sama dengan i; i menandai awal sub-array dan j akhirnya.

Langkah 3) jumlah_saat_ini menyimpan jumlah kumulatif. Setelah setiap pembaruan, periksa apakah jumlah_saat_ini lebih besar dari jumlah_maksimum.

Langkah 4) If jumlah_saat_ini lebih besar, ganti jumlah_maksimum dengan itu.

Langkah 5) Ketika j mencapai akhir array, tambah i dan atur ulang jumlah_saat_ini ke 0.

Langkah 6) Ulangi sampai i mencapai akhir array. jumlah_maksimum lalu menyimpan jumlah sub-array terbesar.

Pseudo Code untuk Pendekatan Sederhana

function maximumSubarraySum():
    input: array
    for all possible subArray from array:
        calculate sum of each subarray
        store the maximum subArray
    return the maximum sum

C++ Penerapan Pendekatan Sederhana

#include <stdio.h>
#include <iostream>
using namespace std;
void maximumSubarraySum(int array[], int n) {
    int max_sum = -1e9;
    int begin = 0;
    int end = 0;
    for (int i = 0; i < n; i++) {
        int current_sum = 0;
        for (int j = i; j < n; j++) {
            current_sum += array[j];
            if (max_sum < current_sum) {
                max_sum = current_sum;
                begin = i;
                end = j;
            }
        }
    }
    cout << "largest sum is " << max_sum << endl;
    cout << "largest sum contiguous subarray: ";
    for (int i = begin; i <= end; i++) {
        cout << array[i] << "\t";
    }
}
int main() {
    int array[] = {-10, 5, 1, 6, -9, 2, -7, 3, -5};
    maximumSubarraySum(array, sizeof(array) / sizeof(array[0]));
}

Keluaran:

largest sum is 12
largest sum contiguous subarray: 5      1       6

Python Penerapan Pendekatan Sederhana

def maximumSubarraySum(numbers):
    max_sum, begin, end = -1e9, 0, 0
    for i in range(len(numbers)):
        current_sum = 0
        for j in range(i, len(numbers)):
            current_sum += numbers[j]
            if max_sum < current_sum:
                max_sum = current_sum
                begin, end = i, j
    print("largest sum is ", max_sum)
    print("largest sum contiguous subarray: ", end='')
    for i in range(begin, end + 1):
        print(numbers[i], end='\t')

numbers = [-10, 5, 1, 6, -9, 2, -7, 3, -5]
maximumSubarraySum(numbers)

Keluaran:

largest sum is 12
largest sum contiguous subarray: 5      1       6

Algoritma Kadane untuk Menemukan Subarray Berurutan dengan Jumlah Terbesar

Algoritma Kadane adalah metode Pemrograman Dinamis yang menggunakan satu perulangan saja, bukan dua. Algoritma ini menangani array dengan campuran bilangan positif dan negatif, selama setidaknya satu nilainya bukan negatif.

Kita hanya membutuhkan dua variabel untuk menemukan sub-array berurutan dengan jumlah terbesar. Berikut adalah diagram alirnya:

Algoritma Kadane untuk Menemukan Jumlah Terbesar

Berikut langkah-langkah Algoritma Kadane :

Langkah 1) Buat dua variabel, jumlah_saat_ini ke jumlah_maksimum.

jumlah_saat_ini menyimpan jumlah maksimum yang berakhir pada indeks array tertentu, sementara jumlah_maksimum menyimpan nilai penjumlahan terbesar yang diamati sejauh ini.

Langkah 2) Tambahkan setiap elemen array ke jumlah_saat_iniKemudian periksa dua kondisi di bawah ini:

  • If jumlah_saat_ini jika kurang dari elemen saat ini, maka jumlah_saat_ini menjadi elemen saat ini.
  • If jumlah_maksimum kurang dari jumlah_saat_ini, kemudian jumlah_maksimum menjadi jumlah_saat_ini.

Langkah 3) Setelah mengulangi langkah sebelumnya untuk seluruh array, jumlah_maksimum berisi sub-array berurutan dengan jumlah terbesar.

Contoh Algoritma Kadane

Kami mendemonstrasikan Algoritma Kadane pada array kecil dan menjelaskan setiap langkah dalam menemukan sub-array berurutan dengan jumlah terbesar.

Mari kita asumsikan array yang diberikan adalah sebagai berikut:

Contoh Algoritma Kadane

Berikut adalah langkah-langkah Algoritma Kadane:

Langkah 1) Buat dua variabel, jumlah_saat_ini ke jumlah_maksimumTetapkan INT_MIN ke jumlah_maksimum dan nol hingga jumlah_saat_iniDi sini, INT_MIN mewakili nilai bilangan bulat minimum.

Langkah 2) Pada indeks 0, nilainya adalah 4. Jadi, jumlah_saat_ini = 0 + 4 = 4. Karena jumlah_saat_ini lebih besar dari jumlah_maksimum, jumlah_maksimum menjadi 4.

Contoh langkah 2 Algoritma Kadane

Langkah 3) Pada indeks 1, nilainya adalah -2. Jadi, jumlah_saat_ini = 4 + (-2) = 2.

Kali ini jumlah_saat_ini kurang dari jumlah_maksimumAkibatnya, nilai dari jumlah_maksimum belum diperbarui.

Contoh langkah 3 Algoritma Kadane

Langkah 4) Nilai selanjutnya adalah 1. Menambahkannya ke jumlah_saat_ini memberikan 3. Karena jumlah_maksimum (4) masih lebih besar dari jumlah_saat_ini, jumlah_maksimum belum diperbarui.

Contoh langkah 4 Algoritma Kadane

Langkah 5) Pada indeks 3, nilainya adalah 3. Peningkatan jumlah_saat_ini dengan 3 memberikan jumlah_saat_ini = 6.

Contoh langkah 5 Algoritma Kadane

Di sini: jumlah_maksimum lebih kecil dari jumlah_saat_ini, sehingga jumlah_maksimum diperbarui dengan nilai jumlah_saat_ini.

Langkah 6) Untuk elemen terakhir dari array, kita memiliki -1. Menambahkannya ke jumlah_saat_ini memberikan 5, yang lebih kecil dari jumlah_maksimum. Begitu, jumlah_maksimum tersisa 6.

Contoh langkah 6 Algoritma Kadane

Karena kita telah mencapai akhir array, algoritma berakhir di sini. Sekarang, jumlah_maksimum berisi jumlah maksimum, yaitu 6. Sub-arraynya adalah {4, -2, 1, 3}.

Pseudo Code untuk Algoritma Kadane

function KadaneAlgorithm():
    input: array
    maximum_sum, current_sum = 0
    for each element in array:
        add the element with current_sum
        if current_sum is greater than the maximum_sum
            then maximum_sum = current_sum
        if current_sum is less than the element
            then current_sum = element
    return the value of maximum_sum

C++ Implementasi Algoritma Kadane

#include <iostream>
using namespace std;
void kadane(int array[], int n) {
    int current_sum = 0;
    int max_sum = -1e9;
    // -1e9 means -1,000,000,000
    for (int i = 0; i < n; i++) {
        current_sum += array[i];
        if (max_sum < current_sum) {
            max_sum = current_sum;
        }
        if (current_sum < array[i]) {
            current_sum = array[i];
        }
    }
    cout << "largest sum is " << max_sum << endl;
}
int main() {
    int array[] = {-10, 5, 1, 6, -9, 2, -7, 3, -5};
    kadane(array, sizeof(array) / sizeof(array[0]));
}

Keluaran:

largest sum is 12

Python Implementasi Algoritma Kadane

def kadane(numbers):
    current_sum = 0
    max_sum = -1e9
    for i in range(len(numbers)):
        current_sum += numbers[i]
        if max_sum < current_sum:
            max_sum = current_sum
        if current_sum < numbers[i]:
            current_sum = numbers[i]
    print("largest sum is ", max_sum)

kadane([-10, 5, 1, 6, -9, 2, -7, 3, -5])

Keluaran:

largest sum is 12

Analisis Kompleksitas untuk Subarray Bersebelahan dengan Jumlah Terbesar

Pendekatan sederhana menggunakan dua loop untuk menghitung setiap kemungkinan jumlah sub-array dan menemukan yang terbesar. Ini adalah pendekatan brute-force; setiap loop berjalan hingga akhir array. susunan, memberi O(N²) waktu.

Algoritma Kadane hanya menggunakan satu loop, memberikan waktu O(N) dan ruang tambahan O(1). Pada array dengan 100 elemen, pendekatan sederhana melakukan 100 × 100 = 10,000 operasi, sedangkan algoritma Kadane hanya melakukan 100 operasi — peningkatan kecepatan yang dramatis untuk input yang besar.

Pertanyaan Umum Demo Slot

Algoritma Kadane mendasari rekayasa fitur AI untuk data deret waktu, deteksi jendela anomali, dan pembagian hadiah.ping dalam pembelajaran penguatan, helping Model-model tersebut mendeteksi interval penjumlahan positif terkuat dalam sinyal yang bising.

Ya. GitHub Copilot dan GPT secara andal menghasilkan Algoritma Kadane dalam Python, C++, dan Java, termasuk varian yang mengembalikan indeks awal dan akhir dari sub-array yang menang.

Algoritma Kadane berjalan dalam waktu O(N) dan ruang tambahan O(1) karena hanya melakukan satu kali proses. tracRaja hanya mencatat jumlah kumulatif dan nilai terbaik sejauh ini.

Inisialisasi max_sum ke elemen pertama atau ke tak terhingga negatif, bukan nol. Algoritma kemudian mengembalikan elemen negatif terkecil, yang merupakan jawaban yang benar.

Penggunaan umum meliputi jendela keuntungan jual-beli saham, penjumlahan tepi gambar, interval penilaian genomik, dan analisis risiko keuangan di mana jendela pengembalian berurutan terbaik sangat penting.

Tracka adalah indeks awal sementara setiap kali current_sum direset ke elemen saat ini. Saat max_sum diperbarui, catat indeks awal dan akhir sehingga sub-array jawaban dapat diiris di akhir.

Metode bagi dan taklukkan (divide and conquer) menyelesaikan sub-array maksimum dalam waktu O(N log N) dengan menggabungkan jumlah kiri, kanan, dan silang. Algoritma Kadane lebih cepat, yaitu O(N), dan lebih mudah dikodekan.

Ya. Metode Kadane adalah contoh pemrograman dinamis kanonik dengan keadaan O(1), di mana setiap maksimum baru yang berakhir pada indeks i bergantung pada maksimum yang berakhir pada indeks i dikurangi satu ditambah elemen saat ini.

Ringkaslah postingan ini dengan: