我遇到了找到一组和一组子集的问题。我想知道我的算法是否正确。我使用递归方法和哈希表来存储已经计算过的子集,并说输入字符串是" 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)?提前感谢您的回复。请原谅我,如果我在任何地方都犯了错误,你的评论肯定会帮助我提高。再次感谢!
答案 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);
}
}
}