使用Kadane演算法在JavaScript中查詢子陣列的最大和


探索複雜的演算法是釋放JavaScript程式設計真正潛力的關鍵,尤其是在解決複雜的計算挑戰方面。在這些演算法中,Kadane演算法作為一種強大的工具脫穎而出,可以有效地找到陣列中子陣列的最大和。這種卓越的技術允許開發人員最佳化他們的程式碼,並在處理大型資料集時提高應用程式的效能。在本文中,我們將深入探討Kadane演算法的細節,揭示其內部工作原理,並展示其在解決JavaScript中查詢子陣列最大和任務中的有效性。透過掌握底層原理並在實踐中實現此演算法,開發人員可以提升他們的程式設計技能,並征服計算問題解決領域。

問題陳述

在JavaScript中實現Kadane演算法,以查詢給定陣列中子陣列的最大和。

示例輸入:

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

示例輸出:

給定陣列中子陣列的最大和是6。最大和的子陣列是[4, -1, 2, 1]。

方法

在本文中,我們將看到幾種在JavaScript中解決上述問題陳述的不同方法:

  • 樸素方法

  • Kadane演算法(動態規劃)

  • 帶有索引的Kadane演算法

方法1:樸素方法

為了找到子陣列的最大和,樸素方法將maxSum初始化為-Infinity,並迭代每個索引i,表示子陣列的起始索引。對於每個起始索引i,它從i迭代到陣列的末尾,表示子陣列的結束索引。計算當前子陣列的和,如果它大於maxSum,則更新maxSum。最後,在兩個迴圈完成後返回最終的maxSum。

示例

在給定的程式碼中,變數maxSum最初設定為-Infinity,以確保遇到的任何正數和都將被視為新的最大值。外迴圈遍歷陣列的每個索引i,表示子陣列的起始索引。內迴圈從起始索引i迭代到陣列的末尾,表示子陣列的結束索引。在內迴圈的每次迭代中,變數sum跟蹤當前子陣列的和。使用Math.max(maxSum, sum)比較當前最大和與當前子陣列的和來更新最大和。最後,在兩個迴圈完成後,返回最終的最大和。

function maxSubarraySum(arr) {
   let maxSum = -Infinity;
   for (let i = 0; i < arr.length; i++) {
      let sum = 0;

      for (let j = i; j < arr.length; j++) {
         sum += arr[j];
         maxSum = Math.max(maxSum, sum);
      }
   }
   return maxSum;
}
const arr = [-2, 1, -3, 4, -1, 2, 1, -5, 4];
console.log(`Maximum Sum: ${maxSubarraySum(arr)}`);

輸出

以下是控制檯輸出:

Maximum Sum: 6

方法2:Kadane演算法(動態規劃)

Kadane演算法是一種動態規劃方法,用於在陣列中查詢最大子陣列和。它首先將兩個變數maxEndingHere和maxSoFar分別初始化為0和-Infinity。然後,它迭代陣列的每個索引i,透過比較當前元素arr[i]和以i-1結尾的先前子陣列的和加上當前元素來更新maxEndingHere。該演算法還透過比較當前maxSoFar和maxEndingHere來更新maxSoFar。最後,在迴圈完成後,該演算法返回最終的maxSoFar作為最大子陣列和。

示例

在提供的程式碼中,maxEndingHere和maxSoFar的初始值分別設定為0和-Infinity。實現一個迴圈來迭代陣列的每個索引i。在每次迭代中,使用Math.max(arr[i], maxEndingHere + arr[i])更新maxEndingHere。此比較確定擴充套件當前子陣列(透過新增arr[i])是否會產生更大的和,或者從arr[i]開始新的子陣列是否會產生更大的和。為了確保maxSoFar始終儲存迄今為止找到的最大和,透過使用Math.max(maxSoFar, maxEndingHere)比較當前maxSoFar與maxEndingHere來更新它。最後,迴圈完成後,返回最終的最大和(maxSoFar)。

function maxSubarraySum(arr) {
   let maxEndingHere = 0;
   let maxSoFar = -Infinity;

   for (let i = 0; i < arr.length; i++) {
      maxEndingHere = Math.max(arr[i], maxEndingHere + arr[i]);
      maxSoFar = Math.max(maxSoFar, maxEndingHere);
   }
   return maxSoFar;
}
const arr = [-2, 1, -3, 4, -1, 2, 1, -5, 4];
console.log(`Maximum Sum: ${maxSubarraySum(arr)}`);

輸出

以下是控制檯輸出:

Maximum Sum: 6

方法3:帶有索引的Kadane演算法

Kadane演算法是一種查詢陣列中子陣列最大和的技術。它涉及初始化變數,例如maxEndingHere、maxSoFar、start、end和tempStart。透過迭代陣列的每個索引,該演算法比較擴充套件當前子陣列(透過新增arr[i]的值)是否比從arr[i]開始新的子陣列產生更大的和。如果擴充套件子陣列更有利,則相應更新maxEndingHere和tempStart。該演算法還根據找到的最大和及其各自的索引更新maxSoFar、start和end。最終,該演算法返回一個包含最大和及其相應子陣列的物件。

示例

在給定的程式碼中,變數例如maxEndingHere、maxSoFar、start、end和tempStart的初始化方式與之前相同。一個迴圈迭代陣列的每個索引i。在迴圈內,if語句比較擴充套件當前子陣列(透過新增arr[i])的和與從arr[i]開始新的子陣列的和。如果擴充套件產生更大的和,則更新maxEndingHere和tempStart。最大和和相應的索引以與之前相同的方式更新。最後,該函式返回一個包含屬性maxSum(表示最大和)和subarray(表示相應子陣列)的物件。

function maxSubarraySum(arr) {
   let maxEndingHere = 0;
   let maxSoFar = -Infinity;
   let start = 0;
   let end = 0;
   let tempStart = 0;

   for (let i = 0; i < arr.length; i++) {
      if (arr[i] > maxEndingHere + arr[i]) {
         tempStart = i;
         maxEndingHere = arr[i];
      } else {
         maxEndingHere += arr[i];
      }

      if (maxEndingHere > maxSoFar) {
         start = tempStart;
         end = i;
         maxSoFar = maxEndingHere;
      }
   }

   return {
      maxSum: maxSoFar,
      subarray: arr.slice(start, end + 1)
   };
}
 
const arr = [-2, 1, -3, 4, -1, 2, 1, -5, 4];
const res = maxSubarraySum(arr);
console.log(`Maximum Sum: ${res.maxSum}`);
console.log(`Maximum Sum Subarray: ${res.subarray}`);

輸出

以下是控制檯輸出:

Maximum Sum: 6
Maximum Sum Subarray: 4,-1,2,1

結論

總之,使用Kadane演算法來確定JavaScript中子陣列的最大和,可以是一種提高效率和最佳化計算資源的有效技術。透過使用這種深奧的演算法,開發人員可以釋放隱藏的潛力,解開復雜的資料模式並提取有價值的見解。實現此演算法可能需要一定的技巧,但其回報是多方面的:加速效能、簡化操作以及在識別最大子陣列和方面的無與倫比的精度。總之,Kadane演算法的深奧能力使JavaScript程式設計師能夠超越傳統界限,並釋放其應用程式的真正潛力。

更新於:2023年8月4日

394 次瀏覽

啟動您的職業生涯

完成課程後獲得認證

開始
廣告