簡體   English   中英

Python中的子集總和(動態編程) - 復雜性問題

[英]Subset sum (dynamic programming) in Python - complexity problem

我對解決 Python 中子集總和問題的函數的某些實現有問題。

我們這里有動態規划,所以復雜度應該是多項式的。

問題是如果集合的大小線性增長並且數字的大小也線性增長(當然它不是數字的對數)那么代碼執行時間會呈指數增長。

我的猜測是這可能是由於特定的實現。 有沒有可能以某種方式改進它?

Python中的代碼:

def subsetsum(array,num):

    if num == 0 or num < 1:
        return None
    elif len(array) == 0:
        return None
    else:
        if array[0] == num:
            return [array[0]]
        else:
            with_v = subsetsum(array[1:],(num - array[0])) 
            if with_v:
                return [array[0]] + with_v
            else:
                return subsetsum(array[1:],num)

您正在使用 slice 來傳遞array后綴,這將制作一個具有線性運行時間的副本。 為避免這種情況,您可以改為傳遞索引。 另一個優點是索引是可散列的,因此您可以緩存(或memoize )並避免重新計算答案:

from functools import lru_cache

def ssum(array, N):
    @lru_cache(maxsize=None)
    def subsetsum(idx, num):
        if num < 1 or idx >= len(array):
            return frozenset()
        if array[idx] == num:
            return frozenset([idx])
        with_v = subsetsum(idx + 1, num - array[idx])
        if with_v:
            return with_v | frozenset([idx])
        else:
            return subsetsum(idx + 1, num)
    return list(array[i] for i in subsetsum(0, N))
>>> ssum([1,1,2], 4)
[1, 1, 2]

不幸的是,仍然存在復制從后綴獲得的答案的成本

暫無
暫無

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

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