【算法与数据结构】-2 渐进式分析

运行时增长量级(表格法)

def dup1(A):
	for i in range(len(A)):
		for j in range(i+1,len(A)):
			if A[i] = A[j]:
				return True;
	return False;
operation count,N=10000 symbolic worst case
range() 2-10001 2 ~ N+1 N
len() 2-10001 2 ~ N+1 N
i 1-10000 1 ~ N+1 N
j 1-49995000 1 ~ (N^2-N)/2 N^2
== 1-49995000 1 ~ (N^2-N)/2 N^2
array access 2-99990000 2 ~ N^2-N N^2
def dup2(A):
	for i in range(len(A)-1)):
		if A[i] == A[i+1]:
			return True;
	return False;
operation count,N=10000 symbolic
range() 1 1
len() 1 1
i 1-9999 1 ~ N-1
== 1-9999 1 ~ N-1
array access 2-19998 2 ~ 2N-2

计算复杂性的时候,遵循以下方法:

  1. 只考虑最坏的场景
  2. 选择一个最具代表性的操作,如例1的"=="/“j”
  3. 忽略所有低指数项,如((N^2)-N)/2 —> (N^2)/2
  4. 忽略这一项的系数 (N^2)/2 --> N^2
    【算法与数据结构】-2 渐进式分析_第1张图片

运行时增长量级

  1. 选出一个有代表性的操作
  2. 找出这个代表性操作出现次数的增长量级
    2.1 找出具体数量,然后删除不必要的项
    2.2 用直觉或其他方法

如例1:

def dup1(A):
	for i in range(len(A)):
		for j in range(i+1,len(A)):
			if A[i] = A[j]:
				return True;
	return False;

【算法与数据结构】-2 渐进式分析_第2张图片
通过上表,可以看出最差的场景,==的操作次数为:
C = 1+2+3+…+(n-2) + (n-1) = N(N-1)/2
所以运行时增长量级为:

operation worst case o.o.g
== N^2

或者图形算法计算三角形面积。

Big Theta(θ)

定义:
R(N)∈θ(f(N))就意味着存在两个正数k1和k2使得:
k1* f(N) <= R(N) <= k2*f(N)
以上只需要N大于某个N0时。
举个栗子:
40sin(N) + 4N^2 ∈ θ(N^2)

  • R(N) = 40sin(N) + 4N^2
  • f(N) = N^2
  • k1 = 3
  • k2 = 5
  • 3f(N) <= R(N) <= 5*f(N)成立
    【算法与数据结构】-2 渐进式分析_第3张图片
    根据BigTheta可以将例1的表格修改为如下:
operation count,N=10000 symbolic worst case big theta
range() 2-10001 2 ~ N+1 N θ(N)
len() 2-10001 2 ~ N+1 N θ(N)
i 1-10000 1 ~ N+1 N θ(N)
j 1-49995000 1 ~ (N^2-N)/2 N^2 θ(N^2)
== 1-49995000 1 ~ (N^2-N)/2 N^2 θ(N^2)
array access 2-99990000 2 ~ N^2-N N^2 θ(N^2)

Big O (O)

定义:
“大O符号(Big O notation)是用于描述函数渐近行为的数学符号。更确切地说,它是用另一个(通常更简单的)函数来描述一个函数数量级的渐近上界。 可以用“<=”来理解。
R(N)∈O(f(N))就意味着存在正数k1使得:
R(N) <= k1*f(N)
以上只需要N大于某个N0时。

Big Omega(Ω)

定义:
R(N)∈Ω(f(N))就意味着存在正数k1使得:
k1*f(N) <= R(N)
以上只需要N大于某个N0时。
是用另一个函数来描述一个函数数量级的渐进下界,可以用">="来理解。

你可能感兴趣的:(算法,数据结构)