簡體   English   中英

我怎樣才能減少子集和問題的時間復雜度

[英]how can i reduce the time complexity of subset sum problem

所以最近我一直在嘗試解決一些有趣的問題,但在這個問題上陷入了困境。

給定一組對象 1 到 N。n1 個值為 0 的對象和 n2 個值為 1 的對象和 n3 個值為 2 的對象。需要計算總和為 3 或其倍數的所有子集。

n1+ n2 + n3 = N <= 100000 在滿足上述條件的情況下,n1、n2、n3的值也可以為0。

我已經能夠解決問題,但無法降低這個問題的時間復雜度。 我的解決方案仍然具有指數時間復雜度。 我試圖降低時間復雜度,以便我可以在 5 秒內運行 N = 100,000 的大型集合。

這是我偶然發現的另一個簡單但直觀的解決方案,但問題又是時間復雜度。

def mask(lst, m):
    # pad number to create a valid selection mask
    # according to definition in the solution laid out
    m = m.zfill(len(lst))
    return map(lambda x: x[0], filter(lambda x: x[1] != '0', zip(lst, m)))

def subset_sum(lst, target):
    # there are 2^n binary numbers with length of the original list
    for i in range(2**len(last)):
        # create the pick corresponsing to current number
        pick = mask(lst, bin(i)[2:])
        if sum(pick) == target:
            yield pick

我不需要確切的編碼解決方案,但如果你能指出正確的方向並且任何編程語言都可以,那就太好了,我想知道解決方案的邏輯/方法。

看起來,給定一個數字數組(所有數字均為 0、1 或 2),您想要返回這些數字的每個子集,這些數字總和為 3 的倍數,並且您希望以多項式的方式進行。

這是不可能的。

要看到這一點,請考慮數組 [2,1,0,0,0,0,0,...,0]。 為了得到 3 的總和,我們將始終需要前兩個數字,但除此之外,任何子集總和為 3。因為我們有N-2 0,所以總共有2**(N-2)個子集符合要求。 無法在多項式時間內返回指數數量的答案。

所以這里的一個關鍵知識就是和必須是3的倍數,即sum = 0 (mod 3)。

這意味着您可以在任何子集中包含盡可能多或盡可能少的 n1,因為它們不會改變總和。

因此,您可以立即將問題簡化為從 n2 和 n3 中找到總和為 0 (mod 3) 的子集,然后將所有可能的 2**n1 個子集添加到這些子集。 請注意,對於 n1 的任何顯着值(如 50 以上),列出它們變得無法計算。

但是很容易計算:

那么 go 如何從 n2 和 n3 中找到 sum = 0 (mod 3) 的集合。 我們知道 n2 中的任何元素都會使總和增加 1,給定 n2 中的 m 個元素,我們可以計算出有多少個元素是可能的

所以一個用於計數的松散偽代碼:

def f(n1,n2,n3):
    for i in range(0,n2+1):
        # i elements of n2
        # compute i%3
        # if i%3 0 then we can pick j = 0,3,6,9 ... elements from n3
        # if i%3 1 then we can pick j = 1,4,7,10 .. elements from n3
        # if i#3 2 then we cannot j = 2, 5, 8, 11 .. elements from n3
        # compute the combination c = (n choose i) * (n choose j) for each j
        # for each c multiply by 2**n1 (adding on all possible subsets from n1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM