【发布时间】:2018-04-27 09:48:44
【问题描述】:
我有一个 c++ 编程类的任务,可以在不使用静态变量的情况下编写递归函数,原型如下: int findmin(const int a[], int n);
我的解决方案有效(适用于非常小的数组),但我认为 ~2^n 复杂度过高,可以改进。
在指定的标准内是否可以进行任何改进以提高效率?
int findmin(const int a[], int n)
{
if(n == 0)
return a[0];
else
{
if(a[n-1] < findmin(a,(n-1)))
return a[n-1];
else
return findmin(a,(n-1));
}
}
【问题讨论】:
-
存储
findmin(a,(n-1));的结果而不是再次调用它会有所帮助。 -
通过递归转到数组的最后一个索引。令最后一个元素为最小元素并返回它。在每次展开递归时,将当前索引元素与答案最小值进行比较,并在必要时进行更新。
-
@John3136 我很惊讶这有多大的不同,它现在似乎以线性复杂度运行。
-
如果
n代表大小,你的算法是错误的(a[0]在n == 0时应该是无效的,否则你不检查a[n])。 -
使用堆数据结构。
findMin()是O(1)