zoukankan      html  css  js  c++  java
  • 算法第四章作业

    算法第四章作业

    组员:高珞洋,何汶珊

    对贪心算法的理解

    贪心算法来源于动态规划,都是要求得全局最优解。他们都是选择性算法,从一个集合种选择适当的元素加入解集合。

    在动态规划中,难点在于找到递推公式,并在代码中利用递推公式进行求解。尝试每种可能的情况并选择最优的情况。
    动态规划的选择策略是试探性的,每一步要试探所有的可行解并将结果保存起来,便于试探结束后进行回溯;或者每次试探都进行比较,保存最优解。

    与其相比,贪心算法在编程过程中会简单很多,因为它在每次选择的时候考虑的是局部最优解。
    这就要求问题的局部最优解的集合是全局最优解,即证明贪心策略,这也是贪心算法的难点所在,通常用反证法求解。
    贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关
    当证明贪心算法后,算法设计的关键是贪心策略的选择,即明确每次贪心选择的依据。如在非0-1背包的问题中,选择的依据是物品单位重量的价值,而非单纯的重量或者价值。

    事实上,既然贪心算法来源于动态规划,理论上能用贪心算法解决的问题都能用动态规划解决。但是贪心算法能比动态规划具有更低的时间和空间复杂度,代码编写也更加简单。

    说明汽车加油问题的贪心选择性质

    汽车加油问题

    一辆汽车加满油后可行驶 n公里。旅途中有若干个加油站。设计一个有效算法,指出应 在哪些加油站停靠加油,使沿途加油次数最少。
    输入格式:
    第一行有 2 个正整数n和 k(k<=1000 ),表示汽车加满油后可行驶n公里,且旅途中有 k个加油站。 第二行有 k+1 个整数,表示第 k 个加油站与第k-1 个加油站之间的距离。 第 0 个加油站表示出发地,汽车已加满油。 第 k+1 个加油站表示目的地。
    输出格式:
    输出最少加油次数。如果无法到达目的地,则输出“No Solution!”。

    贪心选择性质

    以能到达为前提,假设最少加油次数为x
    设在加满油后可行使N千米,这N千米内有两个及以上个加油站,任取两个A,B;A距起始点的距离为m,B距起始点的距离为n
    则若在B加油不能到达终点,那么在A加油必不能到达终点;若在B点加油,则比在A点加油可行驶的路程多n-m
    于是有两种情况,一是终点距离A点小于N,二是终点距离A点大于N小于N+n-m

    第一种情况下在A点加油和在B点加油都能到达终点,结果是一样的。
    而在第二种情况下在A点加油不能到达终点,而要在B点再加一次油;而在B点加油能直接到终点。

    于是有以下策略:

    1. 在油耗尽前能到达最远的加油站加油
    2. 非1策略

    由上述分析可得,选择策略1的结果≤选择策略2的结果。即可选择策略1作为最优策略
    因此可证明其贪心选择性质

    结对编程情况

    结对编程呢不全是优点,比如在编程的时候,两个人的意见相左,就会对编程产生不利影响。
    本周编程做实践题的时候,第二题卡题了。我选择往下打第三题,而同伴则在纠结第二题错在哪里。
    这就导致我敲完第三题后给她讲解的时候她会有点心不在焉的迹象。
    不过她也能理解啦,无伤大雅。而且有时候两人分工也能加快解题速度。

  • 相关阅读:
    LeetCode 258 Add Digits
    LeetCode 231 Power of Two
    LeetCode 28 Implement strStr()
    LeetCode 26 Remove Duplicates from Sorted Array
    LeetCode 21 Merge Two Sorted Lists
    LeetCode 20 Valid Parentheses
    图形处理函数库 ImageTTFBBox
    php一些函数
    func_get_arg(),func_get_args()和func_num_args()的用法
    人生不是故事,人生是世故,摸爬滚打才不会辜负功名尘土
  • 原文地址:https://www.cnblogs.com/luoyang0515/p/11907916.html
Copyright © 2011-2022 走看看