算法学习6——贪心算法
创始人
2024-11-15 04:33:08
0次

什么是贪心算法?

贪心算法是一种在每一步选择中都采取当前状态下最优或最有利的选择的算法。其核心思想是通过一系列局部最优选择来达到全局最优解。贪心算法广泛应用于各种优化问题,如最短路径、最小生成树、背包问题等。

贪心算法的特点

  1. 局部最优选择:每一步都做出在当前情况下最优的选择。
  2. 无后效性:一旦某个状态被确定,就不会再被改变或回溯。
  3. 逐步构造解决方案:通过一系列的选择逐步构建出最终的解决方案。

经典例子及其Python实现

1. 活动选择问题

问题描述:给定一组活动,每个活动有一个开始时间和结束时间,要求选择尽可能多的互不重叠的活动。

贪心策略:每次选择结束时间最早且不与已选择活动重叠的活动。

实现过程:

  1. 将所有活动按结束时间排序。
  2. 依次选择结束时间最早且不与已选择活动重叠的活动。

Python代码:

def activity_selection(activities):     # 按结束时间排序     activities.sort(key=lambda x: x[1])          # 选择活动     selected_activities = [activities[0]]     last_end_time = activities[0][1]          for start, end in activities[1:]:         if start >= last_end_time:             selected_activities.append((start, end))             last_end_time = end          return selected_activities  # 示例 activities = [(1, 4), (3, 5), (0, 6), (5, 7), (3, 9), (5, 9), (6, 10), (8, 11), (8, 12), (2, 14), (12, 16)] print(activity_selection(activities)) 

2. 背包问题

问题描述:给定一组物品,每个物品有重量和价值,要求在总重量不超过背包容量的前提下,使背包中的物品总价值最大。

贪心策略:每次选择单位重量价值最高的物品。

实现过程:

  1. 将所有物品按单位重量价值排序。
  2. 依次选择单位重量价值最高且不超过剩余容量的物品。

Python代码:

def knapsack(items, capacity):     # 按单位重量价值排序     items.sort(key=lambda x: x[1]/x[0], reverse=True)          total_value = 0     for weight, value in items:         if capacity >= weight:             capacity -= weight             total_value += value         else:             total_value += value * (capacity / weight)             break          return total_value  # 示例 items = [(10, 60), (20, 100), (30, 120)] capacity = 50 print(knapsack(items, capacity)) 

3. 哈夫曼编码

问题描述:给定一组字符及其出现频率,要求构造一个前缀码,使得编码后的字符串长度最短。

贪心策略:每次选择出现频率最低的两个字符合并,构造哈夫曼树。

实现过程:

  1. 将所有字符按频率构造最小堆。
  2. 依次取出频率最低的两个节点,合并后重新插入堆中。
  3. 重复上述过程,直到所有节点合并为一棵树。

Python代码:

import heapq  def huffman_encoding(frequencies):     heap = [[weight, [symbol, ""]] for symbol, weight in frequencies.items()]     heapq.heapify(heap)          while len(heap) > 1:         lo = heapq.heappop(heap)         hi = heapq.heappop(heap)         for pair in lo[1:]:             pair[1] = '0' + pair[1]         for pair in hi[1:]:             pair[1] = '1' + pair[1]         heapq.heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:])          return sorted(heapq.heappop(heap)[1:], key=lambda p: (len(p[-1]), p))  # 示例 frequencies = {'a': 45, 'b': 13, 'c': 12, 'd': 16, 'e': 9, 'f': 5} print(huffman_encoding(frequencies)) 

结论

贪心算法通过局部最优选择来构建全局最优解,简单高效,适用于多种优化问题。然而,贪心算法并不总是能得到最优解,因此在使用前需要确保问题满足贪心选择性质。

相关内容

热门资讯

实测交流透视挂!宝玛大厅ai智... 实测交流透视挂!宝玛大厅ai智能透视挂教程,宝玛大厅破解软件经验(本来有挂辅助)1、每一步都需要思考...
总算了解辅助器!朱雀吴江三缺一... 总算了解辅助器!朱雀吴江三缺一ai智能透视辅助挂技巧,朱雀吴江三缺一好像是有挂(有辅助挂细节)朱雀吴...
今日公布透视!九五至尊大厅ai... 今日公布透视!九五至尊大厅ai智能透视插件,九五至尊大厅有没有透视挂窍门(切实有挂技术)1、在九五至...
玩家必看科普开挂!聚闲麻将ai... 玩家必看科普开挂!聚闲麻将ai智能透视辅助挂软件,聚闲麻将总是真的有挂(有辅助挂方式)聚闲麻将能透视...
据报道开挂!旅游娱乐ai智能开... 据报道开挂!旅游娱乐ai智能开挂工具,旅游娱乐辅助工具演示(一直有挂教学)1、全新机制【旅游娱乐ai...
一分钟揭秘开挂!决胜朋来麻将a... 一分钟揭秘开挂!决胜朋来麻将ai智能透视辅助挂教程,决胜朋来麻将真是真的是有挂(有辅助挂总结)1、首...
如何分辨真伪透视!红牛ai智能... 如何分辨真伪透视!红牛ai智能透视攻略,红牛是不是有挂经验(真是有挂技术)1、操作简单,无需红牛手机...
2分钟细说辅助器!江湖大庆麻将... 2分钟细说辅助器!江湖大庆麻将ai智能透视辅助挂攻略,江湖大庆麻将竟然是真的有挂(有辅助挂头条)1、...
总算清楚透视挂!老夫子厅ai智... 总算清楚透视挂!老夫子厅ai智能透视挂技巧,老夫子厅怎么开挂课程(好像发现有挂)老夫子厅破解侠是真的...
解密关于辅助!菜鸟麻将ai智能... 解密关于辅助!菜鸟麻将ai智能透视辅助挂脚本,菜鸟麻将总是存在有挂(有辅助挂存在)1、用户打开应用后...