【问题标题】:Algorithm: How to find sub set of a set when new elements are added?算法:添加新元素时如何找到集合的子集?
【发布时间】:2017-06-22 10:31:49
【问题描述】:

我有一个子集算法,可以找到给定集合的所有子集。原始集合的问题是它是一个不断增长的集合,如果向其中添加元素,我需要再次重新计算它的子集。

有没有一种方法可以优化子集算法,该算法可以从最后一个计算点重新计算子集,而不是一次又一次地计算整个事物。

        public static IEnumerable<IEnumerable<T>> SubSetsOf<T>(IEnumerable<T> source)
        {
            if (!source.Any())
                return Enumerable.Repeat(Enumerable.Empty<T>(), 1);

            var element = source.Take(1);

            var haveNots = SubSetsOf(source.Skip(1));
            var haves = haveNots.Select(set => element.Concat(set));

            return haves.Concat(haveNots);
        }

        private static bool Valid(IEnumerable<int> set)
        {
            bool flag = false;

            foreach (var element in set)
            {
                var f = element > 0;
                if (f == flag)
                {
                    return false;
                }

                flag = f;
            }

            return true;
        }

【问题讨论】:

  • 添加元素时获得的唯一新子集是包含它的子集,因此如果您在添加元素 e 之前已经知道所有子集的集合 C,则添加“S union e” C 中每个子集 S 的集合。

标签: algorithm recursion subset dynamic-programming


【解决方案1】:

当然你只需要对每个先前生成的元素应用相同的算法到额外的集合(仅增长部分)

例如:

如果生成的子集是s1, s2, ... , sn

您的集合从a1a2a3 增长到a1a2a3a4a5

您需要将子集迭代到额外添加的集合:

for set x in subsets do :
    generate(x)
        generate(x + a4)
        generate(x + a5)

顺便说一句我看到你添加了动态编程标签,但我不认为这是一个 dp 问题,因为 dp 主要用于需要最大化/最小化/计数子集的问题,但不是自己生成子集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 2019-09-03
    • 2017-01-03
    • 2016-02-20
    • 1970-01-01
    相关资源
    最近更新 更多