我要实现一种算法,其中我在纸上认为的方式与我们的教科书中建议的伪代码略有不同。我试图说服自己,下面的两个和一个分别实现'包含'和生成所有子集时,下面伪的2个片段将做同样的事情而没有时间复杂度的任何重大差异。我无法想出能说服我的严谨的事情。
T和A是有限集I的子集。没有集合或子集是空的,并且每个集合都有一个称为“计数”的“字段”。
Snippet One:
For-each t in T do {
A_t = A intersected with the set of all non-empty subsets of t
For-each a in A_t do {
a.count++
}
}
Snippet Two:
For-each a in A do {
a.count = count(a, T)
}
此处计数由
定义count(a, T) {
c = 0
For-each t in T do {
if (t contains a) {
c++
}
return c
}
答案 0 :(得分:1)
这取决于您如何实现子集生成和包含功能。我的猜测是,在大多数情况下,生成所有这些子集并不值得(a
A_t
if a
位于A
和子集中t
a
,A_t
a
A
位于t
而a
包含For-each t in T do {
For-each a in A do {
if (t contains a){
a.count++
}
}
}
,您可以重写For-each a in A do {
For-each t in T do {
if (t contains a){
a.count++
}
}
}
你的第一个片段
a
而你的第二个片段是
A
(在两种情况下,假设a.count
中的所有{{1}},{{1}}最初设置为0)