当前位置: 首页 > article >正文

青少年编程与数学 02-016 Python数据结构与算法 16课题、贪心算法

青少年编程与数学 02-016 Python数据结构与算法 16课题、贪心算法

  • 一、贪心算法的基本概念
    • 定义
    • 组成部分
  • 二、贪心算法的工作原理
  • 三、贪心算法的优点
  • 四、贪心算法的缺点
  • 五、贪心算法的应用实例
    • (一)找零问题
    • (二)活动安排问题
    • (三)霍夫曼编码
    • (四)最小生成树(Kruskal算法)
  • 总结

课题摘要:
贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下最优(即最有利)的选择,从而希望导致结果是全局最优的算法。贪心算法并不总是能得到最优解,但它在很多问题上都能得到较好的近似解,并且通常具有较高的效率。

关键词:贪心算法


一、贪心算法的基本概念

定义

贪心算法在每一步选择中都采取当前状态下最优的选择,从而希望导致结果是全局最优的。这种“最优”通常是根据某种局部标准来衡量的。

组成部分

  1. 贪心选择性质:问题的整体最优解可以通过一系列局部最优的选择来达到。这是贪心算法可行的基本要素。
  2. 最优子结构:问题的最优解包含其子问题的最优解。贪心算法通过分解问题为更小的子问题来逐步构建全局最优解。
  3. 贪心策略:一种用于选择局部最优解的策略,通常基于某种特定的规则或标准。

二、贪心算法的工作原理

  1. 贪心选择:在每一步选择中,根据某种贪心策略选择当前状态下最优的选项。例如,在找零问题中,每次选择面值最大的硬币。

  2. 构建解:通过一系列的贪心选择逐步构建解。每一步的选择都是基于当前状态的最优选择,而不考虑后续步骤。

  3. 验证:在某些情况下,需要验证通过贪心选择得到的解是否满足问题的约束条件。如果满足,则该解是全局最优解;如果不满足,则需要重新考虑贪心策略。

三、贪心算法的优点

  1. 简单直观:贪心算法的逻辑通常比较简单,容易理解和实现。

  2. 效率高:贪心算法通常具有较高的效率,因为它不需要像动态规划那样存储大量的子问题解。

  3. 适用性广:贪心算法可以应用于多种问题,尤其是在组合优化问题中。

四、贪心算法的缺点

  1. 不能保证全局最优:贪心算法只能保证在每一步选择中是局部最优的,但不能保证最终结果是全局最优的。例如,在某些背包问题中,贪心算法可能无法找到最优解。

  2. 适用范围有限:贪心算法只能应用于具有贪心选择性质和最优子结构的问题。对于不满足这些条件的问题,贪心算法可能无法得到正确的解。

五、贪心算法的应用实例

(一)找零问题

问题描述:给定一组硬币面值和一个金额,求用最少的硬币数凑成该金额。

贪心策略:每次选择面值最大的硬币。

示例代码:

def coin_change(coins, amount):coins.sort(reverse=True)count = 0for coin in coins:while amount >= coin:amount -= coincount += 1return count if amount == 0 else -1

解释:每次选择面值最大的硬币,直到金额为0。

(二)活动安排问题

问题描述:给定一组活动的开始时间和结束时间,求最多可以安排多少个不冲突的活动。

贪心策略:每次选择结束时间最早的活动。

示例代码:

def activity_selection(start, finish):activities = sorted(zip(start, finish), key=lambda x: x[1])count = 0last_finish = 0for activity in activities:if activity[0] >= last_finish:count += 1last_finish = activity[1]return count

解释:每次选择结束时间最早的活动,确保后续活动不冲突。

(三)霍夫曼编码

问题描述:给定一组字符及其频率,求一种最优的编码方式,使得编码后的字符串长度最短。

贪心策略:每次选择频率最小的两个字符合并。

示例代码:

import heapqclass Node:def __init__(self, char, freq):self.char = charself.freq = freqself.left = Noneself.right = Nonedef __lt__(self, other):return self.freq < other.freqdef huffman_encoding(frequencies):heap = [Node(char, freq) for char, freq in frequencies.items()]heapq.heapify(heap)while len(heap) > 1:left = heapq.heappop(heap)right = heapq.heappop(heap)merged = Node(None, left.freq + right.freq)merged.left = leftmerged.right = rightheapq.heappush(heap, merged)return heap[0]def build_codes(root, prefix="", code={}):if root is None:returnif root.char is not None:code[root.char] = prefixbuild_codes(root.left, prefix + "0", code)build_codes(root.right, prefix + "1", code)return codefrequencies = {'a': 5, 'b': 9, 'c': 12, 'd': 13, 'e': 16, 'f': 45}
root = huffman_encoding(frequencies)
codes = build_codes(root)
print(codes)

解释:通过构建霍夫曼树,为每个字符分配最优的编码。

(四)最小生成树(Kruskal算法)

问题描述:给定一个加权无向图,求一个最小生成树。

贪心策略:每次选择权重最小的边,确保不形成环。

示例代码:

class UnionFind:def __init__(self, n):self.parent = list(range(n))def find(self, x):if self.parent[x] != x:self.parent[x] = self.find(self.parent[x])return self.parent[x]def union(self, x, y):rootX = self.find(x)rootY = self.find(y)if rootX != rootY:self.parent[rootX] = rootYdef kruskal(edges, n):edges.sort(key=lambda x: x[2])uf = UnionFind(n)mst = []for u, v, weight in edges:if uf.find(u) != uf.find(v):uf.union(u, v)mst.append((u, v, weight))return mstedges = [(0, 1, 2), (1, 2, 3), (2, 3, 1), (3, 0, 4), (0, 2, 5)]
n = 4
print(kruskal(edges, n))

解释:通过选择权重最小的边,逐步构建最小生成树。

总结

贪心算法是一种简单而高效的算法设计策略,适用于具有贪心选择性质和最优子结构的问题。它通过在每一步选择中采取当前状态下最优的选择,逐步构建解。虽然贪心算法不能保证总是得到全局最优解,但在很多实际问题中都能得到较好的近似解。在使用贪心算法时,需要仔细分析问题的性质,确保贪心策略的有效性。

相关文章:

青少年编程与数学 02-016 Python数据结构与算法 16课题、贪心算法

青少年编程与数学 02-016 Python数据结构与算法 16课题、贪心算法 一、贪心算法的基本概念定义组成部分 二、贪心算法的工作原理三、贪心算法的优点四、贪心算法的缺点五、贪心算法的应用实例&#xff08;一&#xff09;找零问题&#xff08;二&#xff09;活动安排问题&#x…...

日常学习开发记录-slider组件

日常学习开发记录-slider组件 从零开始实现一个优雅的Slider滑块组件前言一、基础实现1. 组件结构设计2. 基础样式实现3. 基础交互实现 二、功能增强1. 添加拖动功能2. 支持范围选择3. 添加垂直模式 三、高级特性1. 键盘操作支持2. 禁用状态 五、使用示例六、总结 从零开始实现…...

Windows 系统如何使用Redis 服务

前言 在学习过程中&#xff0c;我们长期接触到的是Mysql 关系型数据库&#xff0c;也是够我们平时练习项目用的&#xff0c;但是后面肯定会有大型数据的访问就要借助新的新的工具。 一、什么是Redis Redis&#xff08;Remote Dictionary Server&#xff09;是一个基于内存的 键…...

【unity游戏开发入门到精通——UGUI】CanvasScaler画布缩放器组件

注意&#xff1a;考虑到UGUI的内容比较多&#xff0c;我将UGUI的内容分开&#xff0c;并全部整合放在【unity游戏开发——UGUI】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、CanvasScaler画布缩放器组件是什么二、CanvasScaler的三种适配模式1、Cons…...

Hugging Face 模型:AI 模型的“拥抱”与开源革命!!!

&#x1f310; Hugging Face 模型&#xff1a;AI 模型的“拥抱”与开源革命 用表情符号、图表和代码&#xff0c;探索开源模型生态的底层逻辑与应用场景&#xff01; &#x1f31f; 名字由来&#xff1a;为什么叫 Hugging Face&#xff1f; “Hugging”&#xff1a;象征 开放…...

关于 人工智能(AI)发展简史 的详细梳理,按时间阶段划分,涵盖关键里程碑、技术突破、重要人物及挑战

以下是关于 人工智能&#xff08;AI&#xff09;发展简史 的详细梳理&#xff0c;按时间阶段划分&#xff0c;涵盖关键里程碑、技术突破、重要人物及挑战&#xff1a; 字数&#xff1a;约2500字 逻辑结构&#xff1a;时间线清晰&#xff0c;分阶段描述技术突破、关键事件与挑战…...

微服务即时通信系统---(四)框架学习

目录 ElasticSearch 介绍 安装 安装kibana ES客户端安装 头文件包含和编译时链接库 ES核心概念 索引(Index) 类型(Type) 字段(Field) 映射(mapping) 文档(document) ES对比MySQL Kibana访问ES测试 创建索引库 新增数据 查看并搜索数据 删除索引 ES…...

Android查看依赖树的方法,简单有效

一、使用命令打印 在工具栏“Terminal”中输入以下命令&#xff0c;即可打印依赖树信息 gradlew xxxx:dependencies (“xxxx”为module名称)二、工具栏双击打印 右侧“Gradle”工具栏打开按下图顺序依次查找到“dependencies”&#xff0c;双击后依赖树就会在控制台中打印出…...

自动化测试工具playwright中文文档-------14.Chrome 插件

介绍 注意 插件仅在以持久化上下文启动的 Chrome/Chromium 浏览器中工作。请谨慎使用自定义浏览器参数&#xff0c;因为其中一些可能会破坏 Playwright 的功能。 以下是获取位于 ./my-extension 的 Manifest v2 插件背景页面句柄的代码示例。 from playwright.sync_api imp…...

GitHub配置密钥

1.生成SSH密钥 1&#xff09;检查 SSH 密钥是否存在 首先&#xff0c;确认是否已经在本地系统中生成了 SSH 密钥对。可以通过以下命令检查&#xff1a; ls -al ~/.ssh 在命令输出中&#xff0c;应该能看到类似 id_rsa 和 id_rsa.pub 这样一对文件。如果这些文件不存在&#…...

【2-10】E1与T1

前言 之前我们简单介绍了人类从电话线思维到如今的数据报分组交换思维过渡时期的各种技术产物&#xff0c;今天我们重点介绍 E1/T1技术。 文章目录 前言1. 产生背景2. T13. E14. SONET4.1 OC-14.2 OC-3 及其它 5. SDH5.1. STM-1 6. SONET VS SDH后记修改记录 1. 产生背景 E1/…...

【设计模式】适配器模式:让不兼容的接口和谐共处

引言 在软件开发中&#xff0c;我们经常会遇到这样的情况&#xff1a;两个已经存在的接口无法直接协同工作&#xff0c;但我们又希望它们能够无缝对接。这时&#xff0c;适配器模式就派上用场了。适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&…...

Servlet、HTTP与Spring Boot Web全面解析与整合指南

目录 第一部分&#xff1a;HTTP协议与Servlet基础 1. HTTP协议核心知识 2. Servlet核心机制 第二部分&#xff1a;Spring Boot Web深度整合 1. Spring Boot Web架构 2. 创建Spring Boot Web应用 3. 控制器开发实践 4. 请求与响应处理 第三部分&#xff1a;高级特性与最…...

PTA:古风排版

中国的古人写文字&#xff0c;是从右向左竖向排版的。本题就请你编写程序&#xff0c;把一段文字按古风排版。 输入格式&#xff1a; 输入在第一行给出一个正整数N&#xff08;<100&#xff09;&#xff0c;是每一列的字符数。第二行给出一个长度不超过1000的非空字符串&a…...

Android LiveData学习总结(源码级理解)

LiveData 工作原理 数据持有与观察者管理&#xff1a;LiveData 内部维护着一个数据对象和一个观察者列表。当调用 observe 方法注册观察者时&#xff0c;会将 LifecycleOwner 和 Observer 包装成 LifecycleBoundObserver 对象并添加到观察者列表中。生命周期感知&#xff1a;L…...

Pandas进行数据预处理(标准化数据)③

数据标准化处理代码解析 数据标准化处理代码解析课前预习1. 离差标准化&#xff08;Min - Max Scaling&#xff09;结果2. 标准差标准化&#xff08;Standard Scaling&#xff09;结果3. 小数定标标准化&#xff08;Decimal Scaling&#xff09;结果 代码整体概述代码详细解析1…...

vue里provide作用:将一组全局方法注入到 Vue 应用的所有子组件中

在 Vue.js 中&#xff0c; provide(mainFunc, {...}) 是依赖注入(Dependency Injection)的提供者(provider)部分&#xff0c;它的作用是&#xff1a; 功能说明 &#xff1a; 将一组全局方法注入到 Vue 应用的所有子组件中子组件可以通过 inject 接收这些方法 import { provi…...

基于uniapp 实现画板签字

直接上效果图 代码 <template><view class"container"><!-- 签名画布 --><view class"canvas-container"><canvas canvas-id"signCanvas" class"sign-canvas"touchstart"handleTouchStart"touc…...

JDBC 初认识、速了解

目录 一. JDBC的简介 1. 数据的持久化 2. 什么是JDBC 二. JDBC中常用的类和接口 1. Driver 接口 2. DriverManager 类 3. Connection 接口 4. Statement 接口 5. PreparedStatement接口 6. ResultSet 接口 三. 总结 前言 从现在开始就来讲解JDBC的相关知识了 本文的…...

(2025亲测可用)Chatbox多端一键配置Claude/GPT/DeepSeek-网页端配置

1. 资源准备 API Key&#xff1a;此项配置填写在一步API官网创建API令牌&#xff0c;一键直达API令牌创建页面创建API令牌步骤请参考API Key的获取和使用API Host&#xff1a;此项配置填写https://yibuapi.com/v1查看支持的模型请参考这篇教程模型在线查询 2. ChatBox网页版配…...

4.vtk光照vtkLight

文章目录 VTK中的光照1. vtkLight 的两种类型&#xff1a;位置光照和方向光照2. vtkLight 的常用方法3. 方法命名风格4. vtkProp 的可见性与 vtkLight 的开关 示例 VTK中的光照 vtkLight: 用于定义一个或多个光源。每个光源可以有其颜色、位置、焦点等属性。 vtkActor: 每个vtk…...

【速写】formatting_func与target_modules的细节(peft)

文章目录 SFTTrainer的构造参数版本差异怎么写formatting_func?关于lora_config中的target_modules能否在target_modules中指定特定某个模块&#xff1f; 以下面的示例pipeline为案&#xff1a; # -*- coding: utf8 -*- # author: caoyang # email: caoyangstu.sufe.edu.cnfr…...

YOLOv2学习笔记

YOLOv2 背景 YOLOv2是YOLO的第二个版本&#xff0c;其目标是显著提高准确性&#xff0c;同时使其更快 相关改进&#xff1a; 添加了BN层——Batch Norm采用更高分辨率的网络进行分类主干网络的训练 Hi-res classifier去除了全连接层&#xff0c;采用卷积层进行模型的输出&a…...

第十五届蓝桥杯----数字串个数\Python

目录 问题: 思想: 代码: 问题: Q:小蓝想要构造出一个长度为 10000 的数字字符串&#xff0c;有以下要求&#xff1a; 1) 小蓝不喜欢数字 0 &#xff0c;所以数字字符串中不可以出现 0 &#xff1b; 2) 小蓝喜欢数字 3 和 7 &#xff0c;所以数字字符串中必须…...

【YOLOv8改进 - 卷积Conv】PConv(Pinwheel-shaped Conv): 风车状卷积用于红外小目标检测, 复现!

YOLOv8目标检测创新改进与实战案例专栏 专栏目录: YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例 专栏链接: YOLOv8基础解析+创新改进+实战案例 文章目录 YOLOv8目标检测创新改进与实战案例专栏介绍摘要文章链…...

LeetCode:链表

160. 相交链表 /*** 单链表的定义* Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution {public ListNode getIntersectionN…...

Dockerfile项目实战-单阶段构建Vue2项目

单阶段构建镜像-Vue2项目 1 项目层级目录 以下是项目的基本目录结构&#xff1a; 2 Node版本 博主的Windows电脑安装了v14.18.3的node.js版本&#xff0c;所以直接使用本机电脑生成项目&#xff0c;然后拷到了 Centos 7 里面 # 查看本机node版本 node -v3 创建Vue2项目 …...

音视频小白系统入门笔记-0

本系列笔记为博主学习李超老师课程的课堂笔记&#xff0c;仅供参阅 音视频小白系统入门课 音视频基础ffmpeg原理 绪论 ffmpeg推流 ffplay/vlc拉流 使用rtmp协议 ffmpeg -i <source_path> -f flv rtmp://<rtmp_server_path> 为什么会推流失败&#xff1f; 默认…...

Zabbix 简介+部署+对接Grafana(详细部署!!)

目录 一.Zabbix简介 1.Zabbix是什么 2.Zabbix工作原理&#xff08;重点&#xff09;​ 3.Zabbix 的架构&#xff08;重点&#xff09;​ 1.服务端 2.客户端&#xff1a; 4.Zabbix和Prometheus区别 二.Zabbix 部署 1.前期准备 2.安装zabbix软件源和组件 3.安装数据库…...

C++: Initialization and References to const 初始化和常引用

cpp primer 5e, P97. 理解 这是一段很容易被忽略、 但是又非常重要的内容。 In 2.3.1 (p. 51) we noted that there are two exceptions to the rule that the type of a reference must match the type of the object to which it refers. The first exception is that we …...