[算法]复杂度分析

时间复杂度

时间复杂度的分析

  • 只关注循环执行次数最多的一段代码,因为使用大O表示法,其他执行次数较少的复杂度可以忽略
  • 加法法则:总复杂度等于量级最大的那段代码的复杂度
  • 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

常见的时间复杂度示例

复杂度从低阶到高阶为:(复杂度越高阶,执行效率越低)

O(1)、O(logn)、O(n)、O(nlogn)、O(n^2)

O(1)

该时间复杂度表示代码的执行时间可以认为与输入n无关,是一个固定的值

O(logn)&O(nlogn)

o(logn)复杂度有一个很好的例子可以进行说明:

i=1
while(i<=n){
i=i*2;
}

i的值随每一次循环变化为:1,2,4,...,n

执行次数x满足:2^x=n,x=log2n

对代码进行更改:

i=1
while(i<=n){
i=i*3;
}

现在代码的执行次数变成x=log3n

以上两种都可以表示为O(logn)

O(logn)可以使用乘法法则进行理解

O(m+n)&O(m*n)

O(m+n)、O(m+n)表示复杂度随着两个输入的规模而变化。

O(n^2)

这种复杂度一般是存在两层循环的情况

最好&最坏时间复杂度

在一些代码中,每种情况下代码的执行时间不同,例如在数组中寻找一个特定的元素

在这种情况下,可以使用最好、最坏时间复杂度进行表示,这两种情况都是理想情况。

平均时间复杂度

平均复杂度是在前一种情况下更好地表示代码的复杂度。它等于代码各种可能出现的情况乘以其概率之和。平均时间复杂度也可以称为加权平均时间复杂度或者是期望时间复杂度。

均摊时间复杂度

存在如下代码

let array=[]
let count=0

insert(int val){
       if(count==array.length){
    int sum=0;
    for(int i=0;i<array.length;i++){
        sum=sum+array[i]
    }
    array[0]=sum
    count=1;
    }
    array[count]=val
    ++count
}

代码实现了向一个数组中添加元素,如果数组已满,计算其中元素和,存放在第一个元素,再插入元素

这种情况下,在大部分时候,代码的复杂度为O(1),在小部分时候复杂度为O(n)。

实际上,因为两者具有一定的规律,所以可以将O(n)复杂度均摊到O(1)复杂度的时候,在这种情况下,连续操作下,复杂度仍为O(1)

以上的分析方法称为摊还分析法

在一般能使用摊还分析法的代码中,时间复杂度等于其最好情况时间复杂度.

其实,摊还分析就是在一定规律的操作下,将出现频率较低的高时间复杂度分摊至出现频率较高的低时间复杂度上,最后计算出的复杂度将会较低,这种复杂度也可以视为一种平均复杂度。

空间复杂度

空间复杂度分析

一般常见的空间复杂度为O(1):一个单一的存储变量,O(n):一个数组、O(n^2):一个二维数组

原文地址:https://www.cnblogs.com/liuju/p/12555403.html

时间: 2024-10-09 22:34:00

[算法]复杂度分析的相关文章

算法9-4:最大流算法复杂度分析

前面一节介绍了Ford-Fulkerson算法.那么这个算法是否一定能够在有限步骤内结束?要多少步骤呢? 这个问题的答案是,该算法确实能够在有限步骤之内结束,但是至于需要多少步骤,就要仔细分析. 为了分析问题,需要假定图中所有边的容量都是整数.但是有个严重的问题,比如下图中,如果使用Ford-Fulkerson算法,需要迭代200次才能结束. 首先将所有边的容量都初始化为0. 第一次迭代和第二次迭代之后,两条边各增加了1. 到最后200次迭代之后整个算法才结束. 这还不算最坏的情况.因为整数最多

转 算法复杂度分析

转自 http://www.cnblogs.com/gaochundong/p/complexity_of_algorithms.html 为什么要进行算法分析? 预测算法所需的资源 计算时间(CPU 消耗) 内存空间(RAM 消耗) 通信时间(带宽消耗) 预测算法的运行时间 在给定输入规模时,所执行的基本操作数量. 或者称为算法复杂度(Algorithm Complexity) 如何衡量算法复杂度? 内存(Memory) 时间(Time) 指令的数量(Number of Steps) 特定操作

数据结构基础 算法复杂度分析(二) 典例篇

示例代码(1) decimal Factorial(int n) { if (n == 0) return 1; else return n * Factorial(n - 1); } [分析] 阶乘(factorial),给定规模 n,算法基本步骤执行的数量为 n,所以算法复杂度为 O(n). 示例代码(2) int FindMaxElement(int[] array) { int max = array[0]; for (int i = 0; i < array.Length; i++)

数据结构算法——算法复杂度分析

算法复杂度分为时间复杂度和空间复杂度 首先要清楚一点,大O表示法的时间复杂度高不代表程序运行时间长,空间复杂度高不代表占用空间多. 他们表示的是代码执行时间随着数据规模增长的变化趋势.和算法储存空间与数据规模之间的增长关系. 时间复杂度判断方法 1.只关注循环次数最多的一段代码 2.加法法则:总复杂度等于量级最大的那段代码的复杂度 3.乘法原则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积 常见的复杂度量级(按数量级递增) 常量阶:O(1) 对数阶:O(logn) 线性阶:O(n) 线性对数阶:

学好数据结构和算法 —— 复杂度分析

复杂度也称为渐进复杂度,包括渐进时间复杂度和渐进空间复杂度,描述算法随数据规模变化而逐渐变化的趋势.复杂度分析是评估算法好坏的基础理论方法,所以掌握好复杂度分析方法是很有必要的. 时间复杂度 首先,学习数据结构是为了解决“快”和“省”的问题,那么如何去评估算法的速度快和省空间呢?这就需要掌握时间和空间复杂度分析.同一段代码运行在不同环境.不同配置机器.处理不同量级数据…效率肯定不会相同.时间复杂度和空间复杂度是不运行代码,从理论上粗略估计算法执行效率的方法.时间复杂度一般用O来表示,如下例子:计

数据结构与算法复杂度分析

一.大 O 复杂度表示法 算法的执行效率,粗略地讲,就是算法代码执行的时间.但是,如何在不运行代码的情况下,用“肉眼”得到一段代码的执行时间呢?这里有段非常简单的代码,求 1,2,3…n 的累加和.现在,来估算一下这段代码的执行时间. 1 int cal(int n) { 2 int sum = 0; 3 int i = 1; 4 for (; i <= n; ++i) { 5 sum = sum + i; 6 } 7 return sum; 8 } 从 CPU 的角度来看,这段代码的每一行都执

数据结构基础 算法复杂度分析(一) 概念篇

为什么要进行算法分析? 预测算法所需的资源 计算时间(CPU 消耗) 内存空间(RAM 消耗) 通信时间(带宽消耗) 预测算法的运行时间 在给定输入规模时,所执行的基本操作数量,或者称为算法复杂度(Algorithm Complexity) 如何衡量算法复杂度? 内存(Memory) 时间(Time) 指令的数量(Number of Steps) 特定操作的数量 磁盘访问数量 网络包数量 渐进复杂度(Asymptotic Complexity) 算法的运行时间与什么相关? 取决于输入的数据.(例

算法复杂度分析方法以及算法概述

算法定义:解决特定问题的求解步骤的描述. 算法特性:有穷性.确定性.可行性.输入.输出 算法的设计要求:正确性.可读性.健壮性.高效率和低存储量需求 算法度量方法:事后统计方法(不科学).事前分析估算方法 函数的渐近增长:给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么我们说f(n)的增长渐近快于g(n). 于是,可以得出结论:判定一个算法好不好,可以对比算法的关键执行次数函数的渐近增长性,基本就可以分析出:某一个算法,随着n的变大,它会越

算法复杂度分析

算数级数:与末项平方同阶 T(n) = 1+2+…+n = n(n+1)/2 = O(n2) 幂方级数:比幂次高出一阶 T2(n) = 12 + 22 + 32 + … + n2 = n(n+1)(2n+1)/6 = O(n3) T3(n) = 13 + 23 + 33 + … + n3 = n2(n+1)2/4 = O(n4) T4(n) = 14 + 24 + 34 + … + n4 = n(n+1)(2n+1)(3n2 + 3n -1)/30 = O(n5) … 几何级数(a > 1):与