【问题标题】:Partition solution too slow分区解决方案太慢
【发布时间】:2016-03-18 15:54:43
【问题描述】:

我正在解决一个看起来像分区问题的问题: 我有一个整数序列,我应该找到这些整数的一个子集(如果有多个解决方案,我应该只输出一个),这样它们的总和正好是所有整数总和的一半。

我正在尝试通过动态编程来解决它,但我的解决方案在测试中仍然太慢(我只能通过 2/10 的测试并且休息太慢)。感谢您的帮助。

我的代码:

void split(std::vector<int> seq, int sum, FILE * output){
  int n = seq.size() + 1;
  int m = sum + 1;
  bool** matrix = (bool**)malloc(m*sizeof(bool*));
  for(int i = 0;i<m;i++){
    matrix[i] = (bool*)malloc(n*sizeof(bool));
  }


  for(int i=1;i<=m-1;i++){
    matrix[0][i]=false;
  }
  for(int i=0;i<=n-1;i++){
    matrix[i][0]=true;
  }

  for(int i=1;i<=n-1;i++){
    for(int j=1;j<=m-1;j++){
      matrix[i][j] = matrix[i-1][j];
      if(matrix[i][j]==false && j>=seq[i-1])
    matrix[i][j] = matrix[i][j] || matrix[i-1][j-seq[i-1]];
    }
  }

  if(matrix[n-1][m-1]){
    int row = n-1;
    int column = m-1;

    while((row > 1) && (column > 0)){
      while(matrix[row-1][column]){row--;}
      fprintf(output, "%i ", row);
      column = column - seq[row-1];
    }
  }
  else{
    fprintf(output, "no");
  }
}

【问题讨论】:

  • 你能发布一些输入/输出的例子吗?
  • 例如输入:{2 3 5 6} 输出:{3 5} 或 {2 6}
  • 列表是否保证排序?
  • 不,这个列表是完全随机的。
  • @user1505497 您的 I/O 调用是否包含在您的尝试中,即循环调用 fprintf?此外,您正在分配内存并且从不释放它。如果在循环中调用此函数,如果 nm 很大,则会造成巨大的内存泄漏。

标签: c++ partition-problem


【解决方案1】:

如果允许其他方法,您可以尝试使用二叉搜索树。它应该在 O(n log n) 时间内完成,其中 n 是序列的大小。

【讨论】:

  • Binary Search Tree 解释了这个概念。您的情况的想法是制作 BST,同时使其在每个节点中存储其子树的总和。总和为一半的节点应包含所有元素。不过,我应该计算它是否比动态解决方案更快。
  • 这个想法是让这样创建的 BST 从最左边和最右边的节点并行运行并检查子树的总和。不过,这不是一个好方法,可以创建一个无法以这种方式计算的示例。
猜你喜欢
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
相关资源
最近更新 更多