Recursion 生成n位字符串的分治算法?

Recursion 生成n位字符串的分治算法?,recursion,combinations,divide-and-conquer,space-complexity,Recursion,Combinations,Divide And Conquer,Space Complexity,有人能告诉我如何生成n位字符串(所有可能的组合),即使用分治法从0到2^n-1计算位 我可以用下面的算法做到这一点,但是空间复杂度和时间复杂度都是O(2^n)。 有没有人能给我一个更好的算法(使用分治),它需要的空间比这个少 ArrayList generate(int n) { if(n==1) { Create an arrayList and store strings "0" and "1"; }

有人能告诉我如何生成n位字符串(所有可能的组合),即使用分治法从0到2^n-1计算位

我可以用下面的算法做到这一点,但是空间复杂度和时间复杂度都是O(2^n)。 有没有人能给我一个更好的算法(使用分治),它需要的空间比这个少

ArrayList generate(int n)
 {
      if(n==1) 
         {  
            Create an arrayList and store strings "0" and "1";
         }
     else
    {
         generate(n-1)

         now recompose the solution to get 2^n strings and return this arraylist
         "PROBLEM here is that the length of the array list is also getting
         exponential"

    }
 }

我相信你被误解了。生成位字符串本身不是问题,因此您无法为其提出解决方案。也许你遗漏了问题的一部分。例如,您可以使用位字符串定义解决方案的表示,然后尝试为给定问题找到最佳位字符串

还有一件事,一般来说,一个问题的时间复杂度表示为一个n位字符串总是O(2^n),除非问题被定义。然后,您可以使用问题的标准来降低复杂性。但在定义问题之前,生成和遍历n位字符串总是需要您处理每个可能的2^n组合

编辑:

如果必须的话,这里有一个用于“分而治之”的伪代码:

solution breakdown(problem p)
{
    if (smallenough(p))
    {
        return solve(p);
    }
    problem[] subproblems = divide(p);
    solution[] subsolutions;
    for (i=0; i<count(subproblems); i++)
    {
        subsolutions[i] = breakdown(subproblems[i]);
    }
    return reconstruct(subsolutions);
}
解决方案分解(问题p)
{
if(足够小(p))
{
返回解(p);
}
问题[]子问题=除法(p);
溶液[]亚溶液;

对于(i=0;iYes)你说得对,我需要从2^n个可能的位字符串集合中找到一个位字符串,但在找到该位字符串之前,我必须能够生成这些位字符串,然后看看其中哪一个是最优化的(蛮力方法)。因此,我面临一个使用分治生成这些n位字符串的问题,如果你能给出同样的分治算法,请帮助我。我希望我已经说清楚了!!这里你的解决方案是使用与2^n成比例的空间。我甚至可以用这个约束来解决这个问题。但我想用空间复杂度O(n)和使用分治方法是错误的!它的空间复杂度不是O(2^n),而是O(n)!每个(子)问题只被划分一次。这意味着你最多可以有n个子问题。因此空间复杂度与n成正比。实际上我不认为这会导致O(n).您刚刚给出了一个伪代码,如果您可以尝试使用伪代码构建一个工作代码(可能在Java中,这很容易),然后我们可以验证