看了不同的算法才感觉人与人之间的差距怎么就那么大,不哔哔了(白天已吐槽无数次)
今天主要的就是:基础的时间复杂度和自己的一些探索
时间复杂度:存在c,n0,N>=n0时
T(N)<=cf(N) T(N)=O(f(N)) 1
T(N)>=cg(N) T(N)=Ω(f(N)) 2 1&&2 T(N)=Θ(f(N))
T(N)<cf(N) T(N)=o(f(N))
相关法则:
1、T1(N)+T2(N) = O(f(N) +g(N)) =O (max( f(N), g(N)) T1(N)*T2(N) = O(f(N) *g(N))
2、T(N)为k次多项式,则T(N)=Θ(N^k (忽略低幂影响?嗯,对)
3、(logN)^k = O(N) **
然后给你一段程序,让你分析它的时间复杂度,那么你有需要 如下的法则:
1、for <= for内部的基础语句*迭代 (一定要注意的是for内的基础语句)
2、嵌套:分析由内到外
3、顺序看待整个程序,取 max ,呼应O (max( f(N), g(N)) ?
4、if-else <= 判断 + max( if/else 二者中的语句)
5、函数调用优先分析,如果你还碰见还是递归,
好的情况是可化解成 for 循环;
不好的就是fibnacci数列那种,T(N)=T(N-1)+T(N-2)+2 根据数学知识...(5/3)^N > fin(N) >= (3/2)^N(N>4时,指数级诶~
我也感觉对于O(logN)的不好判断,貌似那种二分啊,分而治之的是诶,作者给了一个小技巧吧:
用O(1)时间 算法的时间复杂度减少:
到 了 O(1/2) 则是O(logN)
了 一个常数 则是O(N)
基础知识差不多就是这样,万变不离其宗,然后看题感觉自己可能看了假知识...
#include
#include
using namespace std;
#define CLOCKS_PER_SEC ((clock_t)1000)//用来表示一秒钟会有多少个时钟计时单元
int main()
{
clock_t start, end;
int sum = 0;
int n;
cin >> n;
start = clock();
//这个函数开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元数
//下面是一个让人犯错误然后惊喜的例子
for (int i = 1; i < n; ++i)
for (int j = 1; j < i*i; ++j)
if (j%i == 0)
for (int k = 0; k < j; ++k)
++sum;
end = clock();
cout << (double)(end-start) / CLOCKS_PER_SEC << "s" << endl;;
system("pause");
}