簡體   English   中英

給定重復元素集中不同元素的子集總數的算法

[英]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)方法,其中mA中不同元素的數量。

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.

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