A/c cho e hỏi thuật này đánh giá là O(N!)
hay O(N^N)
vậy ạ?
Vì e có viết 3 thuật sinh hoán vị khác, đều là O(N!) nhưng chạy nhanh gấp khoảng 10 lần thuật này. E cảm thấy có vẻ như nó là O(N^N) vì với mỗi N ( 0 <=N<=v.size() ), vòng for
đều duyệt v.size()
lần. Nhưng lại mâu thuẫn với việc mặc dù duyệt v.size()
lần nhưng những trường hợp visited[i]==false
thì ko làm gì cả nên ko biết có tính vào không
inline void print(const vector<int> &v)
{
for(int i = 0; i < v.size(); ++i) cout << v[i] << " ";
}
vector<int> result;
vector<bool> visited;
int cnt=0;
void Permutation(vector<int> &v, int n)
{
if(n == v.size())
{
print(result);
cout << endl;
++cnt;
return;
}
for(size_t i = 0; i < v.size(); ++i)
{
if(visited[i] == false)
{
visited[i] = true;
result[n] = v[i];
Permutation(v, n + 1);
visited[i] = false;
}
}
}
int main()
{
vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
result.assign(v.size(), -1);
visited.assign(v.size(), false);
Permutation(v, 0);
cout << "Number of permutations: "
<< cnt << endl;
return 0;
}