首先,让我说,我知道主定理的性质,所以问题不在这里。
我需要知道如何用现有算法确定主定理的值。
所以,我需要T(n)=a*T(n/b)+f(n)。
我知道a是递归调用的数目。
我知道B是问题的分区大小
但我不知道如何确定f(n)是什么
我有一个例子;
这里我们有a=2;b=2f(n)=n
因为我们有两次合并函数调用
b=2,因为j=(k+i)/2
但我不明白我们怎么得到f(n)=n
合并排序(T,I,K)
需要T数组
i,k整数,使得tm确保T在i和k之间排序
`if (k>i) then
j=(k+i)/2;
mergeSort(T,i,j);
mergeSort(T,j+1,k);
append(T,i,j,k);`
谢谢你的帮助。
最佳答案
在主定理中,f(n)
是给出运行时递归定义的非递归部分的函数。在递归调用的每一步,算法都会调用自己一些次数,并且可以选择地执行一些额外的工作(除非您处于基本情况,在这种情况下,所做的工作是常量)。
在mergesort中,f(n) = O(n)
是因为合并两个已排序的子列表以生成包含所有子列表元素的单个已排序列表所需的时间与合并的已排序列表的大小成线性关系。
在二进制搜索中,f(n) = O(1)
,因为每一步所要执行的只是将目标值与要搜索的子列表中间的元素值进行比较。
判断f(n)
应该是什么的方法是:接受所有递归调用,将任何参数的计算移到函数调用之外,然后用常量替换递归函数调用。剩下的和f(n)
是渐近相同的。