【问题标题】:Algorithm for calculating the power set计算功率集的算法
【发布时间】:2017-01-25 02:02:16
【问题描述】:

我刚刚发现了一种寻找幂集的算法。我在谷歌上搜索了解决方案,但没有找到任何好的解决方案,所以我自己想出了一个。但我想知道它是什么算法,因为我在网上或任何书中都找不到它。我的意思是,它有名字吗?与我在一些网站上找到的计算幂集的算法相比,我认为我的要好得多,不知道为什么没有人使用它?

这是算法:

R <- []
L <- [ e1, e2 ... en ]
c <- 0
function: powerSet(L, c)
  R <- R union L
  for e in L starting at c
    powerSet(L\{e}, c)
  end
  return R
end

这里是用Java实现的:

public static void powerSet(List<String> list, int count)
{
  result.add(list);

  for(int i = count; i < list.size(); i++)
  {
    List<String> temp = new ArrayList<String>(list);
    temp.remove(i);

    powerSet(temp, i);
  }
}

【问题讨论】:

    标签: java algorithm math


    【解决方案1】:

    查看Rosetta Code Power Set 页面。那里有一些递归解决方案的实现(包括 Java 解决方案)。但总的来说,递归解决方案意味着一个非常大的调用堆栈,这会减慢速度。

    【讨论】:

      【解决方案2】:

      主要有两个原因:

      1. 它使用全局变量;
      2. 它是递归的,尽管这并不重要,因为它是一个O(2^n) 算法。

      【讨论】:

      • +1。它还为原始集合中的每个元素添加空集合。
      • 我应该指出我只将我的算法与其他 O(2^n) 算法进行比较。我知道这非常慢。我想出这个算法是因为我们在学校有任务要创建一个蛮力算法。但要成为一个蛮力算法,我认为我的我真的很好。我真的不明白为什么使用全局变量会成为问题。在许多情况下,您实际上并没有将集合存储在结果中,而是对集合执行操作。 ChssPly76,它只添加了一个空集,这就是空集。算法的结果就是幂集,没有别的。
      • 一个幂集由 2^n 个元素组成,因此算法必须至少为 O(2^n),除非我大错特错。 @rejeep
      【解决方案3】:
      public final static Set<Set<Character>> powerSet(Set<Character> s){
          Set<Set<Character>> result = new HashSet<Set<Character>>();
          result.add(s);
          for (Character c:s){
              Set<Character> subSet = new HashSet<Character>(s);
              subSet.remove(c);
              result.addAll(powerSet(subSet));
          }
          return result;
      }
      

      【讨论】:

      • -1:用低效的代码恢复死线程 :-) 这是 Omega(n!)。不是 O(2^n)。
      猜你喜欢
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 2019-02-05
      • 2014-12-18
      • 1970-01-01
      • 2021-03-24
      • 2020-01-21
      • 1970-01-01
      相关资源
      最近更新 更多