贪心算法+算法设计

一、基本思想

1、局部最优与全局最优:贪心算法在每一步选择当前状态下的最优解,希望这样的局部最优决策能导致全局最优解。

2、贪心选择性质:在算法的每一步都采取当前状态下的最优选择,不考虑子问题的解如何影响未来的状态。

3、可行解:每一步的贪心选择都必须保证解是可行的,即选择之后的状态仍然满足问题的要求。

二、技巧和方法

1、贪心选择条件:确定一个贪心选择函数,该函数能够在每一步选择中提供最优的决策。

2、最优子结构:确保问题具有最优子结构,即通过子问题的最优解可以构建原问题的最优解。

3、贪心策略:定义一个贪心策略,明确在每一步如何做出贪心选择。

4、剪枝:在搜索过程中,一旦发现某一部分不可能产生最优解,就剪去这部分,以减少计算量。

5、排序:对于某些问题,预先对输入数据进行排序可以简化贪心选择过程。

6、记忆化:存储已经计算过的结果,避免重复计算,特别是在动态规划中。

7、迭代与分治:将问题分解为更小的子问题,递归解决每个子问题,然后合并结果。

三、基本要素

贪心选择性:

贪心选择性是指在算法的每一步选择中,根据某个贪心标准(贪心选择函数)做出局部最优解的选择,从而希望这样的局部最优决策能够导致全局最优解。贪心算法的核心在于每一步都做出当前看起来最优的选择,而不考虑这个选择对未来选择的影响。

贪心选择性的关键在于:

1、贪心标准:定义一个标准或函数,用于评估每一步的最优性。

2、局部最优:每一步都基于贪心标准做出最优选择。

3、可行解:每次选择都必须保证解的可行性,即选择之后的状态仍然满足问题的所有约束。

最优子结构

最优子结构性质是指一个问题的最优解包含其子问题的最优解。换句话说,可以独立地解决子问题,并将这些子问题的最优解组合起来以形成原问题的最优解。

最优子结构性质的关键在于:

1、子问题:问题可以分解为更小的子问题。

2、最优解:子问题的最优解是可以确定的。

3、组合:原问题的最优解可以通过组合子问题的最优解来获得

四、算法实例

编程实现下述活动的最佳安排

joblist = [['a', 8, 10], ['b', 1, 5], ['c', 4, 8], ['d', 1, 3], ['e', 6, 9], ['f', 2, 4], ['g', 4, 7], ['h', 1, 5], ['i', 6, 12]]

def get_max_intervalschdeule(joblist):
    job_schedule=[]
    num_jobs=len(joblist)
    joblist.sort(key=lambda x:  x[2])#按照结束时间对所有的job排序
    for n in range(num_jobs):
        if not job_schedule:
            job_schedule.append(joblist[n])
        else:
            if job_schedule[-1][2]<=joblist[n][1]:#当前遍历到的job与job_schedule中的最后一个job比较
                job_schedule.append(joblist[n])
    return job_schedule

# 给定的工作列表
joblist = [['a', 8, 10], ['b', 1, 5], ['c', 4, 8], ['d', 1, 3], ['e', 6, 9], ['f', 2, 4], ['g', 4, 7], ['h', 1, 5], ['i', 6, 12]]

# 调用函数并打印结果
best_schedule = get_max_intervalschdeule(joblist)
print("Best Schedule:", best_schedule)

贪心算法和动态规划都是常用于解决问题的算法思想。贪心算法是一种在每一步都做出局部最优决策的算法,而不考虑全局的状态。贪心算法通常具有较低的时间复杂度,因为它不需要回溯所有子问题的解。相比之下,动态规划需要回溯所有子问题的解,因此时间复杂度较高。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ES6的JavaScript算法思想实现之分而治之,动态规划,贪心算法和回溯算法 贪心算法和动态规划.pdf](https://download.csdn.net/download/qq_40464803/85095551)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [动态规划与贪心算法的区别](https://blog.csdn.net/m0_57236802/article/details/129539553)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [js贪心算法](https://blog.csdn.net/qq_48315043/article/details/121678537)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倚楼听风疏雨骤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值