算法和算法分析

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+...+(k1)=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 (k1+1)(k1+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(2k1)+2k=22T(2k2)+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(2ki)+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))

以上是关于算法和算法分析的主要内容,如果未能解决你的问题,请参考以下文章

《算法竞赛进阶指南》0x51线性DP Cookies

07-内点法(不等式约束优化算法)

不等式视角下的策略梯度算法

算法设计与分析回溯法---八皇后问题(包含全排列)

算法leetcode|23. 合并K个升序链表(rust重拳出击)

算法leetcode|23. 合并K个升序链表(rust重拳出击)