logo

Kadane'nin Algoritması

Kadane'nin algoritması, bir sayı dizisinde maksimum toplamlı bitişik alt diziyi bulmayı içeren maksimum alt dizi problemini çözmek için kullanılan dinamik bir programlama yaklaşımıdır. Algoritma 1984 yılında Jay Kadane tarafından önerilmiştir ve zaman karmaşıklığı O(n)'dir.

Kadane algoritmasının tarihçesi:

Kadane'nin algoritması, adını Carnegie Mellon Üniversitesi'nde bilgisayar bilimi profesörü olan mucidi Jay Kadane'den almıştır. Algoritmayı ilk kez 1984 yılında Journal of the Association for Computing Machinery (ACM) dergisinde yayınlanan 'Maksimum Toplam Alt Dizi Problemi' başlıklı makalesinde tanımladı.

Maksimum alt diziyi bulma problemi 1970'lerden bu yana bilgisayar bilimcileri tarafından inceleniyor. Algoritma tasarımı ve analizi alanında iyi bilinen bir problemdir ve sinyal işleme, finans ve biyoenformatik dahil olmak üzere çok çeşitli alanlarda uygulamaları vardır.

Kadane'nin algoritmasından önce, maksimum alt dizi problemini çözmek için olası tüm alt dizileri kontrol eden kaba kuvvet yaklaşımı ve böl ve yönet algoritması gibi başka algoritmalar önerildi. Ancak bu algoritmalar daha yüksek zaman karmaşıklığına sahiptir ve Kadane'nin algoritmasından daha az verimlidir.

ağ topolojileri

Kadane'nin algoritması bilgisayar bilimlerinde yaygın olarak kullanılmaktadır ve dinamik programlamanın klasik bir örneği haline gelmiştir. Basitliği, verimliliği ve zarafeti onu maksimum alt dizi problemine popüler bir çözüm ve algoritma tasarımı ve analizinde değerli bir araç haline getirmiştir.

Kadene Algoritmasının Çalışması:

Algoritma, dizi üzerinde yineleme yaparak ve her konumda biten alt dizinin maksimum toplamını takip ederek çalışır. Her i konumunda iki seçeneğimiz vardır: ya i konumundaki öğeyi mevcut maksimum alt diziye ekleyin ya da i konumunda yeni bir alt dizi başlatın. Bu iki seçeneğin maksimumu, i konumunda biten maksimum alt dizidir.

Şu ana kadar görülen maksimum toplamı ve geçerli konumda biten maksimum toplamı takip etmek için sırasıyla max_so_far ve max_ending_here adlı iki değişkeni koruyoruz. Algoritma, her iki değişkenin de dizinin ilk elemanına ayarlanmasıyla başlar. Daha sonra diziyi ikinci elemandan sonuna kadar yineliyoruz.

Her i konumunda, mevcut öğenin maksimumunu ve önceki maksimum alt diziye eklenen geçerli öğeyi alarak max_ending_here'i güncelleriz. Daha sonra max_so_far'ı max_so_far ve max_ending_here değerlerinin maksimumu olacak şekilde güncelleriz.

Algoritma, dizideki herhangi bir alt dizinin maksimum toplamı olan max_so_far değerini döndürür.

İşte Kadane Algoritmasının adım adım süreci:

1. İki değişkeni başlatın, max_so_far Ve max_ending_here , dizinin ilk öğesine.

max_so_far = dizi[0]

max_ending_here = dizi[0]

2. Diziyi ikinci öğeden sonuna kadar yineleyin:

q3 hangi aylardır

i'den n-1'e kadar şunu yapın:

3. Mevcut konumda biten maksimum toplamı hesaplayın:

max_ending_here = max(dizi[i], max_ending_here + dizi[i])

4. max_so_far'ı max_so_far ve max_ending_here değerlerinin maksimumu olacak şekilde güncelleyin:

max_so_far = max(max_so_far, max_ending_here)

5. Dizideki herhangi bir alt dizinin maksimum toplamı olarak max_so_far değerini döndürün.

Java'da dönüş türü

Kadane Algoritmasının zaman karmaşıklığı O(n)'dir; burada n, giriş dizisinin uzunluğudur. Bu, onu maksimum alt dizi problemine çok etkili bir çözüm haline getirir.

Örnek:

Kadane algoritmasının nasıl çalıştığına dair bir örnek görelim:

Aşağıdaki tamsayı dizisine sahip olduğumuzu varsayalım:

 arr = [-2, 1, -3, 4, -1, 2, 1, -5, 4] 

Bu dizinin maksimum alt dizi toplamını bulmak istiyoruz. Bu sorunu çözmek için Kadane'nin algoritmasını uygulayabiliriz.

İki değişkeni başlatarak başlıyoruz:

    max_so_far:Bu değişken şu ana kadar gördüğümüz maksimum alt dizi toplamını takip edecektir.max_ending_here:Bu değişken geçerli endekste biten maksimum toplamı takip edecektir.
 max_so_far = INT_MIN; max_ending_here = 0; 

Daha sonra ikinci elemandan başlayarak diziyi yineliyoruz:

 for i in range(1, len(arr)): 

Geçerli öğeyi önceki toplama ekleyerek geçerli toplamı güncelleyin:

 max_ending_here = max(arr[i], max_ending_here + arr[i]) 

Şu ana kadar görülen maksimum toplamı güncelleyin:

 max_so_far = max(max_so_far, max_ending_here) 

Her yinelemede, mevcut öğeyi önceki toplama ekleyerek veya geçerli öğede yeni bir alt dizi başlatarak mevcut toplamı güncelleriz. Daha sonra şu ana kadar görülen maksimum toplamı mevcut toplamla karşılaştırarak güncelleriz.

Dizinin tamamı yinelendikten sonra max_so_far'ın değeri, verilen dizinin maksimum alt dizi toplamı olacaktır.

Bu örnekte maksimum alt dizi toplamı 6'dır ve bu da alt diziye [4, -1, 2, 1] karşılık gelir.

Java'da Kod Uygulaması:

 import java.io.*; import java.util.*; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.print(&apos;Enter the size of the array : &apos;); int n=sc.nextInt(); int[] arr=new int[n]; System.out.println(&apos;Enter the elements of the array : &apos;); for(int i=0;i<n;i++){ arr[i]="sc.nextInt();" } int max_so_far="Integer.MIN_VALUE,max_ending_here=0;" for(int i="0;i&lt;n;i++)" { max_ending_here+="arr[i];" if(max_so_far<max_ending_here){ if(max_ending_here<0){ max_ending_here="0;" system.out.print('the maximum contiguous sum in the array is : '+max_so_far); < pre> <p> <strong>Output</strong> </p> <pre> Enter the size of the array : 9 Enter the elements of the array : -2 1 -3 4 -1 2 1 -5 4 The Maximum contiguous sum in the array is : 6 </pre> <h3>Code Implementation in C++:</h3> <pre> #include using namespace std; int main() { int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 }; int n = sizeof(a) / sizeof(a[0]); // Kadane&apos;s algorithm int max_so_far = INT_MIN, max_ending_here = 0; for (int i = 0; i <n; i++) { max_ending_here="max_ending_here" + a[i]; if (max_so_far < max_ending_here) max_so_far="max_ending_here;" (max_ending_here 0) } cout << 'maximum contiguous sum in the array is : '<<max_so_far<<endl; return 0; pre> <p> <strong>Output</strong> </p> <pre> Maximum contiguous sum in the array is : 7 </pre> <h2>Advantages and Disadvantages of Kadane&apos;s algorithm:</h2> <h3>Advantages of Kadane&apos;s Algorithm:</h3> <ul> <tr><td>Efficiency:</td> Kadane&apos;s Algorithm has a time complexity of O(n), which makes it very efficient for solving the maximum subarray problem. This makes it a great solution for large datasets. </tr><tr><td>Simplicity:</td> Kadane&apos;s Algorithm is relatively easy to understand and implement compared to other algorithms for solving the maximum subarray problem, such as the divide-and-conquer algorithm. </tr><tr><td>Space Complexity:</td> Kadane&apos;s Algorithm has a space complexity of O(1), which means it uses a constant amount of memory irrespective of the size of the input array. </tr><tr><td>Dynamic Programming:</td> Kadane&apos;s Algorithm is a classic example of dynamic programming, a technique that breaks down a problem into smaller subproblems and stores the solutions to these subproblems to avoid redundant computation. </tr></ul> <h3>Disadvantages of Kadane&apos;s Algorithm:</h3> <ul> <tr><td>Only finds sum and not the subarray itself:</td> Kadane&apos;s Algorithm only finds the maximum sum of the subarray and not the actual subarray itself. If you need to find the subarray that has the maximum sum, you will need to modify the algorithm accordingly. </tr><tr><td>Does not handle negative numbers well:</td> If an input array has only negative numbers, the algorithm will return the maximum negative number instead of 0. This can be overcome by adding an additional step to the algorithm to check if the array has only negative numbers. </tr><tr><td>Not suitable for non-contiguous subarrays:</td> Kadane&apos;s Algorithm is specifically designed for contiguous subarrays and may not be suitable for solving problems that involve non-contiguous subarrays. </tr></ul> <h2>Applications of Kadane&apos;s algorithm:</h2> <p>There are some of its applications like the following:</p> <ul> <tr><td>Maximum subarray sum:</td> As we saw in the example above, Kadane&apos;s algorithm is used to find the maximum subarray sum of an array of integers. This is a common problem in computer science and has applications in data analysis, financial modeling, and other fields. </tr><tr><td>Stock trading:</td> Kadane&apos;s algorithm can be used to find the maximum profit that can be made by buying and selling a stock on a given day. The input to the algorithm is an array of stock prices, and the output is the maximum profit that can be made by buying and selling the stock at different times. </tr><tr><td>Image processing:</td> Kadane&apos;s algorithm can be used in image processing applications to find the largest contiguous area of pixels that meet a certain condition, such as having a certain color or brightness. This can be useful for tasks such as object recognition and segmentation. </tr><tr><td>DNA sequencing:</td> Kadane&apos;s algorithm can be used in bioinformatics to find the longest subsequence of DNA that meets certain conditions. For example, it can be used to find the longest common subsequence between two DNA sequences or to find the longest subsequence that does not contain certain patterns. </tr><tr><td>Machine learning:</td> Kadane&apos;s algorithm can be used in some machine learning applications, such as reinforcement learning and dynamic programming, to find the optimal policy or action sequence that maximizes a reward function. </tr></ul> <p>Therefore, we can say the advantages of Kadane&apos;s Algorithm make it a great solution for solving the maximum subarray problem, especially for large datasets. However, its limitations must be considered when using it for specific applications.</p> <hr></n;></pre></n;i++){>

C++'da Kod Uygulaması:

 #include using namespace std; int main() { int a[] = { -2, -3, 4, -1, -2, 1, 5, -3 }; int n = sizeof(a) / sizeof(a[0]); // Kadane&apos;s algorithm int max_so_far = INT_MIN, max_ending_here = 0; for (int i = 0; i <n; i++) { max_ending_here="max_ending_here" + a[i]; if (max_so_far < max_ending_here) max_so_far="max_ending_here;" (max_ending_here 0) } cout << \'maximum contiguous sum in the array is : \'<<max_so_far<<endl; return 0; pre> <p> <strong>Output</strong> </p> <pre> Maximum contiguous sum in the array is : 7 </pre> <h2>Advantages and Disadvantages of Kadane&apos;s algorithm:</h2> <h3>Advantages of Kadane&apos;s Algorithm:</h3> <ul> <tr><td>Efficiency:</td> Kadane&apos;s Algorithm has a time complexity of O(n), which makes it very efficient for solving the maximum subarray problem. This makes it a great solution for large datasets. </tr><tr><td>Simplicity:</td> Kadane&apos;s Algorithm is relatively easy to understand and implement compared to other algorithms for solving the maximum subarray problem, such as the divide-and-conquer algorithm. </tr><tr><td>Space Complexity:</td> Kadane&apos;s Algorithm has a space complexity of O(1), which means it uses a constant amount of memory irrespective of the size of the input array. </tr><tr><td>Dynamic Programming:</td> Kadane&apos;s Algorithm is a classic example of dynamic programming, a technique that breaks down a problem into smaller subproblems and stores the solutions to these subproblems to avoid redundant computation. </tr></ul> <h3>Disadvantages of Kadane&apos;s Algorithm:</h3> <ul> <tr><td>Only finds sum and not the subarray itself:</td> Kadane&apos;s Algorithm only finds the maximum sum of the subarray and not the actual subarray itself. If you need to find the subarray that has the maximum sum, you will need to modify the algorithm accordingly. </tr><tr><td>Does not handle negative numbers well:</td> If an input array has only negative numbers, the algorithm will return the maximum negative number instead of 0. This can be overcome by adding an additional step to the algorithm to check if the array has only negative numbers. </tr><tr><td>Not suitable for non-contiguous subarrays:</td> Kadane&apos;s Algorithm is specifically designed for contiguous subarrays and may not be suitable for solving problems that involve non-contiguous subarrays. </tr></ul> <h2>Applications of Kadane&apos;s algorithm:</h2> <p>There are some of its applications like the following:</p> <ul> <tr><td>Maximum subarray sum:</td> As we saw in the example above, Kadane&apos;s algorithm is used to find the maximum subarray sum of an array of integers. This is a common problem in computer science and has applications in data analysis, financial modeling, and other fields. </tr><tr><td>Stock trading:</td> Kadane&apos;s algorithm can be used to find the maximum profit that can be made by buying and selling a stock on a given day. The input to the algorithm is an array of stock prices, and the output is the maximum profit that can be made by buying and selling the stock at different times. </tr><tr><td>Image processing:</td> Kadane&apos;s algorithm can be used in image processing applications to find the largest contiguous area of pixels that meet a certain condition, such as having a certain color or brightness. This can be useful for tasks such as object recognition and segmentation. </tr><tr><td>DNA sequencing:</td> Kadane&apos;s algorithm can be used in bioinformatics to find the longest subsequence of DNA that meets certain conditions. For example, it can be used to find the longest common subsequence between two DNA sequences or to find the longest subsequence that does not contain certain patterns. </tr><tr><td>Machine learning:</td> Kadane&apos;s algorithm can be used in some machine learning applications, such as reinforcement learning and dynamic programming, to find the optimal policy or action sequence that maximizes a reward function. </tr></ul> <p>Therefore, we can say the advantages of Kadane&apos;s Algorithm make it a great solution for solving the maximum subarray problem, especially for large datasets. However, its limitations must be considered when using it for specific applications.</p> <hr></n;>

Kadane algoritmasının avantajları ve dezavantajları:

Kadane Algoritmasının Avantajları:

    Yeterlik:Kadane Algoritmasının O(n) zaman karmaşıklığı vardır, bu da onu maksimum alt dizi sorununu çözmede çok verimli kılar. Bu, onu büyük veri kümeleri için mükemmel bir çözüm haline getirir.Basitlik:Kadane Algoritmasının anlaşılması ve uygulanması, maksimum alt dizi problemini çözmeye yönelik böl ve yönet algoritması gibi diğer algoritmalarla karşılaştırıldığında nispeten kolaydır.Uzay Karmaşıklığı:Kadane Algoritmasının uzay karmaşıklığı O(1)'dir; bu, giriş dizisinin boyutundan bağımsız olarak sabit miktarda bellek kullandığı anlamına gelir.Dinamik program:Kadane Algoritması, bir problemi daha küçük alt problemlere bölen ve gereksiz hesaplamayı önlemek için bu alt problemlerin çözümlerini saklayan bir teknik olan dinamik programlamanın klasik bir örneğidir.

Kadane Algoritmasının Dezavantajları:

    Alt dizinin kendisini değil yalnızca toplamı bulur:Kadane Algoritması gerçek alt dizinin kendisini değil, yalnızca alt dizinin maksimum toplamını bulur. Maksimum toplamı olan alt diziyi bulmanız gerekiyorsa algoritmayı buna göre değiştirmeniz gerekecektir.Negatif sayıları iyi işlemez:Bir giriş dizisinde yalnızca negatif sayılar varsa, algoritma 0 yerine maksimum negatif sayıyı döndürür. Dizinin yalnızca negatif sayılara sahip olup olmadığını kontrol etmek için algoritmaya ek bir adım eklenerek bu durumun üstesinden gelinebilir.Bitişik olmayan alt diziler için uygun değildir:Kadane Algoritması özellikle bitişik alt diziler için tasarlanmıştır ve bitişik olmayan alt dizileri içeren sorunların çözümü için uygun olmayabilir.

Kadane algoritmasının uygulamaları:

Aşağıdaki gibi bazı uygulamaları vardır:

    Maksimum alt dizi toplamı:Yukarıdaki örnekte gördüğümüz gibi Kadane algoritması bir tam sayı dizisinin maksimum alt dizi toplamını bulmak için kullanılıyor. Bu, bilgisayar bilimlerinde yaygın bir sorundur ve veri analizi, finansal modelleme ve diğer alanlarda uygulamaları vardır.Hisse senedi ticareti:Kadane'nin algoritması, belirli bir günde bir hisse senedi alıp satarak elde edilebilecek maksimum karı bulmak için kullanılabilir. Algoritmanın girdisi bir hisse senedi fiyatları dizisidir ve çıktı ise hisse senedinin farklı zamanlarda alınıp satılmasıyla elde edilebilecek maksimum kârdır.Görüntü işleme:Kadane'nin algoritması, görüntü işleme uygulamalarında, belirli bir renk veya parlaklığa sahip olma gibi belirli bir koşulu karşılayan en büyük bitişik piksel alanını bulmak için kullanılabilir. Bu, nesne tanıma ve segmentasyon gibi görevler için yararlı olabilir.DNA dizilimi:Kadane'nin algoritması biyoinformatikte belirli koşulları karşılayan en uzun DNA dizisini bulmak için kullanılabilir. Örneğin, iki DNA dizisi arasındaki en uzun ortak alt diziyi bulmak veya belirli desenler içermeyen en uzun alt diziyi bulmak için kullanılabilir.Makine öğrenme:Kadane'nin algoritması, takviyeli öğrenme ve dinamik programlama gibi bazı makine öğrenimi uygulamalarında, bir ödül işlevini en üst düzeye çıkaran en uygun politikayı veya eylem dizisini bulmak için kullanılabilir.

Dolayısıyla Kadane Algoritmasının avantajlarının onu özellikle büyük veri kümeleri için maksimum alt dizi probleminin çözümünde harika bir çözüm haline getirdiğini söyleyebiliriz. Ancak belirli uygulamalar için kullanıldığında sınırlamaları dikkate alınmalıdır.

bu monitör ne kadar büyük