《大话数据结构》之算法笔记

1. 算法的特性


    1)输入输出,算法可有有零个或多个输入,但至少有一个或多个输出;

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

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

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

2. 算法设计的要求


    1)正确性,算法的正确性是指算法至少应具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。大致分以下四个层次:

        a. 没有語法错误;

        b. 对于合法的输入数据能够产生满足要求的输了結果;

        c. 对于非法的输入数据能效得出满足规格说明的結果;

        d. 对于精心选择的,甚至刁难的测试数据都有满足要求的输出結果;

    以上4条也可作为测试用例的参考。

    2)可读性,算法设计的另一上的是为了便于阅读、理解和交流。可读性是算法好坏的一个重要标志;

    3)健壮性,当输入数据不合法时,算法能做出相关处理,而不是产生异常或莫名其妙的結果;

    4)时间效率高和存储量低,时间效率高是指算法执行的时间短,存储量低是指算法运行时所占内存或硬盘存储空间量小;

3. 算法效率的度量方法


    1) 事后统计方法,这种方法是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。但这种方法有很大的 缺陷:

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

        ■ 比较依赖计算硬件和软件等环境因素,有时会掩盖算法本身的优劣;

        ■ 测试算法设计困难,这往往还与测试数据的规模有很大关系,效率高的算法在小的测试数据面前得不到体现;

    2) 事前分析估算方法,在计算机程序编制前,依据统计方法对算法进行估算,以下因素将决定算法的优劣:

        ■ 算法采用的策略、方法,这条是算法好坏的根本;

        ■ 编译产生的代码质量,这条是软件因素;

        ■ 问题的输入规模;

        ■ 机器执行指令的速度,这条是硬件因素;

    抛开软、硬件因素,一个程序的运行时间,依赖于算法的好坏和问题输入的规模。


4. 函数的渐近增长

    这里借用数学函数来对算法优劣做比较,给定两个函数f(n) 和 g(n),如果存在一个整数N,使用得对于所有的 n > N,f(n)总是比g (n) 大,那么,我们说 f(n)的增长渐近快于 g(n)。如:

   

    另外,最高次项的指数大的,函数随着n的增长,结果也会变得增长很快。

    结论:判断一个算法的效率时,函数中的常数和其他次要项常常可省略,而更应关注最高阶项的阶数!

         最坏情况与平均情况:

        最坏情况运行时间是一种保证,那就是运行时间不会再坏了。在应用中,这是一种最重要的需求。通常,除非特别指定,提到的运行都是最坏情况的运行时间。

        平均运行时间是所有情况中最有意义的,因为它是期望的运行时间。现实中,平均运行时间很难通过分析得出,一般都是通过运行一定数量的实验数据后估算出来的。

5. 算法的时间复杂度

    在进行算法分析时,语句总的执行次数 T(n) 是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定 T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作: T(n) = O(f(n))。它表示问题规模n的增大,算法执行时间的增长率和 f(n) 增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中 f(n) 是问题规模 n的某个函数。以大写O 来描述算法复杂度的记法称之类大O记法。

    推导大O的阶步骤:

        a. 用常数1取代运行时间中的所有加法常数;

        b. 在修改后的运行次数函数中,只保留最高阶项;

        c. 如果最高阶项存在且不是1,则去除与这个项相乘的常数;

    经过以上3步就能得到大O阶。

    一般情况下,如果随着n的增长,T(n)增长最慢的那个算法是最优算法。

    以下是常见的时间复杂度,按复杂从小到大排列:

        O(1) 常数阶,

        O(logn) 对数阶,

        O(n) 线性阶,

        O(n^2) 平方阶,

        O(n^3) 立方阶,

        O(2^n) 指数阶,

        O(n!) 阶乘阶

    对大O的推导更多的是考察数学能力。

6. 算法空间复杂度

    在写代码时,可以通过以空间来换取时间。至于哪一个更好,要看实际的应用环境。

    算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:S(n) = O(f(n)) ,n是问题规模,f(n)是关于n所占存储空间的函数。

    不过,通常情况下,我们所讨论的算法复杂度,都是指时间复杂度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值