我的问题是,如何对5~7个集合应用交集。假设每个集合都有一组元素。请帮我创建一个算法,并说明这个过程的复杂度。
我的问题是,如何对5~7个集合应用交集。假设每个集合都有一组元素。请帮我创建一个算法,并说明这个过程的复杂度。
I = S_1;
For each set s in S_2 ... S_N:
For each element ei in I:
if ei not in s
remove ei from I
endif
endfor
endfor
如果每个集合有m个元素,且有N个集合,则复杂度为m^2xN。如果集合已排序,则可以通过二分搜索实现mlog(m)N的复杂度,或者在已排序情况下使用两个迭代器来实现O(mN)的复杂度。
假设集合中的元素可以被哈希,并且您有某个类似于字典的哈希键设施(或者可以创建自己的设施,这不难):
List<Set<element-type>> sets; \\your list of sets to intersect
int size = SUM{List[*].Count}; \\ size for the hash
Dictionary<element-type,int> Tally = New Dictionary<element-type,int>(size);
// Add all elements to the Tally hash
foreach set in sets
{
foreach e in set
{
if (Tally.Exists(e))
Tally[e]++;
else
Tally.Add(e,1);
}
}
//Now, find the Tally entries that match the number of sets
foreach kvp in Tally.KeyValuePairs
{
If (kvp.Value == sets.Count)
// add the Key to output list/set
Output.Add(kvp.Key);
}