查找集合的所有子集,DP解决方案?

时间:2016-05-10 15:27:13

标签: algorithm dynamic-programming memoization

我遇到了找到一组和一组子集的问题。我想知道我的算法是否正确。我使用递归方法和哈希表来存储已经计算过的子集,并说输入字符串是" ABCD":

1)我的方法是添加单个字符作为散列键和键的子集,以便计算为值。例如,在我的哈希表中,' B'对于给定的输入字符串,看起来像" B"," BC"," BD"," BCD"。调用堆栈的函数然后将使用这些子字符串来形成更多子集。例如" AB",ABC"," ABD"," ABCD"。

2)我使用for循环迭代剩余的字符并检查给定字符的子集是否在散列表中,如果没有,我递归并形成子集并存储它们。

这个算法的想法是我不必重新计算已经看过的子集,然后截断后续的函数调用。例如A-> C,A-> D,因为当在' B'中进行for循环时,计算C和D的所有子集。正在执行。

我的memoized算法是否正确? 即使在我记忆后,运行时间是否为O(2 ^ n)?提前感谢您的回复。请原谅我,如果我在任何地方都犯了错误,你的评论肯定会帮助我提高。再次感谢!

2 个答案:

答案 0 :(得分:0)

你的记忆算法似乎是正确的。但复杂性大于O(2 ^ n)并且取决于您的哈希函数。

这是NP完全问题。如果n的大小很大,那么你就无法记住。但是如果n很小(如20),那么你可以使用dp(Bitmasking + dp)解决这类问题。

我已经在下面展示了迭代的想法。

for(i=0;i<(1<<n);i++){
   subset=""
   for(j=0;j<n;j++){
      if( (i&(1<<j)) != 0 ) //if jth character of binary i is 1, then add jth item 
        add jth item to subset
   }
   print(subset)

}

答案 1 :(得分:0)

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;

    public class MainClass {

        static List<List<char[]>> list = new ArrayList<List<char[]>>();

        // static List<int[]> list1 = new ArrayList<int[]>();
        public static void main(String[] args) {
            List<char[]> list1 = new ArrayList<char[]>();
            char[] a = {'A','B','C','D'};
            generate(a, 0, 0, list1);

            for (List<char[]> l : list) {
                for (char[] b : l) {
                    for (char c : b) {
                        System.out.print(c + ",");
                    }
                    System.out.println();
                }
            }

        }

        public static void generate(char[] array, int offset, int index, List<char[]> list1) {
            if (offset >= array.length)
                return;
            char[] newArray = Arrays.copyOfRange(array, offset, index);
            list1.add(newArray);
            if (index >= array.length) {
                list.add(list1);
                offset++;
                index = offset;
                generate(array, offset, index, new ArrayList<char[]>());
            } else {
                index++;
                generate(array, offset, index, list1);
            }
        }
    }