簡體   English   中英

子集的不同總和數

[英]Number of distinct sums of subsets

我有一組N,對於N> 3,不同的整數,問題是找到給定集合的3個子集的所有不同總和。 3子集是基數為3的子集。

我知道愚蠢的方法是對所有可能的總和進行立方搜索,然后整理所有重復項。 有沒有更有效的方法來做到這一點? 我在C編程

編輯:我想知道一般的更快的算法,如果說元素的數量增加。

使用動態編程,您可以在O(n*MAX)找到不同總和的數量 ,其中MAX是數組中的最大值。

我們來看看遞歸函數:

f(W,n,i) = f(W,n-1,i) OR (i != 0 ? f(W-item(n),n-1,i-1) : false)
f(0,0,0) = true
f(W,n,0) = false (W != 0)
f(W,0,i) = false (W != 0)
f(W,n,i) = false (W < 0)
(I have a feeling I forgot another failing base clause, so make sure if I didn't)

現在,如果你使用動態編程自下而上構建,最多W=3*MAX ,你的答案基本上是不同W的數量f(W,n,3) == true

構建表將是O(MAX*3 * n * 3) = O(MAX*n) ,計算給出所需總和的不同W s的數量的后處理階段是O(MAX) ,因此解決方案仍然存在O(MAX * n)

如果您懷疑可能有很多重復的和,那么您可以先計算所有不同的2子集和,並且對於您找到的每個不同的2子集和,跟蹤您找到的給出總和的對。 如果你的所有數字都是不同的,那么如果你找到另一對給你相同數額的數字,你應該將總和標記為“多數”,如果你願意,你可以刪除你為它存儲的那對。 現在你有一組2個子集的和,每個和有一個存儲的對,或者它被標記為“多個”。 對於每個2子集和,如果它被標記為“多個”,那么您遍歷原始集合中的所有數字,並通過將每個數字添加到您的2個子集和來記錄您可以形成的所有3個子集和。 否則,如果2個子集的總和未標記為“多個”並且您有一對(a,b)與之關聯,那么您執行相同的操作,除非您在迭代原始數字集時跳過a和b 。 這就是你獲得所有不同的3子集和的方法。 如果你有n個數字並且它們產生N個不同的2個子集和,那么如果你使用哈希表來檢測算法的兩個階段的重復,這種方法的復雜性是O(nN),這可能比粗暴要好得多強制O(n ^ 3 log n),特別是如果你有一組相當密集的整數。

暫無
暫無

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

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