在主定理中找到 f(n) 的值
Posted
技术标签:
【中文标题】在主定理中找到 f(n) 的值【英文标题】:Find the value of f(n) in the master theorem 【发布时间】:2018-04-05 06:44:06 【问题描述】:首先,我说我知道主定理的性质,所以问题不在这里。
我需要知道如何使用现有算法确定主定理的值
所以,我需要 T(n)=a*T(n/b) + f(n)。
我知道 a 是递归调用的次数。
我知道 b 是问题的划分大小
但我不知道如何确定 f(n) 是什么
我有一个例子;
这里我们有 a=2; b=2 f(n) = n
a=2 因为我们有 2 次合并函数调用 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);`
感谢您的帮助。
【问题讨论】:
1) 不确定最后一次调用是否应该调用append
,2) f(n)
将是append
的时间函数,即O(j - i)
或O(k - j)
【参考方案1】:
在主定理中,f(n)
是给出运行时递归定义的非递归部分的函数。在递归调用的每一步,算法都会调用自己多次,并且可以选择做一些额外的工作(所有这些,除非你处于基本情况,在这种情况下所做的工作是恒定的)。
在 Mergesort 中,f(n) = O(n)
因为合并两个已排序的子列表以生成包含所有子列表元素的单个排序列表在组合排序列表的大小上需要线性时间。
在二分搜索中,f(n) = O(1)
因为在每个步骤中必须执行的只是将目标值与要搜索的子列表中间元素的值进行比较。
您知道f(n)
应该是什么的方法是进行所有递归调用,将任何参数的计算移到函数调用之外,然后用常量值替换递归函数调用。剩下的就和f(n)
一样了。
【讨论】:
谢谢。所以这里的非递归部分是附加的吗?追加的复杂度为 O(k-i+1) 。我们说它是 n 因为更大的 k 可能是 n 而更小的 i 可能是 1 ? @Minirock 正确。换一种说法:正在考虑的合并排序的调用具有问题大小 n = k - i + 1。这是附加复杂性的表达式,因此附加在输入大小 n = k - i + 1 中是线性的。可能会造成混淆你是这样的:对于函数的每次递归调用,n 都不相同。实际上,它假设 log n 个不同的值(n,n/2,n/4,...)一次,两次,四次,...输入大小是每个特定调用的输入大小,而不是(仅)最终用户调用的原始高级别的。以上是关于在主定理中找到 f(n) 的值的主要内容,如果未能解决你的问题,请参考以下文章