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

算法复杂度分为时间复杂度和空间复杂度

首先要清楚一点,大O表示法的时间复杂度高不代表程序运行时间长,空间复杂度高不代表占用空间多。

他们表示的是代码执行时间随着数据规模增长的变化趋势。和算法储存空间与数据规模之间的增长关系。

时间复杂度判断方法

1、只关注循环次数最多的一段代码

2、加法法则:总复杂度等于量级最大的那段代码的复杂度

3、乘法原则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

常见的复杂度量级(按数量级递增)

常量阶:O(1)

对数阶:O(logn)

线性阶:O(n)

线性对数阶:O(nlogn)

平方阶:O(n2)

...

k次方阶:O(nk)

指数阶:O(2n)

阶乘阶:O(n!)

实战分析几个常见的复杂度

1,O(1)

int i=8;
int j=6;
int sum=i+j;

这个的复杂度是O(1)而不是O(3),代表算法复杂度不随n的变化而变化

2,O(logn),O(nlogn)

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

这段代码循环次数应该是log2n。不管底数是几,都可以记为O(logn),因为log2n=log210*log10n。也就是都可以互相线性转化。直接略去。如果再让这个程序运行n遍,他就是O(nlogn)

3,O(m+n),O(m*n)

int cal(int m, int n) {
  int sum_1 = 0;
  int i = 1;
  for (; i < m; ++i) {
    sum_1 = sum_1 + i;
  }

  int sum_2 = 0;
  int j = 1;
  for (; j < n; ++j) {
    sum_2 = sum_2 + j;
  }

  return sum_1 + sum_2;
}

只看循环次数最多的,总共循环了m+n次,这个代码就可以用O(m+n)

综上,利用那三个判断方法,很容易就可以判断。

空间复杂度的判断也一模一样。

再来理解几个概念

最好情况复杂度,最坏情况复杂度,平均时间复杂度,均摊时间复杂度

// n 表示数组 array 的长度
int find(int[] array, int n, int x) {
  int i = 0;
  int pos = -1;
  for (; i < n; ++i) {
    if (array[i] == x) {
       pos = i;
       break;
    }
  }
  return pos;
}

看这个代码,程序的运行次数跟数组里的值有关,可能运行一次就结束了,也可能运行n次才结束。取决于数组里存的值的排列。

这就显而易见的区分出了最好情况复杂度和最坏情况复杂度。

平均时间复杂度也就可以定义为运行的次数乘以这种情况的概率的和。也就是运行次数的期望值。

均摊时间复杂度使用的局限性很大。

比如一个函数又一次运行的复杂度是O(n),但是又有n-1次运行的复杂度是O(1)。这样的话把O(n)的复杂度均摊到n-1个O(1)上。所以他的均摊时间复杂度就还是O(1)

正在跟着一个数据结构算法课程学习,国庆出去玩已经拉下三节课了,我这两天尽快补回来,及时归纳总结。

原文地址:https://www.cnblogs.com/albert-yzp/p/9748970.html

时间: 2024-10-15 19:25:19

数据结构算法——算法复杂度分析的相关文章

比较排序算法及复杂度分析

比较排序算法分类 比较排序(Comparison Sort)通过对数组中的元素进行比较来实现排序. 比较排序算法(Comparison Sorts) Category Name Best Average Worst Memory Stability  插入排序  (Insertion Sorts) 插入排序 (Insertion Sort) n n2 n2 1 Stable 希尔排序 (Shell Sort) n n log2 n n log2 n 1 Not Stable  交换排序 (Exc

几种简单的求素数算法的复杂度分析

素数的算法有很多种,现在主要讲两种算法及其改进版本的复杂度分析,解释性能提升的幅度.现以求100000内素数为例,两种算法分别是: 1.基础思路是去掉偶数,包括取模的范围,代码如下: print(2) for i in range(3,100000,2): for a in range(3,int(i*0.5)+1,2): if i%a == 0: break else: print(i,end = ' ')此两层循环的算法的复杂度为0.5n((n**0.5+1)/2) 2.应用一个素数定理:大

算法的复杂度分析

这个是每个学习算法都必须掌握的东西.不过感觉又不太好说的清楚. 大概扯一下.就是因为每个计算机的运行的速度都不一定相同.所以需要一个标准来判断一个程序跑的快慢. 比如一个简单的for循环.for(int i = 0; i < n; i++); 这个循环其实循环了n次.可能在不同的机器上跑的时间不同. 但是都一定会跑n次.所以用O(n)来表示这个循环的时间复杂度. 再举一个例子 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++

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

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

数据结构与算法系列二(复杂度分析)

1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法?

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

一.大 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 的角度来看,这段代码的每一行都执

转 算法复杂度分析

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

01 | 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

我们都知道,数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间.所以,执行效率是算法一个非常重要的考量指标.那如何来衡量你编写的算法代码的执行效率呢?这里就要用到我们今天要讲的内容:时间.空间复杂度分析.其实,只要讲到数据结构与算法,就一定离不开时间.空间复杂度分析. 而且,我个人认为,复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半.其实,只要讲到数据结构与算法,就一定离不开时间.空间复杂度分析. 复杂度分析实在太

复杂度分析(上)如何分析统计算法的执行效率和资源消耗

一.什么是复杂度分析? 数据结构和算法解决是“如何让计算机更快时间.更省空间的解决问题”. 因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能. 分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度. 复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系. 二.为什么要进行复杂度分析? 2.1 事后统计法 2.2.1 概念 通过运行代码跑,统计.监控,得到算法执行的时间和占用的内存大小. 2.2.2 劣势 测试结果非常依赖测试环境.测试环境中硬件的不同会对测试结

复杂度分析-算法学习的精髓

J我们知道学习数据结构与算法主要是解决一个「快」和「省」的问题,如何让代码执行更快.如何更节省空间.那么如何来考量你的代码的执行效率呢,我们总要有一个标准,这就是我今天所讲的复杂度分析,不夸张的说,掌握好复杂度分析,数据结构与算法你就掌握了一半,所有的算法都逃不出复杂度分析的范畴. 复杂度分析包括时间复杂度和空间复杂度. 如何考量我们代码的执行效率,有的人可能会说我在计算机上跑一下不得了,简单便捷,没错,这样确实可以.但是这种方法太依赖硬件环境了,你在不同的机器上跑的时间肯定是不一样的.所以,我