首先,我要说我知道主定理属性,所以问题不在这里。
我需要知道如何使用现有算法确定主定理的值
所以,我需要T(n)= a * T(n / b)+ f(n)。
我知道a是递归调用的次数。
我知道b是问题的分区大小
但我不知道如何确定什么是f(n)
我有一个例子;
这里我们有一个= 2; b = 2 f(n)= n
a = 2,因为我们有2次合并函数调用 由于j =(k + i)/ 2
,b = 2但我不明白我们如何得到f(n)= n
归并(T,I,K)
需要T数组
i,k整数使得Tm< = i< = k< = TM与Tm和TM的界限T
确保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);`
感谢您的帮助。
答案 0 :(得分:1)
在Master Theorem中,f(n)
是赋予运行时递归定义的非递归部分的函数。在递归调用的每一步,算法都会调用自己若干次,并且可选地做一些额外的工作(所有这些除非你处于基本情况,在这种情况下完成的工作是不变的)。 p>
在Mergesort中,f(n) = O(n)
因为合并两个已排序的子列表以生成包含所有子列表元素的单个排序列表,所以在组合排序列表的大小中需要线性时间。
在二进制搜索中,f(n) = O(1)
因为在每一步必须执行的所有操作都是将目标值与要搜索的子列表中间元素的值进行比较。
你可以通过所有递归调用,移动函数调用之外的任何参数的计算,然后用常量值替换递归函数调用来判断f(n)
应该是什么。剩下的是渐近与f(n)
相同。