python - 一种生成满足特定条件的集合的子集的算法

标签 python algorithm subset

假设我得到了一个排序的元素列表,我想生成满足某个条件的所有子集,这样如果给定的集合不满足条件,那么更大的子集也不会满足它,并且一个集合的所有集合元素确实满足它。

例如,给定一个所有小于100的正整数的列表,确定其和小于130的子集:(100,29) (0,1,40), (0), etc...

我该怎么做(最好使用 Python)?

谢谢! :)

最佳答案

您可以使用 Branch-and-bound 生成所有子集技术:您可以以增量方式生成所有子集(生成已经确定的子集的超集),使用修剪条件“如果根不满足约束,则不探索树的这个分支”。

如果你想在约束方面通用,我认为这是最好的策略。

一定要以正确的方式编写生成子集的代码,否则你会生成很多次相同的子集:为了避免记忆化,这可能会因 map 查找而耗时并引入内存开销,你可以以这种方式生成子集:

GetAllSubsets(List objects) {
    List generated = {};
    GetAllSubsets(generated, [], objects);
    return generated;
}

GetAllSubsets(List subsetGenerated, List objectFixed, List objectsToFix) {
    GetAllSubsets(subsetGenerated, objectFixed, objectsToFix.sublist(1, objectsToFix.length());
    if (satisfy(toCheck = objectsFixed.add(objectsToFix.get(0)))) {
        subsetGenerated.add(toCheck);
        GetAllSubsets(subsetGenerated, toCheck, objectsToFix.sublist(1, objectsToFix.length());
    }
}

事实上,第一次调用 GetAllSubsets 添加的子集没有 objectsToFix 的第一个元素,而第二次调用(如果不违反修剪条件)添加的子集有那个元素,所以交集生成的两组子集中的一个为空。

关于python - 一种生成满足特定条件的集合的子集的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/936015/

相关文章:

c++ - 如何将 std::vector 的某些元素移动到 vector 中的新索引?

python - 在 Matlab 中动态地向图形数据结构添加节点和边

r - 如何生成一个矩阵来存储集合的所有非空子集

python - 在 Python 中导入 XML 字典

python - 标准输出和冲洗?它是追加而不是冲洗

python - Qt 和 Python,在哪里配置信号和槽

algorithm - 如何生成具有单位长度列的随机 n*y 矩阵?

python - 如何停止 Python 脚本但让解释器继续运行

r - 根据第二数据集中的元数据从数据集中提取数据

xml - 是否有简化的 XML 子集的规范?