算法和算法分析
Posted sanweizuiji
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法和算法分析相关的知识,希望对你有一定的参考价值。
1 算法的定义、特性
1.1
例 算法代表对问题求解步骤的描述,而程序则是算法在计算机上的特定实现
例 衡量一个算法的优劣主要考虑(正确性、可读性、健壮性、时间复杂度、空间复杂度)
1.2 算法的5个重要特性
有穷性、确定性、可行性、输入、输出
2 时间复杂度
2.1 代码
例
int func(int n)
int i = 0, sum = 0;
while (sum < n)
sum += ++i;
return i;
① 设 while 的执行次数为 k 次
② 找规律
执行第 1 次时,i = 0,sum = 0
执行第 2 次时,i = 1,sum = 0 + 1
执行第 3 次时,i = 2,sum = 0 + 1 + 2
执行第 k 次时,i = k - 1,sum = 0 + 1 + 2 + . … + ( k - 1 )
③ 综上得出等式
0 + 1 + 2 + . . . + ( k − 1 ) = n 0 + 1 + 2 + ... + ( k - 1 ) = n 0+1+2+...+(k−1)=n
k ( k + 1 ) 2 − 1 = n \\frack(k+1)2-1=n 2k(k+1)−1=n
④ 解出时间复杂度
O ( n ) = n 1 2 O(n)=n^\\frac12 O(n)=n21
例
int x = 0;
while (n > (x + 1) * (x + 1))
x = x + 1;
① 设 while 的执行次数为 k 次
② 找规律
执行第 1 次时,x = 0
执行第 2 次时,x = 1
执行第 3 次时,x = 2
执行第 k 次时,x = k - 1
③ 综上得出等式
( k − 1 + 1 ) ∗ ( k − 1 + 1 ) = n (k-1+1)*(k-1+1) = n (k−1+1)∗(k−1+1)=n
k 2 = n k^2=n k2=n
④ 解出时间复杂度
O ( n ) = n 1 2 O(n)=n^\\frac12 O(n)=n21
2.2 递归方程
例 一个算法所需时间由下述递归方程表示,试求出该算法的时间复杂度的级别(或阶)(式中,n是问题的规模,为简单起见,设n是2的整数次幂)
T ( n ) = 1 , n = 1 2 T ( n / 2 ) + n , n > 1 T(n)= \\left\\\\beginmatrix 1, n=1 \\\\ 2T(n/2)+n, n>1 \\endmatrix\\right. T(n)=1,n=12T(n/2)+n,n>1
① 设
n = 2 k n=2^k n=2k
②
T ( 2 k ) = 2 T ( 2 k − 1 ) + 2 k = 2 2 T ( 2 k − 2 ) + 2 × 2 k T(2^k)=2T(2^k-1)+2^k=2^2T(2^k-2)+2×2^k T(2k)=2T(2k−1)+2k=22T(2k−2)+2×2k
T ( 2 k ) = 2 i T ( 2 k − i ) + i × 2 k T(2^k)=2^iT(2^k-i)+i×2^k T(2k)=2iT(2k−i)+i×2k
T ( 2 k ) = 2 k T ( 2 0 ) + k × 2 k T(2^k)=2^kT(2^0)+k×2^k T(2k)=2kT(20)+k×2k
T ( n ) = 2 l o g 2 n + ( l o g 2 n ) × n = n + ( l o g 2 n ) × n = n ( 1 + l o g 2 n ) T(n)=2^log_2n+(log_2n)×n=n+(log_2n)×n=n(1+log_2n) T(n)=2log2n+(log2n)×n=n+(log2n)×n=n(1+log2n)
③ 解得
O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)
2.3 其他
例
已知两个长度分别为m和n的升序链表,若将它们合并为长度为m+n的一个降序链表,则最坏情况下的时间复杂度是()
A. O(n)
B. O(mn)
C. O(min(m,n))
D. O(max(m,n))
① n链表中5比较了三次,8比较了三次,10比较了三次,13比较了三次,一共是4+6-1=9次
② 但是,答案中并没有O(n+m-1)或O(n+m)这个选项
注:当n和m无限大的时候,-1忽略掉
这里就需要提醒的是,时间复杂度是一个级数概念,即O(2n),O(n+1000),,O(n-50),都是属于O(n)这个级别(范畴)
并且是一个线性变化的常数项级,同理O(m)也一样
包括取大去小原则
如果一个算法的时间复杂度是n3+n2+n+1
那么算法复杂度是O(n3)
回到题目,如果我们以链表m长度远大于链表n的情况下来看,那么在相互比较的情况下,O(m+n)是否可以看成O(m)
?同理,如果我们以链表n长度远大于链表m的情况下来看,O(m+n)是否可以看成O(n)?
那么结论就是:O(m+n)==O(max(m,n))
当然也可以用夹逼定理去说明这个结论
O(max(m,n))≤O(m+n)≤2O(max(m,n))
2O(max(m,n))还是属于O(max(m,n))这个级别
所以可证:O(m+n)==O(max(m,n))
以上是关于算法和算法分析的主要内容,如果未能解决你的问题,请参考以下文章