【原创首发】跟着小灰学Python-基础算法篇

166 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

声明:版权归本人所有,违者必究。 
转载请注明来源 https://juejin.cn/post/7111528280137662500

1.1. 算法概述

1.1.1. 算法的基本概念

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内正确的获得所要求的输出。

在计算机软件专业中,算法分析与设计是一门非常重要的课程,很多问题的解决,程序的编写都要依赖它。著名计算机科学家沃思提出了一个公式:程序=算法+数据,也常有人称算法是程序的灵魂,由此可见算在在软件开发中的重要性。学好算法,有利于提高个人逻辑思维能力及问题分析思考能力,为我们后续软件开发生涯打下坚定的基础。

1.1.2. 算法的特性

一个算法应该具有如下的特征:

输入(Input):

从外界获得信息。算法的过程可以无数据输入,也可以有多种类型的多个数据输入,需根据具体的问题加以分析。

输出(Output):

算法得到的结果就是算法的输出(不一定就是打印输出)。算法的目的是为解决一个具体问题,一旦问题得以解决,就说明采取的算法是正确的,而结果的输出正是验证这一目的的最好方式。

有穷性(Finiteness):

在有限的操作步骤内完成。有穷性是算法的重要特性,任何一个问题的解决不论其采取什么样的算法,其终归是要把问题解决好。如果一种算法的执行时间是无限的,或在期望的时间内没有完成,那么这种算法就是无用和徒劳的,我们不能称其为算法。

确定性(Definiteness):

每个步骤确定,步骤的结果确定。算法中的每一个步骤其目的应该是明确的,对问题的解决是有贡献的。如果采取了一系列步骤而问题没有得到彻底的解决,也就达不到目的,则该步骤是无意义的。

可行性(Effectiveness):

每个步骤有效执行,得到确定的结果。每一个具体步骤在通过计算机实现时应能够使计算机完成,如果这一步骤在计算机上无法实现,也就达不到预期的目的,那么这一步骤是不完善的和不正确的,是不可行的。

1.1.3. 算法的思想

1、分而治之:有点类似“大事化小、小事化了”的思想,经典的归并排序和快速排序都用到这个思想。

2、动态规划:有点类似数学的归纳总结法,找出状态转移方程,然后逐步求解。

3、贪心算法:有时只顾局部利益,最终也会有好的全局收益。

4、搜索算法:在有限的解空间找出满足条件的解,深度和广度通常比较费时间,二分搜索每次可以将问题规模缩小一半,所以比较高效。

5、回溯:不断地去试错,同时注意回头是岸,走不通就换条路,最终也能找到解决问题的方法或者知道问题误解。

1.1.4. 算法的评价

算法在程序设计和开发过程中占据着重要的地位,一个算法的质量优劣将影响到算法乃至程序的执行效率。因此,设计一个性能高、占用存储小的算法,是我们追求的目标。可以从时间复杂度和空间复杂度两个方面来分析算法的性能、占用存储大小:

时间复杂度

算法的时间复杂度是指算法需要消耗的时间资源。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做T(n)=Ο(f(n));因此,问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。

空间复杂度

算法的空间复杂度是指算法需要消耗的空间资源。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。