程序员常用的十一种算法_编程常见的算法有哪些_识时务者-HJJ的博客-程序员秘密

技术标签: HandsomeForum  算法  学习  java  


算法介绍

程序员常用的十一种算法

1.二分查找算法

将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后;将要查找的值和数组的中值进行比较,若小于中值则在中值前 面找,若大于中值则在中值后面找,等于中值时直接返回。然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分。

2.分治法

分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题。

解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题。

合并:将各个子问题的解合并为原问题的解。

3.动态规划

动态规划是将问题分解成若干个子问题,依次求解子问题,且前一个子问题的解为后一个子问题的求解提供信息。最后一个子问题的解即为原问题的解。

动态规划中的每个子问题只求解一次,一旦子问题的解被求出,则将该解存储起来,方便之后的子问题求解。相比递归算法,动态规划中每个子问题只求解一次,具有天然的剪枝功能,大大减少了计算量与时间。

动态规划三要素
状态转移方程
最优子结构
边界

针对问题,设计状态转移方程,寻找最优子结构和边界。这是实现动态规划的关键。

4.字符串暴力匹配算法

1.如果当前字符匹配成功(即str1[i] == str2[j]),则i++,j++,继续匹配下一个字符。

2.如果失配(即str1[i] != str2[j]),令i=i-(j-1),j = 0。相当于每次匹配失败时,i回溯,j被置为0。

3.用暴力方法解决问题的话会有大量的回溯,每次只移动一位,若是不匹配,移动到下一位接着判断,浪费了大量的时间。

5.KMP算法

KMP算法时一个解决模式串在文本串是否出现过,如果出现过,返回最早出现的位置的经典算法。
Knuth-Morris-Pratt字符串查找算法,简称KMP算法。
KMP算法通过利用之前判断该信息,通过一个next数组,保存模式串中前后最长公共子序列的长度,
每次回溯时,通过next数组找到,前面匹配过的位置,省去大量时间。

6.贪心算法

贪心算法的基本思路:
1.建立数学模型来描述问题。
2.把求解的问题分成若干个子问题。
3.对每一子问题求解,得到子问题的局部最优解。
4.把子问题的解局部最优解合成原来解问题的一个解。

7.普里姆算法介绍(找点)

普利姆(Prim)算法求最小生成树,也就是在包含n个顶点的连通图中,找出只有(n-1)条边包含所有n个顶点的连通子图,也就是所谓的极小连通子图
普里姆算法如下:

(1)设G=(V,E)是连通网,T=(U,D)是最小生成树,V,U是顶点集合,E,D是边的集合
(2)若从顶点u开始构造最小生成树,则从集合v中取出顶点u放入集合U中,标记顶点v的visited[u] = 1
(3)若集合U中顶点ui与集合V-U中的顶点vj之间存在边,则寻找这些边中权值最小的边,单不能构成回路,将顶点vj加入集合U中,将边(ui,vj)加入集合D中,标记visited[vj]=1
(4)重复步骤2,知道U,V相等,即所有顶点都被标记为访问过,此时D中有n-1条边

8.克鲁斯卡尔(Kruskal)算法(找边)

基本思想:按照权值从小到大的顺序选择n-1条边,并保证n-1条边不构成回路

具体做法:首先构造一个只含有n个顶点的森林,然后依权值从小到大从连通网中选择加入到森林中,并是森林中不产生回路,直到森林变成一棵树为止

9.迪杰斯特拉算法

基本思想
通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。

此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),
而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。
初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是"起点s到该顶点的路径"。
然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。
 然后,再从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。
  ... 重复该操作,直到遍历完所有顶点。

操作步骤
(1) 初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为"起点s到该顶点的距离"[例如,U中顶点v的距离为(s,v)的长度,然后s和v不相邻,则v的距离为∞]。
(2) 从U中选出"距离最短的顶点k",并将顶点k加入到S中;同时,从U中移除顶点k。
(3) 更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离,是由于上一步中确定了k是求出最短路径的顶点,从而可以利用k来更新其它顶点的距离;例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。
(4) 重复步骤(2)和(3),直到遍历完所有顶点。

10.弗洛伊德算法

算法描述

在有向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到V钟任意两点之间的路径长度最小值。
弗洛伊德算法选取某个节点k作为i到j需要经过的中间节点,通过比较d(i,k)+d(k,j)和现有d(i,j)的大小,将较小值更新为路径长度,对k节点的选取进行遍历,以得到在经过所有节点时i到j的最短路径长度,通过不断加入中间点的方式更新最短路径。同时在path数组中存储i到j所经过的中间节点k,用于最后递归调用输出路径结果。
贪心算法适用的问题
贪心策略适用的前提是:局部最优策略能导致产生全局最优解。也就是当算法终止的时候,局部最优等于全局最优。

11.骑士周游回溯算法

主要思想:深度优先遍历+回溯+贪心。从初始位置startPoint开始,获取下一步能到达的所有位置,将它们添加到集合ArrayList< Point >中,根据它们下一步所能到达的位置的个数k对ArrayList< Point >中所有位置进行非递减排序,优先对k较小的位置进行遍历,若此路不通,则回溯。

我的学习论坛

HandsomeForum:用Java编写的学习论坛,打造我们自己的圈子!(http://huangjunjie.vip:66)
文章链接:http://huangjunjie.vip:66/blog/read/u3zdadmc7ectoamsqm

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_59262008/article/details/125657276

智能推荐

springboot 异步监听事件_springboot异步 侦听响应_Beautiful菜园子的博客-程序员秘密

springboot框架提供了监听的方法 具体实现看下面代码,首先创建一个被监听的类, 继承ApplicationEvent 抽象类, 要实现一个有参的构造方法public class TestEvent extends ApplicationEvent { public TestEvent(Object source) { super(source); ...

初入行Web前端开发新手必读_zxleezx的博客-程序员秘密

公司招了几个刚毕业的学生,作为重构的新手让我来带。首先感谢感谢党、感谢国家、感谢公司给了我这样的一个机会,对我工作的肯定和认可,让我带这样的一个重构团队,同时我也明白任务的艰巨,但我一定会将工作做好,不负公司对我的期望。(哈哈,好像从小到大,老师都是教育我们要这样先说的。)在网站的发展史上,初期的网站建设根本不需要网页重构这个职位,WEB1.0时代的网页,只需要程序员,一堆堆的表格

树莓派3B通过arm-trust-firmware启动内核小系统_bl31: cortex_a53: cpu workaround missing!_EmbeddedGuru的博客-程序员秘密

1、下载arm官方的arm-trust-firmware源码git clone https://github.com/ARM-software/arm-trusted-firmware.git2、编译生成rapi3b的atf镜像CROSS_COMPILE=aarch64-linux-gnu- make PLAT=rpi3 \PRELOADED_BL33_BASE...

NAT技术之NAT server_thlzjfefe的博客-程序员秘密

带来的问题是什么呢?先聊聊DMZ,不知道大家在家用路由器以及软路由或者是光猫里面有没有见到过有一个DMZ的配置选项,防火墙安全区域里面也有一个DMZ,博主在介绍区域的时候讲解DMZ的作用提到过,当有对外网提供服务的服务器主机的时候,可以把它放到DMZ区域,这样对内网的安全多了一层保护,那么这些家用路由器、光猫、软路由上面的DMZ实际指的是DMZ主机,当你在配置后它的作用就是跟华为防火墙的一对一映射效果是一样的,所以当客户跟你说要实现DMZ主机功能或者是DMZ映射的时候,那就是说的一对一的转换。

unity插件easytouch5中的JoyStick注意事项_鱼子酱f的博客-程序员秘密

网上教程大多是4的写法,在5中EasyJoystick.On_JoystickMove根本就没有!绑定不了事件!easytouch5中如果手动拖是更加的简单了,就像UGUI但是如果想要动态加载,以前的方法就没有用了现在的使用方法 public ETCJoystick joyStick;//改名字了 private void Start() { chMoto...

UE4 虚幻引擎,LOD设置_ue4 lod_虎冯河的博客-程序员秘密

1、导入LOD层级要点:需要在建模软件中设置好LOD模型打开网格体编辑器,找到LOD Settings 面板,LOD Import 选择导入LOD层级。选择要导入的LOD层级(FBX)2、设置Lod显示的距离。找到LOD 的层级——&gt;Screen Size屏幕尺寸(也就是这个Lod显示的距离,0.5表示屏幕视图的一半,以此类推。0.2表示百分之二十。)...

随便推点

JAVA之第6章 类再生_wybm的博客-程序员秘密

第6章 类再生“Java引人注目的一项特性是代码的重复使用或者再生。但最具革命意义的是,除代码的复制和修改以外,我们还能做多得多的其他事情。”在象C那样的程序化语言里,代码的重复使用早已可行,但效果不是特别显著。与Java的其他地方一样,这个方案解决的也是与类有关的问题。我们通过创建新类来重复使用代码,但却用不着重新创建,可以直接使用别人已建好并调试好的现成类。但这样做必须保证不会干扰原有的代码。

html+css手风琴效果_html手风琴效果_wikn116的博客-程序员秘密

纯html+css代码,适合新手学习&lt;!DOCTYPE html&gt;&lt;html lang="en"&gt;&lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;xy丶星宇&lt;/title&gt; &lt;style&gt; * { padding: 0;...

彻底搞懂Redis持久化之AOF原理_【原】编程界的小学生的博客-程序员秘密

编程界的小学生一、什么是AOF二、优缺点1、优点2、缺点三、AOF原理1、基础原理2、额外扩展四、REWRITE1、为什么要rewrite?2、4.0版本之前的rewrite3、4.0版本以及之后的rewrite4、rewrite触发条件1、手动触发2、自动触发3、触发满足条件5、rewrite原理五、RDB-AOF混合持久化1、优点2、缺点3、原理4、数据恢复六、总结七、个人公众号为什么需要...

${}和`${}`的用法_叶孤崖的博客-程序员秘密

${}假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt我们可以用 ${ } 分别替换获得不同的值:${file#/}:拿掉第一条 / 及其左边的字串:dir1/dir2/dir3/my.file.txt${file##/}:拿掉最后一条 / 及其左边的字串:my.file.txt${file#.}:拿掉第一个 . 及其左边的字串:file.txt${file##.}:拿掉最后一个 . 及其左边的字串:txt${file%/}:拿掉最后条 / 及其右边

Linux安装已编译好的FFmpeg,基于centos7_weixin_30871701的博客-程序员秘密

1、访问https://johnvansickle.com/ffmpeg/2、下载地址:https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz3、下载 wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd6...

NGINX-TOMCAT集群环境部署_weixin_34417814的博客-程序员秘密

NGINX-TOMCAT集群环境部署—————————————————–Shanks目录NGINX-TOMCAT集群环境部署… 11.1 OS:linux RedHat5u5. 11.2 Soft:… 11.2.1 soft说明… 21.3安装部署步骤… 21.3.1部署前准备… 21.3.2 Jdk. 21.3.3 Nginx. 31.3.4 Tomcat 81.4启动服务...

推荐文章

热门文章

相关标签