算法基础

        算法,一直觉得是一个很抽象的东西。大三上算法课,从空间复杂度到时间复杂度,从自然语言到伪代码,再到后面的Java代码,老师讲台上讲的激情澎湃,然而,算法丝毫没引起我的兴趣。刚工作第一年,有段时间跟主管做一款图像编辑类的应用,很羡慕他用C++写图像处理算法,于是,买了很多本算法书,基本都是翻完前面几章基础的排序算法和查找算法。工作三年,说句实在的,设计模式还经常用到,什么乱七八糟的或者高大上的算法没用到过。于是,算法这玩意,不到找工作面试,我很少去接触它。今天,来总结一下算法的基础。

一、算法的定义

        算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令(这是百度百科对算法的解释)。

二、算法的特征

        下面,我们以去超市买东西为例子,简单介绍一下算法的特征。去超市买东西的步骤,大致如下:去超市,选择商品,付钱,拿走商品。

1、有穷性

        也就是算法必须在执行有限个指令后终止。举的例子里,买东西的步骤有四步。通过完成这四个有限的步骤,我们就解决了“去超市买东西”这个问题。

 2、确切性

        算法的每一指令都是明确的、无歧义的。举的例子里,四个步骤均是确切的。无歧义的。

3、输入项

        一个算法有0个或多个输入。在举的例子里,钱就是一个输入项,我们要用钱去买东西。

4、输出项

        一个算法有一个或多个输出。在举的例子里,商品就是一个输出项,我们给超市钱,超市给我们商品。

5、可行性

        算法的每个步骤都是可行的,都可以在有限的时间里完成。在举的例子里,例如去超市这个步骤,我们不管是走路、骑车或者开车,都会在一个有限的时间里,到达超市。

 三、算法的复杂度

        算法运行时需要耗费计算机资源的量,可以分为时间复杂度和空间复杂度。算法复杂度依赖于三个方面:待求解问题的规模、算法的输入和算法本身。一般来讲,我们主要看算法的时间复杂度。

1、时间复杂度

        时间复杂度是算法运行耗费的时间。这个时间的衡量,并不是算法的绝对运行时间。一个程序实现了的算法的具体运行时间,不仅仅和算法本身相关,还和很多其他因素密切相关:机器性能、编程语言、编译器、编程技巧等等。

2、空间复杂度

        空间复杂度是算法运行耗费的内存空间大小。一般情况下,我们都会在确定的环境下去衡量不同算法的时间复杂度,不特地考虑算法的空间复杂度。

四、算法常用设计方法

1、穷举法

        对于要解决的问题,列举出所有可能的情况,逐一验证是否能得到问题的解,穷举法常用于密码的破解。

2、贪心策略

        贪心策略设计算法的特点是一步一步的进行,所做出的的每一步选择都是局部意义上的最优解,不考虑整体情况,因此由此产生的全局解不能保证就是最优解。

3、分治策略

        把规模较大的问题分解为若干个规模较小的子问题, 这些子问题相互独立且与原问题同类;依次求出这些子问题的解,然后把这些子问题的解组合起来得到原问题的解。

4、动态规划

        动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解以避免计算重复的子问题,来解决最优化问题的算法策略。动态规划的实质是分治和消除冗余。

5、回溯法

        回溯法的基本做法是搜索。回溯法按深度优先策略搜索问题的解空间树,当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续搜索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。

 

 

你可能感兴趣的:(算法)