算法的基本知识

mac2026-04-21  8

目录

一、什么是算法

 二、什么是指令

三、什么是程序 

 四、算法与程序的区别

五、时间复杂度 - T(n)

      (指执行当前算法所消耗的时间)

六、空间复杂度 - S(n)

      (指执行当前算法需要占用多少内存空间)


 

一、什么是算法

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

简而言之:算法就是计算或者解决问题的步骤。

二、什么是指令

指令(instruction)是指计算机从事某一特殊运算的代码 。它由一串二进制数码组成,一条指令通常由两个部分组成:操作码 +地址码。例如:数据传送指令、算术运算指令、位运算指令、程序流程控制指令、串操作指令、处理器控制指令 等等。

操作码: 指明该指令要完成的操作的类型或性质,如取数、做加法或输出数据等。

地址码:指明操作对象的内容或所在的存储单元地址。

三、什么是程序 

 程序(program)是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合。为实现预期目的而进行操作的一系列语句和指令。

简而言之:程序就是计算机的编码指令的次序。

四、算法与程序的区别

 算法和程序有些相似,区别在于程序是以计算机能够理解的编程语言编写而成的,可以在计算机上运行,而算法是以人类能够理解的方式描述的,用于编写程序之前。不过,在这个过程中到哪里为止是算法、从哪里开始是程序,并没有明确的界限。

五、时间复杂度 - T(n)

      (指执行当前算法所消耗的时间)

了解输入数据的量和运行时间之间的关系

使用相同的算法,输入数据的量不同,运行时间也会不同。比如,对 10 个数字排序和对 1 000 000 个数字排序,大家很容易就想到后者的运行时间更长。那么,实际上运行时间会长多少呢?后者是前者的 100 倍,还是 1 000 000 倍?就像这样,我们不光要理解不同算法在运行时间上的区别,还要了解根据输入数据量的大小,算法的运行时间具体会产生多大的变化。

 如何求得运行时间

那么,如何测算不同输入所导致的运行时间的变化程度呢?最为现实的方法就是在计算机上运行一下程序,测试其实际花费的时间。但是,就算使用同样的算法,花费的时间也会根据所用计算机的不同而产生偏差,十分不便。

所以在这里,我们使用“步数”来描述运行时间。“1 步”就是计算的基本单位。通过测试“计算从开始到结束总共执行了多少步”来求得算法的运行时间。

作为示例,现在我们试着从理论层面求出选择排序的运行时间。选择排序的步骤如下。

   

如果数列中有 n 个数字,那么①中 “寻找最小值” 的步骤只需确认  n 个数字即可。这里,将 “确认 1 个数字的大小” 作为操作的基本单位,需要的时间设为 Tc,那么步骤①的运行时间就是 n×Tc 。

接下来,把 “对两个数字进行交换” 也作为操作的基本单位,需要的时间设为 Ts。那么,①和②总共重复 n 次,每经过 “1 轮”,需要查找的数字就减少 1 个,因此总的运行时间如下。

   

虽说只剩最后 1 个数字的时候就不需要确认了,但是方便起见还是把对它的确认和交换时间计算在内比较好。

运行时间的表示方法

虽说我们已经求得了运行时间,但其实这个结果还可以简化。Tc Ts 都是基本单位,与输入无关。会根据输入变化而变化的只有数列的长度 n,所以接下来考虑 n 变大的情况。n 越大, 上式中的 n2 也就越大,其他部分就相对变小了。也就是说,对式子影响最大的是 n2。所以,我们删掉其他部分,将结果表示成下式右边的形式。

   

通过这种表示方法,我们就能大致了解到排序算法的运行时间与输入数据量 n 的平方成正比。同样地,假设某个算法的运行时间如下。

   

那么,这个结果就可以用 O(n3) 来表示。如果运行时间为 

   

这个结果就可以用 O(nlogn) 来表示。

O 这个符号的意思是 “忽略重要项以外的内容”,读音同 Order。O(n2) 的含义就是 “算法的运行时间最长也就是 n2 的常数倍”,准确的定义请参考相关专业书籍。重点在于,通过这种表示方法,我们可以直观地了解算法的时间复杂度。

比如,当我们知道选择排序的时间复杂度为 O(n2)、快速排序的时间复杂度为 O(nlogn) 时,很快就能判断出快速排序的运算更为高速。二者的运行时间根据输入 n 产生的变化程度也一目了然。

六、空间复杂度 - S(n)

      (指执行当前算法需要占用多少内存空间)

我们要知道 时间复杂度不是用来计算程序具体耗时的,那么我也应该明白,空间复杂度也不是用来计算程序实际占用的空间的。

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,我们用 S(n) 来定义。 

 如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)。

例1:

   

代码中的 i、j、m 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 S(n) = O(1)

例2:

   

这段代码中,第一行new了一个数组出来,这个数据占用的大小为n,这段代码的2-6行,虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即 S(n) = O(n)

最新回复(0)