我有一个带有属性(A B C D)的关系模式。我也有一套函数依赖关系。
现在我需要确定R属性的所有可能子集的闭包。这就是我被困住的地方。我需要学习如何在PHP中查找子集(非重复)。
我的数组是这样存储的。
$ATTRIBUTES = ('A', 'B', 'C', 'D').
字符串
所以我的子集应该
$SUBSET = ('A', 'B', 'C', 'D', 'AB', 'AC', AD', 'BC', 'BD', 'CD', 'ABC', 'ABD', 'BCD', 'ABCD')
型
代码不应该是什么大的,但出于某种原因,我不能让我的头周围。
5条答案
按热度按时间zbdgwd5y1#
使用php array_merge我们可以有一个很好的短powerSet函数
字符串
uoifb46i2#
你想要
$attributes
的电源组?这就是你的问题所暗示的。一个例子可以在这里找到(引用完整)
字符串
wixjitnu3#
这里有一个回溯解决方案。
给定一个函数,返回输入集的所有L长度子集,查找从L = 2到数据集输入长度的所有L长度子集
字符串
nzk0hqpo4#
基于@Yada的答案,这将生成数组的幂集,但保留每个子集中原始数组的键(返回值仍然是数字和顺序索引)。如果你需要一个关联数组的子集,这是非常有用的。
这些子集还保留原始数组的元素顺序。我在
$results
中添加了一个稳定排序,因为我需要它,但您可以省略它。字符串
给定OP的输入,
var_dump(power_set(['A', 'B', 'C', 'D']));
提供:型
ct3nt3jp5#
在@fbstj回答之后,我更新了函数:
sprintf
(@Titus评论)字符串
由于幂集函数会增加很多内存负载(2count($in)次迭代),请考虑使用Generator:
型
用途:
型