数据结构-算法

一、什么是算法?

算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个步骤。

二、数据结构算法的关系

 数据结构与算法有着千丝万缕的关系,如果单单学习数据结构,会不知道有什么用处,但如果我们再把相应的

算法一起来讲,你就会发现,甚至开始感慨:计算机界的前辈们的确是一些很牛很牛的人。

三、两种算法的比较

计算1+2+3+...+100的和


高斯算法



四、算法的定义

算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

五、算法的特征

    1.输入输出    零个或多个输入,有一个或多个输出

    2.有穷性    算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每个步骤在可接受时间内完成    

    3.确定性    算法的每一步骤都具有确定的含义,不会出现二义性。

    4.可行性    算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。

六、算法设计的要求

    1.正确性 算法至少应该具有输入、输出和加工处理无歧义性,能正确反映问题的需求,能够得到问题的正确答案。

        a)算法程序没有语法错误

        b)算法程序对于合法的输入数据能够产生满足要求的输出结果

        c)算法程序对于非法的输入数据能够得出满足规格说明的结果

        d)算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果

    2.可读性

        算法设计的另一个目的是为了便于阅读、理解和交流

    3.健壮性

        当输入数据不合法时,算法也能够做出相关处理,而不是产生异常或莫名奇妙的结果。

    4.时间效率高和存储量低

        时间效率指的是算法的执行时间,对于同意问题,如果有多种算法能够解决,执行时间短的算法效率高,执行时间长的

        效率低,存储量需求指的是算法在执行过程中需要的最大存储空间,主要指算法程序运行时所占用的内存或外部硬盘空间

七、算法效率的度量方法

    1.事后统计方法

        这种方法主要是通过设计好的测试程序和数据,利用计算计时器对不同算法编制的程序的运行时间比较,从而确定算法

        效率的高低、

        缺点:

        必须依据算法事先编制好程序,这个通常需要花费大量的时间和精力。

        时间比较依赖计算机硬件和软件等环境因素、

        算法的测试数据设计困难,并且程序运行时间往往和测试数据的规模有很大关系

    2.事前分析估算方法

        在计算机程序编制前,依据统计方法对算法进行估算

        一个高级程序语言编写的程序在计算机上消耗时间的取决于下列因素:

        1.算法采用的策略、方法。

        2.便宜产生的代码质量

        3.问题的输入规模

        4.机器执行指令的速度

        一个程序的运行时间,依赖于算法的好坏和问题的输入规模,所谓问题的规模是指输入量的多少。

        我们来看一下1+2+3+...+100的算法

        第一种


第二种


    显然,第一种算法,执行了1+(n+1)+n+1次=2n+3次;而第二种算法,是1+1+1=3次,事实上两个算法的第一条

    和最后一条是一样的,所以我们关注的代码其实是中间的那部分,我们把循环看作一个整体,忽略头尾循环的判断开销

    那么这两个算法其实是n次和1次的差距,算法的好坏显而易见。

我们在看延伸的例子

这个例子,i从1到100,每次都要让j循环100次,而当中的x++和sum=sum+x其实就是1+2+3+...+10000,也就是

100的2次方次,所以这个算法当中,循环部分的代码整体需要执行n的2次方次,显然这个算法的执行次数对于同样输入

规模n=100,要多余前面两种算法,这个算法的执行时间随着n的增长也将远远多于前面两个。

    此时你会看到,测定运算时间最可靠的方法就是计算运行时间有消耗的基本操作的执行次数,运行时间与这个计数成正比

    可以从问题描述中得到启示,同样问题的输入规模是n,求和算算你发的第一种,求1+2+...+n需要一段代码运行n次,那么

     这个问题的输入规模使得操作数量是f(n)=n,显然运行100次的同一段代码过模式运算10次的10倍,而第二种无论n为多少,

    运行次数都是1,即f(n)=1,第三种,运算100次是运算10次的100倍,因为他是f(n)=n的2次方。


八、函数的渐进增长

    2n+3和3n+1

    2n+3解释为先有一个n次循环,执行完之后,再有一次n次循环,最后有三次赋值或运算


    函数的渐进增长:给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么我们说f(n)

    的渐进增长渐进快于g(n),我们可以忽略这些加法常数

4n+8和2n的2次方+1


与最高次项相乘的常数并不重要

2n的2次方+3n+1和2n的3次方+3n+1


最高次项的指数大的,函数随着n的增长,结果也会变得增长特别快

2n的2次方和3n+1和2n的2次方+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)增长的最慢的算法为

    最优算法。

    显然之前的三个求和例子的时间复杂度分别为O(n) 线性阶 ,O(1) 常数阶,O(n2) 平方阶。

    1.推导大O阶方法

       1234567

猜你喜欢

转载自blog.csdn.net/andy2019/article/details/80038538