function miminimumis=minimumval(k)
aa=k(1);
k=k(k<k(1));
if length(k)==0
miminimumis=aa;
else
% this line gives the recursion
miminimumis=minimumval(k);
end
end
function min_element(ary) {
if length(ary) == 1 {
return ary[1]
}
split ary into first_half, second_half which differ in length by no more than 1
return min( min_element(first_half), min_element(second_half) )
}
2条答案
按热度按时间zdwk9cvp1#
这里,我们创建一个新数组,该数组由仅小于第一个元素的元素组成。如果该数组为空,则意味着第一个元素是min,如果不是,则对新数组执行相同操作,除非我们到达空数组。通过在函数定义中使用相同函数来提供递归。
yquaqz182#
在最坏情况下将问题大小减少1的解将导致递归堆栈具有O(length(array))增长。例如,当数组按降序排列时,筛选数组以生成小于第一个元素的值。对于足够大的数组,这将不可避免地导致堆栈溢出。要避免这种情况,你想使用一个递归将大小为n的问题分解成大小为n/2的两个子问题,产生O(log(length(array)))。
我不是Matlab的用户/程序员,所以我将用伪代码来表达算法。下面假设数组是从1开始的,并且有一个内置函数
min(a,b)
,它产生两个标量a
和b
中的最小值。(如果不是,很容易用if/else逻辑替换min()
。)也可以使用
lo_index
和hi_index
的两个附加参数来编写。计算中点作为低索引和高索引的整数平均值,并进行两个递归调用min_element(ary, lo_index, mid)
和min_element(ary, mid+1, hi_index)
。基本条件是whenlo_index == hi_index
,在这种情况下返回该元素。这样应该更快。因为它使用简单的整数运算,并且避免为子问题创建子数组。它的缺点是对最终用户不太友好,最终用户必须通过调用min_element(ary, 1, length(ary))
来启动进程。如果堆栈限制是500,那么使用线性堆栈增长算法,您将被限制为长度小于500的数组。使用上面描述的分治算法,您将不会发生堆栈溢出,除非您有一个长度为~2500的数组,比您实际创建的任何数组都要大得多。