五大算法的总结及浅谈对算法的感受

这一篇是算法的总结,但不是说算法就学会了。就没有问题了。毕竟算法设计与分析一直是当今研究的问题。
学了算法更应该在以后编程去运用,去做更好的优化
最后,算法真的很有用!

本篇是对我们前面介绍的分治法、动态规划算法、贪心算法、回溯法、分支限界法的总结,以及我的一些在学完算法的想法。

1、分治算法的总结

分治算法的适用条件:
1.该问题的规模缩小到一定的程度就可以容易地解决;
2.该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
3.利用该问题分解出的子问题的解可以合并为该问题的解;
4.该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。

设计步骤:
将原问题划分为与原问题同类型的子问题,注意子问题划分尽量均衡。最后要将子问题的解进行归结,最终形成原问题的解

算法分析:
求解递推方程

改进途径:
在T(n)=a(n/b)+f(n)中
1、减少子问题数——降低a
2、增加预处理——降低f(n)

分治法例子:
二分归并排序、快速排序、幂乘算法、矩阵算法、平面点对、汉诺塔等

2、动态规划算法的总结

动态规划算法适用条件:
1、最优子结构性质(一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。)
2、无后效性(将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。)
3、子问题重叠

动态规划算法的设计步骤:
确定子问题边界,确定关于目标函数的递推方程及初值;计算和追踪解采取自底向上的策略;用备忘录存储中间计算的结果;还要考虑是否用标记函数来追踪解

动态规划算法的复杂度分析:可以通过分析备忘录、也可以通过分析递推方程

动态规划算法例子:
矩阵链相乘、投资问题、背包问题、最大字段和问题、最长公共子序列问题、图像压缩问题、多边形游戏

3、贪心算法的总结

贪心算法的适用条件:
1、需要贪心选择策略
2、最优子结构性质

贪心算法的设计步骤:
先要定出局部优化的贪心策略,然后证明这个贪心策略。证明方法有:数学归纳法、交换论证

贪心算法的复杂度分析比较简单,通常是一轮处理(一般是一层for循环就解决了),一般是O(n)+O(nlogn)(排序消耗)的时间

贪心算法例子:
活动选择问题、最优装载问题、最小延迟调度问题、最优前缀码、最小生成树、单源最短路径问题

4、回溯法的总结

回溯法的适用条件:满足多米诺性质(必要条件),是一个多部判断求解,适用于搜索和优化问题

回溯法的设计步骤:确定解向量、确定搜索树结构、确定搜索顺序、确定分支搜索的约束条件与代价函数,确定存储路径

回溯法的复杂度分析往往和蛮力算法没有太大的差别,但是它可以做到更好的剪枝效果,比蛮力算法更能快速搜索

回溯法例子:
n后问题、0-1背包问题、货郎问题、最优装载问题、圆排列问题、最大团问题

5、分支限界法的总结

分支限界算法的适用条件:以广度优先或以最小耗费(最大效益)优先的方式搜索问题

分支限界算法的两种方法:
(1)队列式(FIFO)分支限界法
按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。
(2)优先队列式分支限界法
按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。

分支限界算法的搜索策略:
在当前节点(扩展节点)处,先生成其所有的子节点(分支),然后再从当前的活节点(当前节点的子节点)表中选择下一个扩展节点。为了有效地选择下一个扩展节点,加速搜索的进程,在每一个活节点处,计算一个函数值(限界),并根据函数值,从当前活节点表中选择一个最有利的节点作为扩展节点,使搜索朝着解空间上有最优解的分支推进,以便尽快地找出一个最优解。分支限界法解决了大量离散最优化的问题。

分支限界算法的设计步骤:
确定队列的入队和出队以及在什么时候入队和出队、确定活结点的属性、确定最优解存储、确定约束条件及代价函数

分支限界法例子:
布线问题、0-1背包问题、最大团问题、货郎问题、最优装载问题、批作业调度问题

以上就是对五大算法的总结

浅谈一下对算法的感受

首先,我学算法从2月初到现在,来来回回学了三遍(当然每天我不只是学算法),等到我上课学习,这就是第4遍。对于算法不能说有多太深奥的理解,反正也是小有收获的。

算法并不是我写了这么多博客,就学会了设计、学会了分析。

对于算法到程序实现,需要经过算法设计、算法实现、算法分析等阶段。然而对于一个问题,我没有把握说怎么去设计算法。这个得需要多练习。

现在程序员,说实在的不怎么注重算法的学习了。我学算法包括说我写博客,完全是为了我期末考试和以后的面试。实际上不写博客对于期末考试也没什么,看看书,做做题。就过去了,没啥大问题。但是我起初写博客的想法是为了面试。

我想从事游戏开发,我从家我就翻这个招聘信息。大部分要求算法+数据结构。而且我觉得对于一个合格的程序员,算法+数据结构是一个内功心法,是必须要了解的东西。而我就在想既然要了解,那就写下来。以后问不问算法我不知道,但是可以去在面试的时候有点东西。

但是你说游戏开发在乎这些算法吗,这些算法都是基础的东西,谁去问啊?高级的游戏AI算法有很多,而且都很实用。但就因为是基础,我才要去了解下啊。不能一步登天啊。

我现在是大三了,对于游戏开发道路,在技术的学习上有很长的路要走。计算机图形学+openGL图像化编程+unity3D引擎的学习。何况我还想接触下虚幻引擎4,我打算明年学习C++和STL以及OOP原理等,这个等还有很多技术。我就不从这里说了。反正学不完。但是我在想大三。。。还来得及吗。明年我就要毕业了,我自己不是数字媒体专业的学生,我在招聘我去说什么。真的就是纯自学啊。而且我只是想研究技术,对于学术一点都不想看,也就是说我并不是想考研,因为计算机图形学这个专业,上肯定上名牌大学,普通的上去没一点儿用。而且我知道的计算机图形学基本都是一些特别优秀的学校啊。我自知我争不过,那我只能用我最喜欢的技术和他们进行抗衡。

我不知道能不能成功,我现在只能一点一点拼命学技术,去研究技术,多写博客,多去记下我学过的东西。然后多去动手实践。我只能用这样的微小的力量去拼了。已经没有时间了快,我只能给自己压力,让自己学会。

游戏开发道阻且长,而且真的是不好走。我只能对我自己说一声:试试吧,不试怎么知道不行,而且不去尝试,我一定会后悔的。加油吧!

本来是说算法的,却说了游戏。。。算法对于程序员是很重要的,因为程序=算法+数据结构。所以,如果大学期间能去做算法大赛的,最好报一次这样的比赛,而且你写的是程序,那么算法和数据结构都会用到的。

算法在游戏开发真的是很重要,游戏优化无非就两方面:代码优化、美术优化。
数据结构也很重要,为什么常用B+树存储信息啊,不就是保存数据稳定有序。
而且还有对于游戏开发,设计模式也是一个重中之重的东西。又是一个提高优化、提高性能的宝。所以,多去了解这些东西,也许就会豁然开朗也说不定。

最后,我希望我写的博客能够帮到你,能引导你写代码。如果有某些不会可以在底下的评论或则私信我。

就说这么多吧。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值