本文共 1420 字,大约阅读时间需要 4 分钟。
① 算法:为逐步解决问题而设计的一系列通用指令,即解决问题的方法;
② 程序:表示算法的编程语言集,程序由算法和数据结构组成; ③ 算法分析:基于所使用的计算资源对算法进行分析比较,计算资源通常包括执行速度和占用内存空间大小,对应"时间复杂度"和"空间复杂度"。精确表示算法的效率是困难的,只能近似地进行描述。分析算法的优劣,可以从时间复杂度和空间复杂度入手,由于不同计算机的算力不同,直接将计算机运行时间和内存占用情况作为指标进行对比是不具备比较的意义。为摆脱硬件设施的影响,通常用大O表示法对算法性能进行描述。
数量级(order of magnitude)常被称作大O表示法,记为O(f(x))。大O符号是由德国数论学家保罗·巴赫曼(Paul Bachmann)在其1892年的著作《解析数论》(Analytische Zahlentheorie)首先引入的。大O表示法是用函数来描述一个函数运算量数量级的渐近上界,即用函数表征运行时间如何随数据量增长而变化。
将每一步计算定义为基本计算单元,算法执行时间就与算法执行步数成正比。
例1:求和
sum = 0for i in range(n): sum += i该算法中,赋值语句执行次数是1,求和次数为n,那么计算步数 T ( n ) = 1 + n T(n)=1+n T(n)=1+n,此时, O ( T ( n ) ) = n O(T(n))=n O(T(n))=n。
O只表示出运算的数量级。
例2:求和
sum1 = 0sum2 = 0sum3 = 0for i in range(n): for j in range(n): sum1 += i sum2 += j sum3 = sum3 + i + j该算法中,三个赋值语句执行次数是3,sum1-sum3的求和次数为3 n 2 n^2 n2,那么计算步数 T ( n ) T(n) T(n)=3+3 n 2 n^2 n2,此时, O ( T ( n ) ) O(T(n)) O(T(n))= n 2 n^2 n2(起决定性作用的是 n 2 n^2 n2,因此3可以忽略)。
以上两个例子,简单描述了大O表示法与运算步骤数的关系,大O只体现算法运算的数量级,常见算法数量级如下:
算法的性能不仅仅依赖问题的规模,还受到数据集的影响。
例3:找到列表中目标值的索引
list1 = [0,1,2,3,4,5,6,7,8,9]num = 0for i in range(len(list1)): if list1[i] == num: print(i) break当num的值刚好为0,一次查找就能够找到,这就是最好情况;而当num的值为9时,需要10次才能找到,这是最差情况;而平均情况介于最好情况和最坏情况之间,这里如果num是等概率随机分布的,那么平均需要5.5次才能找到。