将 {<1,2>, <1,3>, <1,7>, <0,4>} 视为关系 R 的元组集合。现在考虑 R 由(通过其隶属函数)表示BDD。也就是说,表示 R 的 BDD 取决于变量 {x1,x2,y1,y2,y3} 其中 {x1,x2} 用于表示每个元组的第一个元素,{y1,y2,y3} 用于表示第二个元素。
现在,考虑查找在其第一个元素中具有唯一值的元组集合的问题。对于该集合之上的关系将是 {<0,4>}。所有其他元素都被丢弃,因为它们在第一个组件中超过一个具有 1 的值。
作为第二个例子,考虑与元组集合 {<1,2>, <1,3>, <1,7>, <2,3>, <2,5>, <0,4>} 的关系。在这种情况下,预期结果仍然是 {<0,4>} 因为 2 作为第一个元素出现了不止一次。
这个问题也可以看作是对变量 {y1,y2,y3} 的抽象化,从而只保留 {x1,x2} 的唯一值。有了这个结果,可以通过计算得到的 BDD 与输入的结合来重建预期的关系。
总之,问题是:必须对 R 的表示执行哪些 BDD 操作才能获得仅具有唯一元组的 BDD。
请注意,这是对这个问题的概括
编辑1: 以下代码反映了我到目前为止的实现。但是,我想知道是否有可能获得更高效的版本。为简单起见,我有意省略了计算表的处理(对于获得更好的时间复杂度至关重要)。另外,我使用 &, | 和 !表示 BDD 上的合取、析取和补码操作。
BDD uniqueAbstract(BDD f, BDD cube) {
if ((f.IsZero() || f.IsOne()) && !cube.IsOne())
return zero();
BDD T = high(f);
BDD E = low(f);
if(level(f) == level(c)) { // current var is abstracted
BDD uniqueThen = uniqueAbstract(T, high(c));
BDD existElse = existAbstract(E, high(c));
BDD existThen = existAbstract(T, high(c));
BDD uniqueElse = uniqueAbstract(E, high(c));
return (uniqueThen & !existElse) | (uniqueElse & !existThen)
} else {
BDD uniqueThen = uniqueAbstract(T,c);
BDD uniqueElse = uniqueAbstract(E,c);
return ite(top(f), uniqueThen, uniqueElse);
}
}
EDIT2:在尝试了三种不同的实现之后,仍然存在一些性能问题。让我来描述他们三个。
本次更新的目标是分析一下使用这三种方法的结果。由于此时时间度量似乎会误导判断它们,因此我决定在一组不同的度量上评估实现。
- 递归调用
- 缓存命中
- 抽象简单。无需存在抽象即可解决函数调用的次数。
- 抽象复合体:需要存在抽象解决函数调用的次数。
- 存在抽象:对存在抽象的调用次数。
实现 1 的结果:(21123 毫秒):唯一抽象统计:递归调用:1728549.000000 缓存命中:638745.000000 非抽象:67207.000000 简单抽象:0.000000 复杂抽象:0.000000 现有抽象:1593430.000000
实现 2 的结果:(运行时间:54727 毫秒)唯一抽象统计:递归调用:191585.000000 缓存命中:26494.000000 简单抽象:59788.000000 复杂抽象:12011.000000 现有抽象:24022.000000
实现 3 的结果:(运行时间:20215 毫秒)唯一抽象统计:递归调用:268044.000000 缓存命中:30668.000000 简单抽象:78115.000000 复杂抽象:46473.000000 现有抽象:92946.000000
编辑 3:根据 ITE 5实施每个逻辑操作后获得以下结果。
uniqueAbstractRecRef (21831 ms) 唯一抽象统计:总调用:1723239 优化调用:0 总存在抽象调用:30955618 对存在抽象的唯一抽象调用:2385915 总 ite 调用:3574555 在总时间中,uniqueAbstractRecRef 需要 4001 毫秒 (12.4%)
uniqueAbstractSERec (56761 ms) 唯一抽象统计:总调用:193627 优化调用:60632 总存在抽象调用:16475806 对存在抽象的唯一抽象调用:24304 总 ite 调用:1271844 在总时间中,uniqueAbstractSERec 需要 33918 ms (51.5%)
uniqueAbstractRec (20587 ms) 唯一抽象统计:总调用:270205 优化调用:78486 总存在抽象调用:13186348 对存在抽象的唯一抽象调用:93060 总 ite 调用:1256872 在总时间中,uniqueAbstractRec 需要 3354 ms (10.6%)