[英]Algorithm for total number of subsets of distinct elements in a given set of repetitive elements
我必須找出'k'(k> 1)的子集總數,其長度包含不同的元素。 如果碰巧有一個相同的元素但具有不同的索引,則認為兩個子集是不同的。 請參見下面的示例。
給定集合A = {1,1,2,3}。
對於k = 2,可能的子集為{1(index = 1),2},{1(index = 2),2},{1(index = 1),3},{1(index = 2), 3}和{2,3}。 總= 5。
對於k = 3,可能的子集為{1(index = 1),2、3},{1(index = 2),2、3}。 總= 2。
對於k = 4,可能的子集= 0。
我必須為10 ^ 5長度的數組計算此值。 是否有任何組合邏輯?
這是一種O(m * k)
方法,其中m
是A
中不同元素的數量。
A
每個不同元素映射到其出現次數(您可以將哈希映射用於O(n)
運行時)。 讓這些數字成為
c[1], c[2], ..., c[m]
現在您可以看到k
不同的集合的總數是所有可能乘積的總和
c[i1] * c[i2] * ... * c[ik]
(在您的示例中, c[1] = 2, c[2] = 1, c[3] = 1
,您可以看到具有2個不同元素的集合的數量為2*1+1*1+2*1 = 5
)。
您還可以看到此數字是多項式中x^k
前面的系數:
(1+c[1]*x)*(1+c[2]*x)*...*(1+c[m]*x)
這可以通過乘以每個多項式1 + c[i]* x
更新度為k
的多項式(在開始時初始化為常數1
)來迭代計算。
運行時間為O(m * k)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.