算法设计思想
    1.贪心、贪婪算法
    2.分而治之 → 快排 + 拓展的归并
    3.动态规划
    4.回溯        → 递归  n皇后问题
    5.分支定界

基本思想

通过作出在当前看来最优的选择(贪心选择),将原问题规模缩小,如此反复,直至得到最终解
贪心算法并非对所有问题都能得到整体最优解
贪婪算法每一步所选的结果都是局部的最优解
这么做的目的就是希望经过所有的步骤所得到的解答会是全局最优解
不过事实上的结果并不一定能达到全局最优解
贪婪算法所花的时间通常较少,且就算不是全局最优解,但最后所得结果也不会太差
贪婪准则:最小方案  最大方案  最值思想

背包问题: (货物装载问题)
给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品 i

用贪心算法解背包问题的基本步骤
首先计算每种物品单位重量的价值Vi/Wi,然后,依贪心选择策略,将尽可能多的单位重量(小)价值最高的物品装入背包。若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多地装入背包。依此策略一直地进行下去,直到背包装满为止。

最短路径问题

从A点出发到B点,如何找出最短的路径?

2 + 1 + 6 + 1 + 2 == 12,但是 12 不是最佳选择,3 + 1 + 2 + 1 + 2 == 9,所以贪心算法得到的答案不一定是最优解

DijKstra:迪杰斯特拉算法
使用贪心算法的思想,从起点到顶点的最短路径
通过不断的新选择距离最近的顶点,来逐渐扩大最短路径权值,
直到覆盖了所有的顶点

有 5 个顶点,每个顶点之间有一个权值,选定顶点 1 作为入口,1 ~  2 的距离是 10,当前 1 ~ 3  没有直接连通,用无穷大表示,以此类推 . . . 接着扩充第 2 个顶点,做连通状态,1 ~ 2 是连通状态,2 ~ 3 也是连通状态,1 ~ 3 的距离是  10 + 50 == 60,扩充顶点 4,1 ~ 3 有一个新的距离:1 - 4 - 3 距离 50 < 60,根据最短路径原则,把 1 ~ 3 的距离更新为 50,每次保留从当前节点到另一个节点的最小距离,不断更新当前顶点与其他顶点的最短路径,最终得到:到每一个顶点的最短距离

1        2        3        4

1              10

2                        20

3

4

[ 1 ][ 2 ] != ∞

[ 2 ][ 3 ] != ∞

1 ~ 2 是连通的状态,2 ~ 3 是连通的状态

如果当前位置的列数等于另一个位置的行数就是连通的状态,1 ~ 3 就是连通的状态

Huffman编码

哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法。其压缩率通常在20%~90%之间。哈夫曼编码算法用字符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表示方式。
给出现频率高的字符较短的编码,出现频率较低的字符以较长的编码,可以大大缩短总码长。

数据结构 --- 哈夫曼树基础
前缀码
对每一个字符规定一个0,1串作为其代码,并要求任一字符的代码都不是其它字符代码的前缀。这种编码称为前缀码。
      前缀约束:一个字符的编码必须不能是另一个编码
      的前缀,将数组以最优二叉树的方式存储。
       (规定左节点>右节点)
      算法步骤:
       step1:找出现频率最小的字符b,d。
       step2:将b,d合成一个新的子节点x1,并使f(x1)=f(b)+f(d)
       step3:在剩下的字符a,c,e和x1 按step1中方法找到两个新的子节点。直到所有的字符都包含在二叉树中。

短作业调度问题(操作系统的调度算法)

采用最短处理时间作业优先的贪心选择策略
可以设计出解多机调度问题的较好的近似算法。
按此策略,首先将n个作业依其所需的处理时间从大到小排序。
然后依此顺序将作业分配给空闲的处理机。
(优先队列)

迪杰斯特拉算法实现

直接用数组描述有向图    数据结构 --- 图的存储

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define NO 0xFFFFFF         //用无穷大表示不连通状态
#define MAX 10              //不能直接定义太大数组-> 堆栈溢出
//图的结构体描述
typedef struct graph
{char vexs[MAX];            //顶点数组int vexnum;               //顶点数int arcnum;                //边数int matrix[MAX][MAX];   //权值数组
}GRAPH,*LPGRAPH;
//遍历的图 选定入口 存储每一个最短距离-> 把每一个最短距离都记录下来
void DijKstra(GRAPH map, int in, int dist[])
{int i = 0;//成功获取路径的标记-> 标记数目由顶点数决定int flag[MAX];          //求出当前节点到其他节点的距离for (int i = 0; i < map.vexnum; i++) {//先把所有的标记置为0flag[i] = 0;    //当前节点到其他节点距离-> 遍历第一行权值数组dist[i] = map.matrix[in][i];}//in进来了做标记-> 已经扩充了in顶点flag[in] = 1;//in的距离置为 0dist[in] = 0;      //求扩充一个顶点后的最短路径-> 最小值int min;int k = 0;int j;  //2.扩充顶点-> 判断连通状态-> 每次扩充顶点都是距离最小的//数组存储顶点从下标 0 存储for (i = 1; i < map.vexnum; i++)    //i = 1本质是扩充第二个顶点{min = NO;                       //不连通状态-> 假设最小值为无穷大//如果存在比min小的值就是连通的状态-> 遍历扩充顶点的列 看有没有连通的for (j = 1; j < map.vexnum; j++) {//连通的状态判断if (flag[j] == 0 && dist[j] < min) {min = dist[j];          //改变当前最小值 k = j;                    //连通的状态}}//把当前标记置为1flag[k] = 1;//找以 k 为行找列是否有值-> 有值说明 i 和 j 顶点是连通的//如果扩充节点产生新路径的距离[k,j]的值 + 原来的距离min < 原来连通的路径dist,就需要更新distfor (j = 1; j < map.vexnum; j++) {//判断访问标记是不是扩充了if (flag[j] == 0 && (min + map.matrix[k][j]) < dist[j]) {//更新最短路径dist[j] = min + map.matrix[k][j];}}}printf("\n");//打印路径for (int i = 1; i < map.vexnum; i++) {//从入口开始到当前顶点的最短路径printf("最短路径:(%c,%c)=%d\n", map.vexs[in], map.vexs[i], dist[i]);}}
int main()
{//创建图GRAPH map = { {'1','2','3','4','5'},5,7,{{NO,10,NO,30,100},{NO,NO,50,NO,NO},{NO,NO,NO,NO,10},{NO,NO,20,NO,60},{NO,NO,NO,NO,NO}}};//选定入口从'1'这个顶点进来,找到其他顶点的距离 0号顶点当做入口int in = 0;     //存储所有的距离int dist[MAX]; DijKstra(map, in, dist);return 0;
}/*输出*/最短路径:(1,2)=10
最短路径:(1,3)=50
最短路径:(1,4)=30
最短路径:(1,5)=60

贪心算法、DijKstra算法相关推荐

  1. 计算机网络最短路径路由选择,最短路径算法Dijkstra算法在路由选择中的应用.pdf...

    最短路径算法Dijkstra算法在路由选择中的应用.pdf 计算机与网络 江苏联合职业技术学院徐州机电工程分院 王恒青 江苏联合职业技术学院徐州生物工程分院 宋如敏 [摘要]本文介绍了路由算法的设计目 ...

  2. 最短路算法 :Bellman-ford算法 Dijkstra算法 floyd算法 SPFA算法 详解

     本文链接   :http://www.cnblogs.com/Yan-C/p/3916281.html . 在本文中因为邻接表在比赛中不如前向星好写,而且前向星效率并不低所以,本文的代码 存图只 ...

  3. Floyd算法Dijkstra算法

    Floyd算法和Dijkstra算法 一.Floyd算法 1.简要介绍:Floyd算法又称插点法,是利用动态规划的思想寻找有权图多源点之间最短路径的算法,算法目的是寻找从点i到点j的最短路径. 2.步 ...

  4. 【JAVA算法】图论算法 -- Dijkstra算法

    写在前面:     我也是一名java语言的爱好者,仅以此文作为学习的记录,对于文中出现的代码规范,代码格式,算法效率等问题,希望各路大神不吝赐教,在下感激不尽.同是学习的同学也同样希望互相交流,取长 ...

  5. dijkstra算法_最短路径算法—Dijkstra算法详解

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

  6. 单源最短路径算法—Dijkstra算法(详细介绍)

    一.算法简介 ​       迪杰斯特拉算法(Dijkstra),由荷兰计算机科学家艾兹赫尔·戴克斯特拉在1956年提出.又叫狄克斯特拉算法.这是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中 ...

  7. dijkstra邻接表_掌握算法-图论-最短路径算法-Dijkstra算法

    如果图是赋权图,那么问题就变得更困难了不过我们仍然可以使用来自无权情形时的想法. 我们保留所有与前面相同的信息.因此,每个顶点或者标记为Known的,或者标记为Unknown的.像之前一样,对每一个顶 ...

  8. 牛客网 最短路 Floyd算法 Dijkstra算法 Java大数

    链接:https://www.nowcoder.com/questionTerminal/a29d0b5eb46b4b90bfa22aa98cf5ff17 来源:牛客网 最短路径 热度指数:2992 ...

  9. HDU 1874 SPFA算法Dijkstra算法

    SPFA 快速最短路算法 队列优化 #include<bits/stdc++.h> using namespace std; const int maxn=205; vector<p ...

  10. 图论经典算法——Dijkstra算法

    1. 解决问题 目的是求某一顶点到其余各个顶点[最短路径]. 2. Dijkstra算法思想 假设一共有两个顶点集合 S 和 T ,集合 S 中存放图中已找到最短路径的顶点,集合 T 中存放图中的剩余 ...

最新文章

  1. 一次 SQL 查询优化原理分析(900W+ 数据,从 17s 到 300ms)
  2. Django 2.1.3 中间件使用
  3. 如何使用Linux内核中没有被导出的变量或函数
  4. 使用wireshark观察SSL/TLS握手过程--双向认证/单向认证
  5. 在html中超链接_HTML 超级链接详细讲解
  6. 腾讯数据中心负责人揭秘:半年时间如何搭好“山洞鹅厂”
  7. 客户端读写数据到HDFS的流程
  8. TCP连接中的异常情况
  9. MySQL基本分区表
  10. Mac 下隐藏显示隐藏文件
  11. 【Vue-router中,require代替import解决vue项目首页加载时间过久】
  12. 2021年电工(技师)考试内容及电工(技师)复审考试
  13. oracle sql列转行_SQL列转行及行转列
  14. 链接计算机 输入网络密码,联想电脑怎么连接无线网输入密码时怎么输入
  15. 关联规则:策略挖掘中必不可少的算法
  16. xubuntu20.04安装记
  17. 网络游戏程序员须知 目录
  18. 域名的DA值和PA值用什么工具查询?
  19. at命令、crontab命令
  20. Citrix实践(三)——安装XenCenter管理XenServer

热门文章

  1. Linux -- 利用IPS(入侵防御系统) 构建企业Web安全防护网
  2. 接口taobao.tbk.sc.order.get(淘宝客订单查询)避坑指南
  3. 【C语言】C程序中正则表达式的使用
  4. vue微信公众号监听关闭页面
  5. 网站建设可以提升企业品牌形象吗?
  6. C++ 箭头-> 双冒号:: 点号.等操作符区别
  7. 智能热量表的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  8. 小程序报错:(“ errMsg “:“ navigateTo : fail can not navigateTo a tabbar page “}
  9. Photoshop制作网页模板
  10. js关于setTimeout实现延时执行函数并进行传参