JavaScript陣列所有項組合演算法


在這個問題陳述中,我們的任務是藉助Javascript功能獲取陣列中所有項的組合。為此,我們可以使用遞迴方法,迭代地將專案新增到正在執行的組合列表中。

理解問題陳述

問題陳述是在Javascript中編寫一個函式,該函式將幫助找出陣列中所有元素的組合,並建立一個單獨的陣列來顯示這些組合。例如,如果我們有一個數組[1, 2],那麼這個陣列的組合將是[[1, 2], [2]]。

給定問題的邏輯

可以使用遞迴演算法在Javascript中建立一個函式來獲取陣列中所有專案的組合,該演算法將迭代地將專案新增到組合列表中。所以首先我們將定義一個數組並將其初始化為空。在建立的函式中,我們將定義另一個函式來遞迴執行組合列表。

演算法

步驟1 - 宣告一個名為getCombinations的函式,該函式使用陣列引數。

步驟2 - 在函式內宣告一個結果陣列,該陣列將儲存最終的組合列表。

步驟3 - 定義另一個名為recurse的函式,該函式將接收兩個引數cur和rem,其中cur是正在執行的專案列表,rem是我們要新增到組合中的剩餘專案陣列。

步驟4 - 如果rem陣列中沒有剩餘專案,我們將current推入結果陣列,因為我們已經達到了所需的結果。

步驟5 - 否則,我們將迭代rem陣列中的每個專案,並使用包含當前專案的新cur陣列遞迴呼叫遞迴函式。

步驟6 - 使用空的cur陣列和我們想要為其生成組合的完整陣列最初呼叫recurse。

步驟7 - 返回包含輸入陣列所有可能組合的最終結果陣列。

演算法程式碼

//function to get the combinations of input array
function getCombinations(array) {
   const result = [];

   function recurse(cur, rem) {
      if (rem.length === 0) {
      result.push(cur);
      } else {
         for (let i = 0; i < rem.length; i++) {
            recurse([...cur, rem[i]], rem.slice(i + 1));
         }
      }
   }

   recurse([], array);
   return result;
}
//Example usage
const array = [10, 20, 30, 40];
const combinations = getCombinations(array);
console.log(combinations);

複雜度

上面建立的函式的時間複雜度為O(2^n),因為該演算法生成陣列中所有專案的組合,並且有2^n個可能的組合。程式碼的空間複雜度也是O(2^n),因為該演算法生成一個包含2^n個組合的列表。

結論

上述程式碼提供了一個簡單的解決方案,用於在Javascript中生成陣列中所有專案的組合。因此,它具有O(2^n)的時間和空間複雜度,這可能使它對於大型陣列效率較低。因此,在決定是否使用此演算法時,務必注意陣列的大小。

更新於:2023年5月18日

3K+ 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.