【问题标题】:vector size remaining static after pushback() calls for powerset function在 pushback() 调用 powerset 函数后向量大小保持不变
【发布时间】:2015-05-29 17:35:11
【问题描述】:

我编写了以下函数,作为this algorithm/approach 的实现,以生成给定字符串的幂集(所有子集的集合):

vector<string> getAllSubsets(string a, vector<string> allSubsets) 
{   
    if(a.length() == 1)
    {   
    // Base case, 
    allSubsets.push_back("");
    allSubsets.push_back(a);
    }

    else {
        vector<string> temp = getAllSubsets(a.substr(0,a.length()-1),allSubsets);
        vector<string> with_n = temp;
        vector<string> without_n = temp;
        for(int i = 0;i < temp.size()-1;i++) 
        {
            allSubsets.push_back(with_n[i] + a[a.length()-1]);
            allSubsets.push_back(without_n[i]);
        }
    }
    return allSubsets;

}

但是,似乎有人出了问题:tempallSubsets 的大小从递归调用到递归调用保持不变,而由于push_back() 调用它们应该增加。有什么理由会发生这种情况吗?

【问题讨论】:

  • 将参数 allSubsets 更改为通过引用而不是通过值传递。使用vector&lt;string&gt;&amp; allSubsets
  • 这不是问题,因为他将更改返回到 allSubsets,然后推回他的本地 allSubsets。他的价值应该包括在内。
  • 这似乎有许多不同的问题。正确的答案将需要处理所有这些。回答前请耐心等待!坦率地说,我对整个设计有点困惑。 getAllSubsets 不应该只接受一个参数,字符串吗?

标签: c++ string recursion vector powerset


【解决方案1】:

这是因为您遇到了一个错误。因为这发生在你的 next-to-base case 中,所以你永远不会插入任何条目。

由于第一个无效索引是temp.size()i &lt; temp.size() 意味着您将始终拥有一个有效索引。减去 1 意味着您缺少向量的最后一个元素。

值得注意的是,将allSubsets 作为参数传入有点愚蠢,因为它总是空的。这种算法根本不需要第二个参数。其次,您可以更高效地使用可以简单快速地为您执行重复数据删除的哈希集。

【讨论】:

  • 赞成您的回答并删除了我的回答。好收获!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 2015-02-11
  • 2012-09-29
  • 2017-11-12
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多