为什么非回归方法比递归需要更多的时间
Why would non-recursion method takes more time than recursion?
以快速排序为例,下面列出了递归和非回收方法。
我认为这两种方法实际上实现了相同的算法,因为stack
用于模拟非回归方法的递归过程。
但是,我使用了递归方法的AC,但是时间限制超过了 通过85%的测试用例后,使用非回收法。
。因此,我的非回归方法或两种方法之间存在时间复杂性差异吗?
之间存在时间复杂性差异?thx!
// non-recursion
void sortIntegers(vector<int> &A) {
if (A.empty()) {
return;
}
stack<pair<int, int>> ranges;
ranges.push(pair<int, int>(0, A.size() - 1));
while (!ranges.empty()) {
pair<int, int> r = ranges.top();
ranges.pop();
int mid = A[r.second],
left = r.first,
right = r.second - 1;
if (r.first >= r.second) {
continue;
}
while (left < right) {
while (A[left] < mid && left < right) {
left++;
}
while (A[right] >= mid && left < right) {
right--;
}
swap(A[left], A[right]);
}
if (A[left] < A[r.second]) {
left++;
} else {
swap(A[left], A[r.second]);
}
ranges.push(pair<int, int>(0, left - 1));
ranges.push(pair<int, int>(left + 1, r.second));
}
// recursion
void sortIntegers(vector<int> &A) {
quick(A, 0, A.size() - 1);
}
void quick(vector<int> & A, int start, int end) {
if (start >= end) {
return;
}
int mid = A[end], //5
left = start, // 0
right = end - 1; //3
while (left < right) {
while (A[left] < mid && left < right) {
left++;
}
while (A[right] >= mid && left < right) {
right--;
}
swap(A[left], A[right]);
}
if (A[left] >= A[end]) {
swap(A[left], A[end]);
}else {
left++;
}
quick(A, start, left - 1);
quick(A, left + 1, end);
}
乍一看,您的循环底部有:
ranges.push(pair<int, int>(0, left - 1));
ranges.push(pair<int, int>(left + 1, r.second));
对我来说应该是
ranges.push(pair<int, int>(r.first, left - 1));
ranges.push(pair<int, int>(left + 1, r.second));
相关文章:
- 关于记忆后这种递归关系的时间复杂度
- 以下递归代码的时间复杂度是多少?
- 递归回文问题的时间复杂度,C++
- 使用递归模板函数是否会引入函数调用开销,或者编译器是否大部分时间都内联它(下面的示例)?
- 如何制作递归编译时间变异结构模板
- 有 64 个圆盘的河内塔需要多长时间才能递归求解?C++
- 为什么非回归方法比递归需要更多的时间
- 该递归代码用于计算指数的运行时间是多少
- 递归最糟糕的情况时间复杂性
- 使用C 模板函数编译时间递归
- 可传递值影响递归算法的渐近时间复杂性
- Boost.Spirit X3 编译时间因递归规则而爆炸
- 递归基转换时间复杂度分析
- 带有两个递归调用的递归算法的时间复杂性
- 编译时间递归函数以计算两个整数的下一个功能
- 递归的时间复杂性
- 递归函数的时间复杂度计算
- 如何在特定时间后终止递归函数
- 加泰罗尼亚数字,递归函数时间复杂度
- 递归函数的渐近时间复杂度