【问题标题】:Implementing Heap's algorithm in C++在 C++ 中实现堆的算法
【发布时间】:2015-03-17 23:02:36
【问题描述】:

我正在尝试在 C++ 中实现 Heap's algorithm。我觉得我编写的代码完全符合算法的工作原理,但它给出了错误的结果。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void print(vector<int> v)

{ 
   for(auto x:v) 
            cout<<x;
   cout<<endl;
}

void gen(vector<int> v,int n)

{  
      if(v.size()==1) 
          cout<<v[0];
      print(v);
      int i = 0;
      while(i<n)
       {
          gen(v,n-1);
          if(n%2) 
               swap(v[n-1],v[0]);
          else 
               swap(v[n-1],v[i]);
          i++;
       }

}


int main()
{
  vector<int>  v  ={1,2,3};
  gen(v,v.size());
}

我一直在努力完成这项工作。 对于上面代码中的向量,它给出了荒谬的结果:

123 123 123 123 213 213 321 321 321 231 231 123 123 123 213 213

【问题讨论】:

  • 您可能不希望 gen(vector&lt;int&gt; v,int n) 按值传递 v,是吗?
  • 考虑到函数本身会打印结果,这并不像乍一看那么愚蠢。
  • @WhozCraig 我做错了吗?
  • @MSalters 将不胜感激,如果您能提供帮助,无论多么愚蠢。我被困在这里了。
  • @edbale 我只是在问。你的意图是gen 修改调用者的向量吗?如果是这样,是的,你做错了。如果没有,那么没有。

标签: c++ algorithm permutation heaps-algorithm


【解决方案1】:

Wiki 页面显示了您的代码中缺少的if-else。你拥有的if 做了完全不同的事情。

另外,我会在 cout 之后添加一个 std::endl,然后尝试输入 1 2 3 4。链接的文章有一个运行 4 个元素的算法的逐行示例。

【讨论】:

  • 我认为这无关紧要,因为它只是检查只有一个排列的单个元素向量。
  • @edbale 这实际上很重要,因为您的代码会检查v.size()1,它永远不会如此。您将一个 3 元素向量传递给它并做 nothing 来改变它。很确定v.size() 应该是n。一旦完成,else 就变得非常相关。
  • @edbale:那是你误解的地方。检查页面右侧的示例。打印调用发生当且仅当n=1。由于您需要 6 次排列,因此您应该有 6 次调用 gen(v,1)
  • @WhozCraig:对于n==1,您应该打印的不仅仅是v[0]。实际的 print(v) 函数是正确的,只是调用太频繁了。
  • @edbale:解决这个问题的最好方法是自己解决问题。程序应该产生什么输出?特别是,按什么顺序?尝试在纸上手动运行算法。
猜你喜欢
  • 2015-10-24
  • 2015-09-28
  • 2011-05-03
  • 2020-07-13
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多