标签:hellip 阅读 单线程 忽略 微信公众号 二义性 自身 动态 缺陷
【算法之美】数据结构+算法=程序。
数据结构只是静态的描述了数据元素之间的关系。高效的程序需要在数据结构的基础上设计和选择算法。
高效的程序=恰当的数据结构+合适的算法
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
【时间复杂度】同一个问题可以用不同算法来解决,而一个算法的好坏将影响到程序的执行效率。时间复杂度是一个函数,它定性描述了该算法的运行时间。复杂度越低,程序越高效。
【空间复杂度】(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。占用空间越小,复杂度越低。
时间复杂度常用大O符号表述,即大O表示法。
算法效率严重依赖于操作(Operation)数量,在判断时首先关注操作数量的最高次项,操作数量的估算可以作为时间复杂度的估算。如下的例子:
随着n的不断增大,时间复杂度不断增大,算法花费时间越多。
在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度。
算法的空间复杂度通过计算算法的存储空间实现。
其中,n为问题规模,f(n)为在问题规模为n时所占用存储空间的函数。
递推是序列计算机中的一种常用算法。它是按照一定的规律来计算序列中的每个项,通常是通过计算机前面的一些项来得出序列中的指定项的值。其思想是把一个复杂的庞大的计算过程转化为简单过程的多次重复,该算法利用了计算机速度快和不知疲倦的机器特点。
程序调用自身的编程技巧称为递归(recursion)。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。递归就是在过程或函数里调用自身; 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
穷举法,或称为暴力破解法,其基本思路是:对于要解决的问题,列举出它的所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的解。它也常用于对于密码的破译,即将密码进行逐个推算直到找出真正的密码为止。
贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。
用贪心法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,它省去了为找最优解要穷尽所有可能而必须耗费的大量时间,它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题, 通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。
分治法是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
动态规划是一种在数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。
迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。
分支定界法的基本思想是对有约束条件的最优化问题的所有可行解(数目有限)空间进行搜索。
回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
参考资料:
我的微信公众号:架构真经(关注领取免费资源)
原程序员的算法课(1)-算法概述2019年08月18日 17:58:49 十步杀一人_千里不留行 阅读数 11更多所属专栏: 程序员的算法课编辑
标签:hellip 阅读 单线程 忽略 微信公众号 二义性 自身 动态 缺陷
原文地址:https://www.cnblogs.com/anymk/p/11406424.html