Big-O

数据结构与算法 Big-O

前言

时间复杂度和空间复杂度常被用来评价一个算法的性能。解决一个问题有很多可能的算法。越好的算法消耗的资源越少。随着内存设备的更新,评价算法效率主要考虑时间复杂度。

常将算法性能常表示为:

  • worst case
  • average case
  • almost never the best case

Big O notation是用于描述函数渐近行为的数学符号。更确切地说,它是用另一个(通常更简单的)函数来描述一个函数数量级的渐近上界。在数学中,它一般用来刻画被截断的无穷级数尤其是渐近级数的剩余项;在计算机科学中,它在分析算法复杂性的方面非常有用。

Big-O

定义:

Given a function T(N), we say T(N)=O(f(N)) if and only if there exist constants “c”, N0 >0 such that every N>=N0 ,T(N)<=cf(N).

证明方法:

假设比较如下两个方程,找到C, N0的值使得当N>=N0时满足50N+99<=CN2

  • T(N)=50N+99
  • f(N)=N2
    在这里插入图片描述

方法1:假设c=1,得到break-even point(N0

从图中可以看出,尽管 T(N) 开始时大于f(N),但存在一个交点( break-even point ),当超过该点时 f(N) 将始终比T(N)更大。 这是找到 N0 的一种可能方法。
根 据 B i g − O 定 义 : T ( N ) < = c f ( N ) , 假 设 c = 1 来 找 到 b r e a k − e v e n − p o i n t 根据Big-O定义: T(N)<=cf(N) ,假设c=1 来找到break-even-point BigOT(N)<=cf(N)c=1breakevenpoint
得 到 : 50 N + 99 < = ( 1 ) N 2 得到: {50N+99<=(1)N^2 } 50N+99<=(1)N2
可 写 成 : N 2 − 50 N − 99 > = 0 可写成:{N^2-50N-99>=0} N250N99>=0
根 据 一 元 二 次 不 等 式 得 到 : 50 ± 5 0 2 + 4 ( 1 ) ( 99 ) 2 ( 1 ) 根据一元二次不等式得到: \frac{50\pm\sqrt{50^2 + 4(1) (99)\quad}} {2(1)} 2150±502+4(1)(99)
N 0 = 50 + 2896 2 ≈ 52 ( 根 据 定 义 N 0 > 0 ) {N{_0}} = \frac{50+\sqrt{2896}\quad} {2}\approx52(根据定义{N{_0}}>0) N0=250+2896 52(N0>0)
得 到 当 常 数 c 等 于 1 , N 0 等 于 52 或 大 于 52 均 满 足 B i g − O 定 义 得到当常数 c等于1,{N{_0}}等于52 或大于52均满足Big-O定义 c1N05252BigO

方法2:假设N0 ,导出不等式,得到常数c

50 N + 99 = 50 N ( 1 ) + 99 ( 1 ) 2 ( k e y s t e p ) 50N+99 = 50N(1) +99(1)^2 (key step) 50N+99=50N(1)+99(1)2(keystep)
< = 50 N ( N ) + 99 ( 1 ) 2 ( 因 为 N > = 1 ) <=50N(N)+99(1)^2 (因为N>=1) <=50N(N)+99(1)2(N>=1)
< = 50 N ( N ) + 99 ( N ) 2 ( 因 为 N > = 1 ) <=50N(N) +99(N)^2 (因为N>=1) <=50N(N)+99(N)2(N>=1)
= 149 N 2 =149N^2 =149N2
得 到 当 常 数 C 等 于 149 , N 0 等 于 1 时 满 足 B i g − O 定 义 得到当常数C等于149,N_0 等于1时满足Big-O定义 C149N01BigO

基本定理

1.N 的幂按其指数排序 (Na=O(Nb) 当且仅当a<=b)。 例如:N2 可等于O(N3), 但N3 不等于O(N2)

The powers of N are ordered according to their exponents.

2.对数的增长速度比 N 的任何其他正幂都慢。 例如:log2 N=O(N1/2)

A logarithm grows more slowly than any other positive power of N.
L’Hopital’s Rule

3.如果f(N)=O(g(N)) 并且g(N)=O(h(N)) 则 f(N)=O(h(N))。

4.f(N)+g(N)=O(max( f(N), g(N))。 例如:O(N2 +N +1)=O(N2)

5.如果f1(N)=O(g1(N)) 并且f2(N)=O(g2(N)) 则 f1(N) x f2(N)=O(g1(N) x g2(N))。

6.对于任意大于0的整数C来说,Cf(N)=O(f(N))。 例如:O(100N)=O(N)

确定一个算法的时间复杂度

例题1:

以下方代码为例:

bool uniqueElements(vector<int>& A){
   for i from 0 to N-1:
   	for j from 0 to i-1:
   		if A[i]=A[j] then
   			return false
   return true
}
  • 首先找到算法中最频繁被运行的代码if A[i]=A[j]
  • if A[i]=A[j] 存在于两层循环中,外层循环运行N-1次内层循环则是由外层循环的迭代变量i所决定
  • 下表纵轴为 i 的迭代,横轴为 j 的迭代,阴影区域的格子数量为两层循环中if A[i]=A[j] then被运行的次数=(N2 -N)/2 (总共N*N个格子减去对角线的格子并除以二)
  • return true的时间复杂度为O(1)
  • 最终得到T(N)=O(N2)+O(1)
  • 根据Big-O基本定理得到:T(N)=O(N2)

例题2:

bool uniqueElements(vector<int>& A){
	mergeSort(A)
	for i from 1 to N-1:
		if A[i-1] =A[i] then
			return false
	return true
}
  • 在此题中mergeSort(A)的时间复杂度为O(NlogN)
  • 循环的时间复杂度O(N)
  • return true的时间复杂度为O(1)
  • 最终得到T(N)=O(NlogN)+O(N)+O(1)
  • 根据Big-O基本定理得到:T(N)=O(NlogN)
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
渐近复杂度(big-Θ)是一种用于描述算法运行时间或空间复杂度的记号。它表示算法在最坏情况下的上界和下界,即它给出了算法的上限和下限。 假设有一个函数 f(n),其中 n 是输入大小。如果存在两个正常数 c1 和 c2,以及一个正整数 n0,使得对于大于等于 n0 的所有 n,都有 c1*g(n) ≤ f(n) ≤ c2*g(n),其中 g(n) 是另一个函数。那么我们可以说 f(n) 的渐近复杂度为 Θ(g(n))。 简而言之,渐近复杂度描述了算法的运行时间或空间需求与输入大小的关系。渐近复杂度大致分为三种情况:最好情况、平均情况和最坏情况。最好情况表示在最理想的输入情况下算法的运行时间;平均情况表示在平均输入情况下算法的运行时间;最坏情况表示在最糟糕的输入情况下算法的运行时间。 常见的渐近复杂度包括: - 常数复杂度(O(1)):算法的运行时间不随输入大小而变化。 - 线性复杂度(O(n)):算法的运行时间与输入大小成线性关系。 - 对数复杂度(O(log n)):算法的运行时间与输入大小的对数关系。 - 线性对数复杂度(O(n log n)):算法的运行时间与输入大小的对数关系乘以线性因子。 - 平方复杂度(O(n^2)):算法的运行时间与输入大小的平方成正比。 - 指数复杂度(O(2^n)):算法的运行时间与输入大小的指数关系。 渐近复杂度分析可以帮助我们评估算法的效率和可行性,并选择适合问题规模的算法

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值