zoukankan      html  css  js  c++  java
  • 算法竞赛时间复杂度及空间复杂度

    众所周知算法竞赛以及有关计算机科学的诸多学科中,时间复杂度和空间复杂度是评判一个算法/程序的重要标准。一般使用O( )来表示。

    同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。

    计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。——来自百度百科的神奇解释?

    空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。

    是不是感觉很晦涩呢?

    先来说说时间复杂度

    根据大佬们的说法oi官方评测机的主频是4.7GHZ,也就是说一秒钟内能完成10^9程度的运算。而且在算法竞赛里面往往将运行时间卡在一秒钟,这就意味着我们需要结合题目中的数据范围选择尽可能优秀的算法和数据结构等等以便可以获得全部分(当然暴力拿部分分也是要优化的)

    事实上,一个程序的时间复杂度是基于你输入的n,对它进行重复操作的次数。大O表示法随着输入的值变化,程序运行所需要的时间与输入值的变化关系。一般我们在计算时间复杂度的时候,可以先找找程序的基本操作,例如:for循环是从1~n的循环,所以每次进行一次for,复杂度+n。但是当for循环套for循环的时候,复杂度就会以指数增长,一般是一重for,n的指数就加1。这种复杂度我们一般称之为线性。

    还有一些算法如最典型的二分,因为二分每次操作都可以把目标的元素砍掉一半,比如n=1024时,我们只要找10次就可以了,因为2^10=1024。那你又会说了,如果元素再大,次数还会这么少吗?您看呀,如果n=2048。那不就是2^11吗?不难发现,元素的个数虽然翻倍,但是我们只是多加了一次操作,所以O(logN)的对数算法不失为一种很高效的算法。

    其他的一些复杂度如O(1)我们一般称之为常数复杂度。例如一个数组a[5]={1,2,3,4,5}我们要查询数组的第一个元素1,因为它已经存好了元素,我们的查询只需要1次操作。例如ST表查询RMQ就是O(1)的时间复杂度。因为这种算法就像一个小常数一样,不会受到任何东西的影响,我们把它称之为常数复杂度。

    最后还有线性对数复杂度 O(N*logN),在高效的排序中较为常见,如快速排序,归并排序,堆排序。

    按数量级递增排列,常见的时间复杂度有:

    常数阶O(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n^2),立方阶O(n^3)k次方阶O(n^k),指数阶O(2^n)以及O(n!)

    再来说说空间复杂度

    递归深度N*每次递归所要的辅助空间, 如果每次递归所需的辅助空间是常数,则递归的空间复杂度是 O(N).

  • 相关阅读:
    JS 数组总结
    JS 数据类型及其判断
    CSS 优先级
    正则表达式及其使用例子
    常见的图片格式
    React 箭头函数的使用
    手动搭建 react+webpack 开发环境
    JS 函数参数及其传递
    JS 中的 this 指向问题
    JS 中函数的 length 属性
  • 原文地址:https://www.cnblogs.com/mo-qian/p/11287319.html
Copyright © 2011-2022 走看看