Python 算法高级篇:贪心算法的原理与应用

news2024/11/15 8:28:28

Python 算法高级篇:贪心算法的原理与应用

  • 引言
  • 1. 什么是贪心算法?
  • 2. 贪心算法的应用
    • 2.1 最小生成树- Prim 算法
    • 2.2 背包问题
    • 2.3 哈夫曼编码
  • 3. 代码示例
    • 3.1 会议室安排问题
  • 4. 总结

引言

贪心算法是一种基于启发式的问题解决方法,它通过每一步选择局部最优解来构建全局最优解。本篇博客将深入探讨贪心算法的原理,提供详细的解释和示例,包括如何在 Python 中应用贪心算法解决各种问题。

😃😄 ❤️ ❤️ ❤️

1. 什么是贪心算法?

贪心算法是一种基于启发式的算法设计范式,其核心思想是在每一步选择当前状态下的局部最优解,以期望最终得到全局最优解。贪心算法通常包括以下步骤:

  • 1 . 选择: 从问题的所有选择中,选择当前状态下的局部最优解。这是贪心算法的核心步骤。

  • 2 . 可行性: 检查选择的可行性,即所选解是否满足问题的约束。

  • 3 . 目标函数: 更新问题的目标函数,通常是将问题减小到更小的子问题。

  • 4 . 终止条件: 判断是否已经获得了全局最优解,如果是则终止。

贪心算法适用于那些具有"贪心选择性质"的问题,即每一步的最优选择不依赖于之前的选择。

2. 贪心算法的应用

贪心算法在多个领域都有广泛的应用。以下是一些示例,说明如何应用贪心算法解决不同类型的问题。

2.1 最小生成树- Prim 算法

最小生成树问题是在一个加权无向图中找到一棵包含所有顶点的树,使得树的权重之和最小。 Prim 算法是贪心算法的一个典型应用,它从一个单点出发,每次选择最短的边来扩展树。

from queue import PriorityQueue

def prim(graph):
    min_span_tree = []
    visited = set()
    start_vertex = list(graph.keys())[0]

    priority_queue = PriorityQueue()
    priority_queue.put((0, start_vertex))

    while not priority_queue.empty():
        cost, vertex = priority_queue.get()
        if vertex not in visited:
            visited.add(vertex)
            min_span_tree.append((vertex, cost))
            for neighbor, neighbor_cost in graph[vertex]:
                if neighbor not in visited:
                    priority_queue.put((neighbor_cost, neighbor))

    return min_span_tree

2.2 背包问题

背包问题是一个组合优化问题,目标是选择一组物品放入背包,以使得它们的总价值最大,但不能超过背包的容量。贪心算法可用于解决部分背包问题,其中物品可以分割。

def fractional_knapsack(items, capacity):
    items.sort(key=lambda x: x[1] / x[0], reverse=True)
    max_value = 0

    for item in items:
        if capacity >= item[0]:
            max_value += item[1]
            capacity -= item[0]
        else:
            max_value += (capacity / item[0]) * item[1]
            break

    return max_value

2.3 哈夫曼编码

哈夫曼编码是一种用于数据压缩的贪心算法。它通过构建一棵哈夫曼树,其中频率较高的字符在树的较低层,频率较低的字符在树的较高层。这样,可以用较短的编码表示高频字符,从而实现数据的高效压缩。

import heapq
from collections import defaultdict

def build_huffman_tree(data):
    freq = defaultdict(int)
    for char in data:
        freq[char] += 1

    heap = [[weight, [char, ""]] for char, weight in freq.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 heap[0][1:]

data = "this is an example for huffman encoding"
huffman_tree = build_huffman_tree(data)
print("Huffman Codes:")
for char, code in huffman_tree:
    print(f"{char}: {code}")

这个示例演示了如何构建哈夫曼编码树,然后生成字符的哈夫曼编码。哈夫曼编码是一种变长编码,其中不同字符的编码长度不同,但它保证没有编码是其他编码的前缀,因此可以唯一解码。

3. 代码示例

接下来,让我们看一个具体的贪心算法示例,解决会议室安排问题。

3.1 会议室安排问题

def max_meetings(meetings):
    if not meetings:
        return []

    # 按结束时间升序排序
    meetings.sort(key=lambda x: x[1])
    
    result = [meetings[0]]
    prev_end = meetings[0][1]

    for meeting in meetings[1:]:
        start, end = meeting
        if start >= prev_end:
            result.append(meeting)
            prev_end = end

    return result

meetings = [(1, 3), (2, 4), (3, 5), (5, 7), (6, 8)]
selected_meetings = max_meetings(meetings)
print("Selected Meetings:")
for meeting in selected_meetings:
    print(meeting)

这个示例演示了如何使用贪心算法解决会议室安排问题。算法首先按会议结束时间升序排序,然后从第一个会议开始,选择不重叠的会议,以最大化安排的会议数量。

4. 总结

贪心算法是一种强大的问题解决方法,它通过选择局部最优解来构建全局最优解。本篇博客介绍了贪心算法的基本原理和应用,包括最小生成树、背包问题、哈夫曼编码和会议室安排问题等示例。贪心算法可以帮助你高效地解决各种问题,但需要注意它并不适用于所有类型的问题。

[ 专栏推荐 ]
😃 Python 算法初阶:入门篇》😄
❤️【简介】:本课程是针对 Python 初学者设计的算法基础入门课程,涵盖算法概念、时间复杂度、空间复杂度等基础知识。通过实例演示线性搜索、二分搜索等算法,并介绍哈希表、深度优先搜索、广度优先搜索等搜索算法。此课程将为学员提供扎实的 Python 编程基础与算法入门,为解决实际问题打下坚实基础。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1131461.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

众和策略:配债不够10张怎么办?

近年来,跟着金融商场的展开和各类企业的资金需求增加,债券商场规划逐步扩展。债券作为一种重要的信誉工具,为企业融资供应了一个灵敏的渠道。但是,在进行债券发行时,有时候或许会遇到一个问题,那就是配债数…

Games104现代游戏引擎笔记 网络游戏架构基础

挑战1:网络同步 挑战2:是网络的可靠性,包括应对网络的延迟,丢包和掉线 挑战3: 反作弊和安全系统,因为网络游戏的本质是经济系统 挑战4:多样性(不同设备,不同服务器),在不停服的情况下热更新 挑战5:大量人数时对高并发…

68 买卖股票的最佳时机

买卖股票的最佳时机 题解1 贪心题解2 DP 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。…

[④ADRV902x]: Digital Filter Configuration(发射端)

前言 与接收端相反的,发射端链路filter是对信号做interpolation处理,增加信号采样率。 Transmitter Signal Path INT5:5倍上采,filter系数固定,可以选择采用INT5或者THB3和THB2的组合。Transmit Half-Band 3 Filter …

Spring Boot 配置邮件发送服务

文章归档&#xff1a;https://www.yuque.com/u27599042/coding_star/ctwkrus1r9zrytsq spring boot 版本 3.1.3 邮件发送服务使用的 QQ 邮箱提供的 依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent…

Linux CentOS 8(firewalld的配置与管理)

Linux CentOS 8&#xff08;firewalld的配置与管理&#xff09; 目录 一、firewalld 简介二、firewalld 工作概念1、预定义区域&#xff08;管理员可以自定义修改&#xff09;2、预定义服务 三、firewalld 配置方法1、通过firewall-cmd配置2、通过firewall图形界面配置 四、配置…

UUID转16字节数组(Java)

最近在写协议的时候&#xff0c;遇到需要将一个36字符长度的UUID转为长度为16的字节数组&#xff1b; 这样处理的话那我们就需要保证唯一性和可还原&#xff1b; 于是我使用了下面的方式&#xff1a; /*** uuid转16字节数组** param uuidStr* return*/private static byte[] …

国产服务器安装onlyoffice详细教程

1.通过docker安装onlyoffice 找一台能访问互联网的服务器下载onlyoffice镜像 sudo docker pull onlyoffice/documentserver查看镜像 docker images 启动onlyoffice docker run -itd \ --name onlyoffice1 \ --restart always \ -p 8099:80 \ -v /data/docker/onlyoffice/lo…

浅谈食品加工厂能耗情况分析平台解决方案

叶根胜 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;本文对某小型食品加工厂能源消耗进行了评价&#xff0c;分析了该工厂节能减排的潜力空间。有关节能减排效率的因素包括工厂的技术水准、管理方法和发展规模。依据研究提出对节能减排制度建设等方面的创新建议…

SpringCloud Alibaba【一】简单介绍

SpringCloud 提起微服务&#xff0c;不得不提 Spring Cloud 全家桶系列&#xff0c;Spring Cloud 是一个服务治理平台&#xff0c;是若干个框架的集合&#xff0c;提供了全套的分布式系统解决方案。包含了&#xff1a;服务注册与发现、配置中心、服务网关、智能路由、负载均衡…

生成式 AI 如何释放开发者的生产力?

生成式 AI 可以将程序员的开发速率提高两倍。技术管理者有望通过 AIGC 应用&#xff0c;大幅缩短四类关键开发任务的完成时间&#xff0c;进而提升组织生产力。 ——麦肯锡《通过生成式 AI 释放开发者生产力》 01 生成式 AI 将如何影响研发效能&#xff1f; 麦肯锡最近的一项实…

如果你要去拜访国外客户需要做哪些准备

由于产品不同&#xff0c;我们出国拜访客户的机会很少&#xff0c;一般出去都是受客户邀请&#xff0c;会同时带上设计师或者工程师&#xff0c;很少有独自出国的&#xff0c;毕竟样品是没法带的&#xff0c;最多只能带上画册和项目图。 想起几年前&#xff0c;公司要出国参展…

MIT6.5830 Lab1-GoDB实验记录(一)

MIT6.5830 Lab1-GoDB实验记录&#xff08;一&#xff09; – WhiteNights Site 标签&#xff1a;Golang, 数据库 了解接下来的实验要做什么。 实验目的 实现GoDB 从lab1开始一直到实验结束&#xff0c;我们的目的只有一个–实现GoDB&#xff0c;一个基础的数据库管理系统。而…

派克斯电脑全局改IP如何辅助捉妖游戏

捉妖游戏是一款非常受欢迎的手机游戏&#xff0c;玩家需要通过探索地图来捉到各种可爱的妖精。为了让游戏更具趣味性&#xff0c;玩家可以通过地图制作来设计自己的捉妖之旅。在这篇教程中&#xff0c;我们将向您展示如何使用电脑全局软件工具——派克斯&#xff0c;来制作捉妖…

echarts案例之仪表盘如何单独设置指针颜色?

一、此案例基于Vue3ts&#xff0c;效果展示&#xff1a; 二、单个属性的值&#xff1a; 1、单独设置指针的颜色 series&#xff1a;[ ...... { ...... itemStyle: { color: rgba(161, 255, 249, 1), }, ...... } ...... ] 2、设置最外圈数值的样式 series&#xff1a;[ ......…

【linux】安装openjdk8

openjdk的官网 点我就到官网 jdk8的网址 安装 yum install -y java-1.8.0-openjdk-devel 出现Complete! 就是安装完成。 验证 java -version选择对应的包 java-1.8.0-openjdk-devel 开发 Java 程序&#xff0c;请安装该java-1.8.0-openjdk-devel软件包。 java-1.8.0-op…

零代码开发、可视化界面!飞桨AI Studio星河社区带你玩转Prompt应用

号外号外&#xff01;飞桨AI Studio星河社区上线新版文心一言专区&#xff0c;帮助开发者完成一言插件&大模型应用开发&#xff0c;与此同时推出Prompt模板库供开发者使用。 零代码开发、可视化界面&#xff01;飞桨AI Studio星河社区带你玩转Prompt应用

使用Python的Flask框架开发验证码登录功能

目录 一、安装和配置Flask 二、生成验证码 三、处理用户输入和验证验证码 四、实现安全的用户认证 五、创建HTML模板 总结 验证码登录功能是现代Web应用程序中常见的安全特性之一&#xff0c;它有助于防止自动化机器人或恶意用户进行非法登录。在本文中&#xff0c;我们将…

windows添加定时任务命令

windows添加定时任务 一.schtasks命令 windows中常用来添加定时任务的命令 二.常用操作 1.添加定时任务 每天下午14:58:00执行test.bat脚本 C:\Users\DELL>schtasks /create /tn doc /tr C:\Users\DELL\Desktop\test.bat /sc DAILY /st 14:58:00 成功: 成功创建计划任务…

【期中复习】深度学习

文章目录 机器&#xff08;深度&#xff09;学习的四大核心要素为什么深度学习&#xff0c;不增加网络宽度黑盒模型的问题计算图线性神经网络梯度下降学习率优化方法softmax函数用于多分类交叉熵线性回归与softmax回归的对比为什么需要非线性激活函数感知机线性回归、softmax回…