影响算法效率的情况:
1.算法采用的策略,方案
2.编译产生的代码质量
3.问题的输入规模
4.机器执行指令的速度
所以,抛开计算机硬件,软件,有关因素,一个程序的运行时间依赖于算法的好坏和问题的输入规模(输入规模是指,输入量)
算法的效率高一般是指算法的执行时间,其判断算法的效率方法有:(研究算法的复杂度,侧重是研究算法随着输入规模扩大,增长量的一个抽象,分析一个算法运行时间,重要的是把基本操作的数量和输入模式关联起来)
1)事后统计法这种方法主要通过设计好的测试程序和数据,利用计算器计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低(缺点,必须依据算法一对一编写测试程序,花销大,且如果算法效率低,则赔了夫人又折兵)
函数渐进增长:
函数渐进增长:给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么,我们说f(n)的增长渐进快于g(n)
若是比较2n+3和3n+1的优势,则n<2时3n+1效率更好,n>2时2n+3更好,常数3和1影响不大情况下,一般可以忽略
同理,若是4n+8和2n^2+1,,与最高次项相乘的常数也不重要
同理,2n2+3n+1和2n3+1,随着n的增长,3n+1可以忽略
所以判断一个算法的效率,我们更应该去关注主项的阶数
算法的时间复杂度的定义
算法的时间复杂度的定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级,算法的时间复杂度也就是算法的时间量度,记作T(n)=O(f(n)),他表示,随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度,其中f(n)是问题规模n的某个函数。
O()称作大O记法,一般来说,随着输入规模n的增大,T(n)增长最慢的算法为最优算法
其中:
用常数1取代运行时间中的所以加法常数
在修改后的运行次数的函数中,只保留最高项
如果最高项存在且不是1,那么去除与这个最高项相乘的常数
得到的就是算法的时间复杂度
常用的事件复杂度所耗费时间大小依次是:
O(1)<O(log n)<O(n)<O(n* log n)<O(n^2)<O(n ^3)<O(2 ^n)<O(n!)<O(n ^n)
最坏运行时间和平均运行时间
平均运行时间是期望的运行时间
最坏运行时间是一种保证。通常除非特定情况,我们提到的运行时间都是最坏情况的运行时间。
算法空间复杂度
一般可以通过空间换时间或者时间换空间的方法满足自己的需求
算法的空间复杂度通过计算算法所需的储存空间实现,算法的空间复杂度的公式记作S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占储存空间的函数
通常我们用空间复杂度指空间需求,用时间复杂度来指运行时间的需求,直接求复杂度,就是指时间复杂度。