【问题标题】:How to speed up my Print all partitions of an n-element set into k unordered sets如何加快我将 n 元素集的所有分区打印为 k 个无序集的速度
【发布时间】:2022-01-05 00:16:13
【问题描述】:

如何加快我的程序?

我的任务:1

示例: example

我的解决方案:

#include <iostream>
#include <vector>
//#pragma GCC optimize ("O3")

using namespace std;
int n;

int num(vector<vector<int>> sets) {
  int res = 0;
  for (int i = 0; i < sets.size(); i++)
    for (int j = 0; j < sets[i].size(); j++)
      if (sets[i][j] != 0)
        res++;
  return res;
}

bool testSets(vector<vector<int>> sets) {
  for (int i = 0; i < sets.size(); i++) {
    if (sets[i].size() == 0) {
      return false;
    } else {
      for (int j = 0; j < sets[i].size() - 1; j++)
        if (sets[i][j] >= sets[i][j + 1])
          return false;
    }
  }
  if (num(sets) == n)
    return true;
  else
    return false;
}

void out(vector<vector<int>> a) {
  for (int i = 0; i < a.size(); i++) {
    for (int j = 0; j < a[i].size(); j++)
      cout << a[i][j] << " ";
    cout << endl;
  }
}

void func(vector<vector<int>> sets, vector<int> a, vector<bool> used) {
  if (num(sets) == n) {
    if (testSets(sets)) {
      out(sets);
      cout << endl;
    } else {
      return;
    }
  } else {
    int i, x;
    for (i = 0; i < used.size(); i++) {
      if (used[i] == false)
        break;
    }
    if (i == used.size())
      i--;

    for (x = 0; x < sets.size(); x++) {
      if (sets[x].size() == 0)
        break;
    }
    if (x == sets.size())
      x--;

    used[i] = true;
    for (int j = 0; j <= x; j++) {
      sets[j].push_back(a[i]);
      //out(sets);
      func(sets, a, used);
      sets[j].pop_back();
    }
    used[i] = false;
  }
}

int main() {
  int k;
  cin >> n >> k;
  vector<int> a(n);
  vector<vector<int>> sets;
  vector<bool> used(n, false);

  for (int i = 0; i < a.size(); i++)
    a[i] = i + 1;
  sets.resize(k);

  func(sets, a, used);

  return 0;
}```

【问题讨论】:

  • 你分析了吗?它大部分时间都在哪里度过?
  • func 的开头调用num,它每次都会遍历所有元素。这似乎是个坏主意。
  • @TedLyngmo 不,我无法进行测试,而且我想不出能让她长时间工作的测试。所以我不知道它什么时候运行缓慢,但我现在,在某些测试中它太慢了
  • @taburetca 你在到处传递std::vector 的值。您应该通过引用或 const 引用而不是值来传递它们。第二件事与您的帖子有关 - 在此处发布数据,而不是在外部网站上,也不是作为图像。

标签: c++ performance optimization micro-optimization


【解决方案1】:

谢谢大家

去掉num函数,将sum变量加到func中,push时加1,pop时减1

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多