首页 > 编程语言 >探索贪心算法:解决优化问题的高效策略

探索贪心算法:解决优化问题的高效策略

时间:2024-07-13 17:11:51浏览次数:20  
标签:activities 高效 self value 算法 root 贪心

贪心算法是一种在每一步选择中都采取当前最佳选择的算法,以期在整体上达到最优解。它广泛应用于各种优化问题,如最短路径、最小生成树、活动选择等。本文将介绍贪心算法的基本概念、特点、应用场景及其局限性。

贪心算法的基本概念

贪心算法的核心思想是局部最优策略,即在每一步选择中都选择当前看起来最优的选项,希望通过一系列的局部最优选择达到全局最优。

贪心算法的特点

  1. 局部最优选择:每一步都选择当前状态下最优的操作。
  2. 无需回溯:一旦做出选择,便不会更改。
  3. 逐步构建解决方案:从一个初始解开始,通过局部最优选择逐步构建完整解决方案。

贪心算法的应用场景

1. 活动选择问题

在活动选择问题中,给定一组活动及其开始和结束时间,要求选择尽可能多的互不重叠的活动。

def activity_selection(activities):
    activities.sort(key=lambda x: x[1])  # 按结束时间排序
    selected_activities = [activities[0]]
    
    for i in range(1, len(activities)):
        if activities[i][0] >= selected_activities[-1][1]:
            selected_activities.append(activities[i])
    
    return selected_activities

activities = [(0, 6), (1, 4), (3, 5), (5, 7), (3, 9), (5, 9), (6, 10), (8, 11), (8, 12), (2, 14), (12, 16)]
selected = activity_selection(activities)
print("Selected activities:", selected)

 

2. 背包问题(分数背包)

在分数背包问题中,物品可以部分装入背包。目标是选择物品使得背包中的总价值最大。

def fractional_knapsack(items, capacity):
    items.sort(key=lambda x: x[1] / x[0], reverse=True)  # 按价值密度排序
    total_value = 0.0
    for weight, value in items:
        if capacity >= weight:
            total_value += value
            capacity -= weight
        else:
            total_value += value * (capacity / weight)
            break
    return total_value

items = [(10, 60), (20, 100), (30, 120)]  # (weight, value)
capacity = 50
max_value = fractional_knapsack(items, capacity)
print("Maximum value in knapsack:", max_value)

 

3. 最小生成树(Kruskal 算法)

在图论中,最小生成树是连接所有顶点的权重最小的树。Kruskal 算法通过贪心策略选择最小边来构建最小生成树。

class DisjointSet:
    def __init__(self, n):
        self.parent = list(range(n))
        self.rank = [0] * n

    def find(self, u):
        if self.parent[u] != u:
            self.parent[u] = self.find(self.parent[u])
        return self.parent[u]

    def union(self, u, v):
        root_u = self.find(u)
        root_v = self.find(v)
        if root_u != root_v:
            if self.rank[root_u] > self.rank[root_v]:
                self.parent[root_v] = root_u
            elif self.rank[root_u] < self.rank[root_v]:
                self.parent[root_u] = root_v
            else:
                self.parent[root_v] = root_u
                self.rank[root_u] += 1

def kruskal(n, edges):
    ds = DisjointSet(n)
    edges.sort(key=lambda x: x[2])
    mst = []
    for u, v, weight in edges:
        if ds.find(u) != ds.find(v):
            ds.union(u, v)
            mst.append((u, v, weight))
    return mst

edges = [(0, 1, 10), (0, 2, 6), (0, 3, 5), (1, 3, 15), (2, 3, 4)]
n = 4  # Number of vertices
mst = kruskal(n, edges)
print("Edges in MST:", mst)

 

贪心算法的局限性

虽然贪心算法在许多问题中表现出色,但它并不适用于所有问题。贪心算法不能保证所有情况下都能找到全局最优解。例如,在0-1背包问题中,贪心算法可能无法找到最优解。

 

标签:activities,高效,self,value,算法,root,贪心
From: https://www.cnblogs.com/zx618/p/18300342

相关文章

  • 深度学习- 常用人脸检测算法
    人脸识别是计算机视觉中的一个重要任务,有多种库和框架可以用于实现人脸识别。以下是一些常用的人脸识别算法库及其特点:1.OpenCVOpenCV(OpenSourceComputerVisionLibrary)是一个开源计算机视觉和机器学习软件库。它可以用于各种计算机视觉任务,包括人脸检测和识别。特点:支......
  • 简要理解聚类算法:数据科学中的关键技术
    聚类算法是一种无监督学习方法,用于将数据集中的样本划分为若干个组或簇,使得同一簇内的样本在某种意义上相似,而不同簇之间的样本差异较大。聚类在数据科学、机器学习、模式识别等领域有广泛的应用。本文将介绍几种常见的聚类算法及其应用场景。什么是聚类?聚类是一种数据挖掘技术,......
  • LeetCode 3091. 执行操作使数据元素之和大于等于 K(贪心、数学)
    3091.执行操作使数据元素之和大于等于K思路:数学思维题。先执行操作一让1加到k的平方根向上取整的数t,然后执行操作二,达到数组和>=k即可。classSolution{public:intminOperations(intk){intt=ceil(sqrt(k));return(k+t-1)/t+t-2;}......
  • 分享 LLM 大语言模型算法特训 带你转型 AI 大语言模型算法工程师
    摘要本文旨在探讨大型语言模型(LargeLanguageModel,LLM)的进化路线,重点分析其领域微调技术的发展以及这些模型在自然语言处理(NaturalLanguageProcessing,NLP)中的应用范式。通过文献综述、技术分析和案例研究,本文详细阐述了LLM如何从统计语言模型发展到基于Transform......
  • 算法学习笔记(8.3)-(0-1背包问题)
    目录最常见的0-1背包问题:第一步:思考每轮的决策,定义状态,从而得到dp表第二步:找出最优子结构,进而推导出状态转移方程第三步:确定边界条件和状态转移顺序方法一:暴力搜素代码示例:方法二:记忆化搜索时间复杂度取决于子问题数量,也就是O(n*cap)。实现代码如下:方法三:动态规划代......
  • 昇思25天学习打卡营第14天|K近邻算法实现红酒聚类
    红酒Wine数据集类别(13类属性):Alcohol,酒精;Malicacid,苹果酸Ash,灰;Alcalinityofash,灰的碱度;Magnesium,镁;Totalphenols,总酚;Flavanoids,类黄酮;Nonflavanoidphenols,非黄酮酚;Proanthocyanins,原花青素;Colorintensity,色彩强度;Hue,色调;OD280/OD315ofdilutedwines,稀释酒的......
  • 排序算法——选择排序法
    选择排序算法概述选择排序(SelectionSort)是一种简单直观的排序算法。它的基本思想是:在要排序的一组数中,选出最小(或最大)的一个数与第一个位置的数交换;然后在剩下的数当中再找最小(或最大)的与第二个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较......
  • 「代码随想录算法训练营」第十天 | 栈与队列 part2
    150.逆波兰表达式求值题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/题目难度:中等文章讲解:https://programmercarl.com/0150.逆波兰表达式求值.html视频讲解:https://www.bilibili.com/video/BV1kd4y1o7on题目状态:多次修改bug后通过个人思路:......
  • 机器学习算法-决策树
    一、决策树简介    决策树是一种分类与回归的方法,它以树形结构的形式进行呈现,可以认为是if-then规则的集合,也可以认为是特征空间与类空间上的条件概率分布。二、如何理解决策树?    我们大部分人都有过租房子的经历,那你是怎么决定要租一个房子的呢?我们一般判......
  • 【算法】求 x 的 n 次方
    1.概述题目链接牛客网题目描述给定一个double类型的浮点数x和int类型的整数n,求x的n次方。1.1解题思路最直观的解法是将x重复乘n次,x\*x\*x...\*x,那么时间复杂度为O(N)。因为乘法是可交换的,所以可以将上述操作拆开成两半(x\*x..\*x)\*(x\*x..\*x),两......