算法入门

定义

算法(Algorithm)是指用于解题问题的具体的方法。在计算机领域,算法是指一系列明确的操作的组合以根据指定的输入计算出所需要的结果。广义来说,用于解决问题的一系列的方法或步骤都可以称之为算法。比如制作一个汉堡,从准备材料到加工的整个过程,就是一个算法。

特性

关于算法特性的描述,一般采纳的都是高德纳(Donald E. Knuth)的著作《计算机程序设计艺术》的 1.1 算法 中,对算法特征进行了以下描述。算法主要有五大特性:

  • 有限性:一个算法必需在有限的步骤内完成。
  • 确定性:算法中对各步骤的内容的描述必须精确无歧义。
  • 输 入:一个算法必须有零个或多个输入。
  • 输 出:一个算法应有一个或以上输出,输出量是算法计算的结果。
  • 可行性:即最终是可以实现并按要求解决问题的。

以KFC制作汉堡为例,制作汉堡的算法由多个制作步骤组成,每个步骤都有相应的参数(时间、数量、配比等),对应以上五点分别表示以下内容:

  • 有限性:汉堡必需在有限步骤内完成。
  • 确定性:每个步骤都有明确无歧义的说明,从而保证无论是哪个操作员工,都应该能够制作出相同的汉堡。
  • 输 入:汉堡的所有原料,面包、馅、肉、配料等。
  • 输 出:包装好可食用的汉堡。
  • 可行性:根据汉堡的制作算法,一定能够以可接受的时间,可接受的成本,制作出来大家认可的健康食用的汉堡。

算法好坏的判定

判定算法的好坏有两个要求:

  • 时间复杂度:指算法所需要消耗的时间资源,不同的算法达到相同的结果会有巨大的差异,这个后面我们会看到。
  • 空间复杂度:指算法所需要消耗的空间资源。在计算机中,主要是指内存资源。

仍然以做汉堡为例,

  • 时间复杂度:指制作汉堡所需要的时间,在KFC中,所有的材料都是半成品的,所以可以快速的制作完成。
  • 空间复杂度:指制作汉堡所需要的场地和设备,KFC采用半成品的方式,只需要按顺序简单的原料组合和加热,就可以完成,不需要太多的场地。

以上的定义和示例只是让大家快速理解这两个概念,现在我们看几个计算机中真实的示例,以理解以上的两个概念。

时间复杂度

先看一个问题:给定数列 D = [ d 1 , d 2 , . . . , d n ] D = [d_1, d_2, ..., d_n] D=[d1,d2,...,dn],判断是否存在数据 v v v,如果存在返回在数列中的位置,不存在返回-1。

【未排序】
在求解的时候,如果数据是未排序的,我们只能一个一个对比,从 d 1 d_1 d1 一直对比到 d n d_n dn。我们可以很容易发现:

  • 最好的情况是 d 1 d_1 d1 就与 v v v 相同,则只需要1次查找;
  • 最坏的情况是最后一个数 d n d_n dn 是,或者压根就不存在,则需要查找 n n n 次。

由于所有的数字都是平均分布,所以平均查询次数 t = 1 + n 2 = 1 2 n + 1 2 t = \frac{1 + n}{2} = \frac{1}{2}n + \frac{1}{2} t=21+n=21n+21次。这个表达式属于一次多项式 p = a n + b p = an + b p=an+b,其中 a a a b b b 的值都是 1 2 \frac{1}{2} 21。由于计算次数主要受 n n n 的影响,所以为了更简单地表述算法的时间复杂度,我们将常量省略,并用大写的O表示,即此算法的复杂度为 O ( 1 2 n + 1 2 ) = O ( n ) O( \frac{1}{2}n + \frac{1}{2}) = O(n) O(21n+21)=O(n)

【已排序】
如果是已经排序(假设自左向右递增)的话,我们利用折半查询,从而大大加快查询过程。具体算法为:

  1. 我们从中间开始对比,如果中间的数比 v v v 小,则我们只需要在 D D D 的左半边查找,反之在 D D D 的右半边查找。
  2. 重复这个过程直到找到 v v v 或 折半后的宽度长度为1.

对比两种算法,如果对于已经排序好的数列长度为10亿的数列,采用第一种算法,则最坏需要进行约10亿次查找;而采用折半法的最坏查询次数为 O ( l o g 2 n ) O(log_2n) O(log2n),比如 长度为约为10亿时,只需要30次( 2 30 = 1 , 073 , 741 , 824 2^{30}=1,073,741,824 230=1,073,741,824)折半查询的即可完成查找。

所以,通过以上的示例可以看出,对于相同的输入和计算要求,由于算法不同,时间复杂度会有很大的不同( O ( n ) O(n) O(n) VS O ( l o g 2 n ) O(log_2n) O(log2n)),从面导致时间消耗上的巨大差异。

空间复杂度

空间复杂度也是一样。以图片保存为例,一张没有压缩的1920x1080的图片,共有 2,073,600个点,每个点占4个字节(ARGB表示),则共需要占用8,294,400个字节,约占 7.9MB的磁盘空间。而采用了压缩算法以后,实际容量往往只有几百KB。

时空转换

爱因斯坦的相对论告诉我们,在我们生活的这个世界中,时间和空间是可以转换的。同样的,在算法中,时间和空间也是可以相互转换的,即我们可以用时间换空间或者用空间换时间。具体是如何工作的,请看以下的示例。

  • 时间换空间
    如影片的压缩。大家都听过,原始的影片的大小非常大,通过压缩算法可以大在减小影片文件的大小,但是压缩和解压都是需要时间的。影片在播放的时候,是在读取后,先进行解压才能进行播放,只是解压的时间非常短,让我们感觉不到,所以我们感觉是实时在播放。实际上,这就是一个用时间换空间的很好的示例,通过压缩和解压的实时计算,减少了磁盘空间的占用。
  • 空间换时间
    在天文学计算的时候,经常会用三角函数,进行天体运行的计算。但是由于在计算中,sin(x) 会利用泰勒公式展开计算(当然,实际上有一些优化以加快计算速度),每次计算然需要几个微秒的时间。但是当计算量很大的时候,仍然会占用非常可观的时间。为了解决这个问题,我们只需根据精度,建立一个数列,比如以0.000000001度为精度,可以生成 360,000,000,000个的数据。虽然占用了非常大的内容空间,但是由于数列是顺序排列的,查询可以在几个纳秒内完成,运算效率可以提高上千倍,极大地加速了运算效率。

总结

本文对算法的基本概念做了一个定性的介绍。在后面的内容中, 将进行更加深入的定性分析。

参考文献

[1] 数据结构, https://www.cnblogs.com/jingcaijueyan/p/9456072.html
[2] 数据结构知识整理, https://blog.csdn.net/m0_37568814/article/details/81288756

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值