js高效組合演算法(遞迴)

2021-10-03 04:18:34 字數 1047 閱讀 9959

當在使用sku商品選擇實現的過程中,發現獲取潛在sku需要用到組合演算法;

很多人用的01位移法則,我個人覺得不好,下面是我選擇方法

假如乙個單品的引數組合是:a 、b、c、d  當成乙個陣列a[4] = [a ,b,c,d]

用c(4,m)表示從這4個數中選擇m個數,求其所有的情況。

首先要明確,求一組數的組合問題,元素是沒有位置要求的,即對於c(4,2)的求解和是一種情況。因此,為了防止結果的多餘項,必須保證在求解過程中,原陣列的元素位置是固定的!

1、選取乙個元素,即求解c(4,1)時,按序號從陣列中順序取出乙個元素,結果為a 、b、c、d

2、選取兩個元素,即求解c(4,2)時,先按序號從陣列中順序取出乙個元素,再在取出的元素後面的元素中選取乙個元素。設這個序號為i,則當i=4-2=2時為止(i從0開始),因為當i>3時,後面的元素不足1個。詳細如下:

第一次:i=0,第乙個選取    第二個在中選乙個,即求解c(3,1) 得到 (ab,ac,ad);

第二次:i=1,第乙個選取    第二個在中選乙個,即求解c(2,1) 得到 (bc,bd);

第三次:i=2,第乙個選取     第二個在中選乙個,即求解c(1,1);   得到 (cd), 序號為2,此時結束

3、選取三個元素,即求解c(4,3)時,先按序號從陣列中順序取出乙個元素,再在取出的元素後面的元素中選取兩個元素。設這個序號為i,則當i=4-3=1是時止(i從0開始),因為當i>2時,後面的元素不足2個。

4、以此類推,即組合c(n,m)的求解過程是:固定位置後,按順序取出乙個元素,再在此元素後面的元素中取m=m-1個元素,當取出的元素個數足夠了的時候,即此時m=0時,為遞迴的出口。

詳細**:

function combination(arr, m) 

for (let i = 0; i <= a.length - m; i++)

}}

參考文獻:

遞迴組合演算法

遞迴組合演算法 演算法思想 對於乙個長度為m的序列,要求n個數的組合。1.從索引最小的元素遍歷到第n m個元素,將遍歷到的元素定為組合中的第乙個元素 2.判斷組合中n個元素是否已滿,如果滿了,列印該組合,如果不滿重,則擷取1中選擇的元素之後的序列,復步驟一。include include using...

組合演算法 遞迴實現

假設在n個數中選取m 0 從n個數中選取編號最大的數,然後在剩下的n 1個數裡面選取m 1個數,直到從n m 1 個數中選取1個數。從n個數中選取編號更小的乙個數,繼續執行第一步,直到當前可選編號最大的值為m。下面是遞迴方法的實現 求從陣列a 1.n 中任選m個元素的所有組合。a 1.n 表示候選集...

排列組合演算法 遞迴 1

一.從指定陣列a n 中取出m位,不重複的所有結果 方法 獲取的子集合 出現的所有項不會重複,跟子集合的排列順序沒有關係 static void combine int a,int n,int m,int b,int m console.writeline 測試 排列組合測試 二 給定陣列,將陣列中...