zoukankan      html  css  js  c++  java
  • 算法复杂度初步

    计数

      选择特定的计算模型:图灵机。用执行步数测量时间,用磁带格数测量空间。具体地说:

    • 让图灵机具有任意定长的字母表。注意如果进行更严格的假设,只允许两个磁带符号,则步数与磁带格数会增加,但只是增加一个常量格数。
    • 用单带图灵机。如果放松这个限制,使用多带图灵机。单带图灵机上执行程序所要的步数最多增加到多带图灵机上执行这个程序所要的步数。因此,如果这个因子不重要,为了方便起见,可以使用单带图灵机。

    算法分析基本思路

    算法分析要保持大局观,其基本思路:

    1. 忽略掉那些依赖于机器的常量。
    2. 关注运行时间的增长趋势。

    算法的五个基本特征

    • 有穷性:一个算法必须在执行有穷步之后就能够结束,并且其中每一步都可以在有穷时间内完成。
    • 确定性:算法的描述必须无歧义,以确保算法的实际执行结果精确地符合要求或期望,通常要求算法的实际执行结果是确定的。
    • 可行性:算法中描述的指令都可以通过已经实现的基本操作运算的有限次执行来实现。
    • 输入:一个算法有零个或多个输入,这些输入取自特定的对象集。
    • 输出:一个算法有一个或多个输出,输出量是算法计算的结果。

    算法最主要的评价标准有两个:一是正确性,二是算法效率。

      时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序的运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。

      算法复杂度一般分为时间复杂度和空间复杂度。一个高级语言编写的程序在计算机上运行所消耗的时间取决于下列因素:

    • 算法采用的策略、方案
    • 编译产生的代码质量
    • 问题的输入规模
    • 机器执行指令的速度

    时间复杂度

    时间频度

      一个算法中的语句执行次数。记为T(n);

    时间复杂度

      时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。为了知道变化呈现什么规律,引入时间复杂度

      若存在某个f(n),当n→∞时,T(n)/f(n)为不等于0的常数,则称f(n)是T(n)的同数量级函数。记T(n)=O(f(n));称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。

      随着n的增大,时间的增长率和f(n)的增长率成正比。f(n)越小,算法的时间复杂度越低,算法的效率越高。

    空间复杂度

      算法所耗费的存储空间,记为S(n);一个算在计算机存储器上所占用的存储空间一般包含以下几个方面:

    • 存储算法本身所占用的存储空间:与算法书写的长短成正比,要压缩此方面的存储空间,则必须编写出精短的代码
    • 算法的输入输出数据所占用的存储空间:由解决的问题决定,是通过参数表由调用函数传递而来,不随算法的不同而改变
    • 算法在运行过程中临时占用的存储空间:随算法的不同而不同,主要包括动态分配的空间、以及递归栈所需的空间等

    时间复杂度比较

    O(1)<O(logn)<O(n1/2)<O(n)<<O(nlogn)<O(n.n1/2)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

     举例说明

    •  O(1)常数时间,不受数据规模的影响:判断一个数的奇偶性
    • O(logn)数据规模不断减半:二分查找
    • O(n1/2):判断一个数是素数
    • O(n)线性时间复杂度:给定一个长度为n的序列,求最大最小值
    • O(nlogn):归并排序
    • O(n.n1/2):给定一个长度为n的无序序列,m次询问,每次询问区间[l,r]的最大值
    • O(n2):基本操作,加法、乘法
    • O(2n):求集合大小为n的所有子集
    • O(n!):生成1—n的所有排序

    数据结构基本操作的时间复杂度

    数组

    哈希表

    集合

    单链表

    双链表

    队列

    时间复杂度汇总

    参考文献

    里奇. 自动机理论与应用[M]. 清华大学出版社, 2011.

    Cormen T H , Leiserson C E , Rivest R L , et al. 算法导论(原书第3版)[J]. 计算机教育, 2013(10):51-51.

  • 相关阅读:
    BZOJ 1800 [Ahoi2009]fly 飞行棋
    BZOJ 3309 DZY Loves Math
    CAS Server和client 实现单点登录
    单点登录原理与简单实现
    Maven插件
    win10安装最新nexus-3.x及maven简单配置介绍
    oracle获取表的属性,包括字段,注释
    java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一
    深入理解Tomcat虚拟目录
    环境搭建系列-系统安装之centos 6.5安装与配置
  • 原文地址:https://www.cnblogs.com/zhangzefei/p/9843771.html
Copyright © 2011-2022 走看看