朝阳同学的买苹果问题--贪心算法
问题定义
算法
确定算法思想
- 将C1,...,Cn进行排序,在Ci最小的那一天,买齐未来第i天到第i+d-1天的苹果,直到n天的苹果都采购完成。
分析贪心选择性
命题1,在购买苹果问题中,保质期为d天,n天价格序列为C1,...,Cn,其中Ci = min{C1,...,Cn},存在某个优化解,在第i天购买了d个苹果,Bi = d。
证明1,如果不存在某个优化解,在第i天购买了d个苹果。那么对于任意一个优化解T而言,其购买苹果的价格定义为cost(T) = Σ(j =1:n) BjCj 。那么对于可以将第i天到i+d-1天的苹果都在第i天进行购买,形成了新的解T '。显然,T与T '仅仅在第i天到i+d-1天的苹果购买价格不同,那么cost(T) - cost(T ') = Σ(j =i:i+d-1) BjCj - Ci*d。而Ci*i < Σ(j =i:i+d-1) BjCj,因为Cd是购买苹果的最低价,那么,cost(T) > cost(T '),这与T是最优解矛盾,所以假设不成立。
分析优化子结构
命题2,对于可以在第1~n天购买苹果,需要购买第1~n天的苹果的问题的最优解T而言,T - Bi是可以在第1~n天,不能在第i天购买苹果,以及需要购买第1~n天的水果,不需要购买第i天到第i+d-1天的苹果的问题的优化解。
证明2:如果T - Bi不是该问题优化解,那么假设A是该问题的优化解,那么。cost(A) < cost(T - Bi),那么,A+Bi就是可以在第1~n天购买苹果,需要购买第1~n天的苹果的问题的解,而cost(A+Bi) = cost(A) + CiBi , cost(T ) = cost(T - Bi) + CBi,cost(A+Bi) < cost(T ),那么显然这与T是原问题的优化解矛盾,假设不成立。
算法设计
Apple-Plan(d,n,C1,C2,...,Cn)
Merge-Sort(C1,C2,...,Cn);
B1..n = 0;
A1..n = 0;
I = 1;
While(A中元素存在不等于0)
Count = 0;
For j = I to i+d-1
If A[j] != 1
Then A[i..i+d-1] = 1;
Count++;
B[i] =count;
Return B;
算法复杂度分析
第2行的归并排序O(nlogn);
第6行的判断O(n),循环至多n次,第8行循环至多d次,第六行循环总时间时间复杂度为O(dn2)。
T(n) = O(nlogn) + O(dn2)。
时间复杂度比较大。。。。