(参数传递代价)我们有一个贯穿本书的假设——过程调用中的参数传递花费常量时间,即使传递一个NNN个元素的数组也是如此。在大多数系统中,这个假设是成立的,因为传递的是指向数组的指针,而非数组本身。本题讨论三种参数传递策略:
1. 数组通过指针来传递。时间 = Θ(1)Θ(1)Θ(1)。
2. 数组通过元素复制来传递。时间 = Θ(N)Θ(N)Θ(N),其中NNN是数组的规模。
3. 传递数组时,只复制过程可能访问的子区域。若子数组A[p..q]A[p..q]A[p..q]被传递,则时间 = Θ(q−p+1)Θ(q−p+1)Θ(q−p+1)。
a. 考虑在有序数组中查找元素的递归二分查找算法(参见练习2.3-5)。分别给出上述三种参数传递策略下,二分查找最坏情况运行时间的递归式,并给出递归式解的好的上界。令N为原问题的规模,n为子问题的规模。
b. 对2.3.1节的MERGE-SORT算法重做(a)。
解
a. 二分查找
如果忽略参数传递时间,二分查找的运行时间的递归式为T(n)=T(n/2)+Θ(1)T(n) = T(n/2) + Θ(1)T(n)=T(n/2)+Θ(1)。
(1) 数组通过指针来传递
最坏情况运行时间递时式为T(n)=T(n/2)+Θ(1)+Θ(1)=T(n/2)+Θ(1)T(n) = T(n/2) + Θ(1) + Θ(1) = T(n/2) + Θ(1)T(n)=T(n/2)+Θ(1)+Θ(1)=T(n/2)+Θ(1),求解该递归式得到T(n)=O(lgn)T(n) = O({\rm lg}n)T(n)=O(lgn)。
(2) 数组通过元素复制来传递
最坏情况运行时间递时式为T(n)=T(n/2)+Θ(1)+Θ(N)=T(n/2)+Θ(N)T(n) = T(n/2) + Θ(1) + Θ(N) = T(n/2) + Θ(N)T(n)=T(n/2)+Θ(1)+Θ(N)=T(n/2)+Θ(N),其中NNN为原数组规模,求解该递归式得到T(n)=O(nlgn)T(n) = O(n{\rm lg}n)T(n)=O(nlgn)。
(3) 数组通过只复制子问题要访问的区域来传递
最坏情况运行时间递时式为T(n)=T(n/2)+Θ(1)+Θ(n)=T(n/2)+Θ(n)T(n) = T(n/2) + Θ(1) + Θ(n) = T(n/2) + Θ(n)T(n)=T(n/2)+Θ(1)+Θ(n)=T(n/2)+Θ(n),用主方法求解该递归式得到T(n)=O(n)T(n) = O(n)T(n)=O(n)。
b. MERGE-SORT
如果忽略参数传递时间,MERGE-SORT的运行时间的递归式为T(n)=2T(n/2)+Θ(n)T(n) = 2T(n/2) + Θ(n)T(n)=2T(n/2)+Θ(n)。
(1) 数组通过指针来传递
最坏情况运行时间递时式为T(n)=2T(n/2)+Θ(n)+Θ(1)=2T(n/2)+Θ(n)T(n) = 2T(n/2) + Θ(n) + Θ(1) = 2T(n/2) + Θ(n)T(n)=2T(n/2)+Θ(n)+Θ(1)=2T(n/2)+Θ(n),求解该递归式得到T(n)=O(nlgn)T(n) = O(n{\rm lg}n)T(n)=O(nlgn)。
(2) 数组通过元素复制来传递
最坏情况运行时间递时式为T(n)=2T(n/2)+Θ(n)+Θ(N)=2T(n/2)+Θ(N)T(n) = 2T(n/2) + Θ(n) + Θ(N) = 2T(n/2) + Θ(N)T(n)=2T(n/2)+Θ(n)+Θ(N)=2T(n/2)+Θ(N),其中NNN为原数组规模,求解该递归式得到T(n)=O(n2)T(n) = O(n^2)T(n)=O(n2)。
(3) 数组通过只复制子问题要访问的区域来传递
最坏情况运行时间递时式为T(n)=T(n/2)+Θ(n)+Θ(n)=2T(n/2)+Θ(n)T(n) = T(n/2) + Θ(n) + Θ(n) = 2T(n/2) + Θ(n)T(n)=T(n/2)+Θ(n)+Θ(n)=2T(n/2)+Θ(n),求解该递归式得到T(n)=O(nlgn)T(n) = O(n{\rm lg}n)T(n)=O(nlgn)。
算法导论 — 思考题4-2 参数传递代价
最新推荐文章于 2025-05-18 14:11:55 发布