文章目录
前言
本博客仅做学习笔记,如有侵权,联系后即刻更改
科普:贪心算法
一、定义
贪心算法是指在对问题进行求解时,在每一步选择中都采取最好或者最优(最有利)的选择,从而希望最终结果是最好或者最优的算法
贪心算法是通过局部最优求解全局最优的一种算法,能够用贪心算法求解的问题需具备贪心选择性质和最优子结构性质
二、特点
- 贪心选择、最优子结构
所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到
每作一次贪心选择可将所求问题简化为规模更小的子问题
三、使用场景
适用场景:
- 整体最优解:
活动安排问题、部分背包问题、最优装载问题、单源最短路径问题、最小生成树问题等- 一些问题只能得到近似最优解:
多机调度问题、0-1背包问题等
何时使用
下面示例的超链接都是我写的博客喔,感兴趣可以点进去看看
按照单位重量价值从高到低选取物品,部分背包问题的时间复杂度为O(nlogn)
可以使用贪心算法求解活动安排问题,每次选择具有最早完成时间的相动,可以使剩余的可安排时间段极大化,进而求得整体最优解
采用重量最轻者先装的贪心选择策略,可产生最优装载问题的最优解
最小生成树
Prim算法:按点检索,适用于稠密图
- 定义
Prim算法是一种基于贪心思想求解加权无向图的最小生成树的算法- 时间复杂度:
Prim算法的时间复杂度为T(n)= O(V2),适合于处理稠密图;如果使用小根堆优化,时间复杂度为T(n)=O(ElogV)
Kruskal算法:并查集+最小生成树
- 并查集一种树型数据结构,用于处理一些不相交集合的合并及查询问题
- 可以通过按秩合并和路径压缩对并查集进行优化
- Kruskal算法通过使用并查集可以高效地构造图的最小生成树
Dijkstra算法:不能存在负权边,松弛操作
- 定义:
√Dijjkstra算法是一个按路径长度递增的次序产生最短路径的算法- 时间复杂度
√Dijkstra算法的时间复杂度为T(n)= O(V2)- 最短路径问题:
单源最短路径问题(Dijkstra算法、Bellman-Ford算法、SPFA算法)
单终点最短路径问题(Dijkstra算法……)
单对顶点最短路径问题(Dijkstra算法……)
每对顶点间最短路径问题(Dijkstra算法………)
总结
小小励志
有些事你现在不做,一辈子都不会做了。
如果你想做一件事,全世界都会为你让路。
《搭车去柏林》