算法分析(Algorithm Analysis)

看了不同的算法才感觉人与人之间的差距怎么就那么大,不哔哔了(白天已吐槽无数次)

今天主要的就是:基础的时间复杂度和自己的一些探索


时间复杂度:存在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");
}
      
      
     
     

因为内层的if语句每次只有i次符合,最多也就n*(n+1)/2啦,对于外面两层的for循环我们完全可以认为是n*(n+1)/2符合,其余的不符合,那么加起来还是O(N^2),然后最内层的那个for是O(N^2),所以是O(N^4);
但是我还是不确定,因为我是用程序说服自己去分析的哒,用程序记录时间放在了代码段,相当于模板,套用即可,数据自己算去吧...

然后我看到了一个可以丰富常识的题目
直接给答案啦:!(hiahiahia~~~)
2/N, 37,√N, N, N log log N, N log N, N log(N^2), N (log N)^2, N^1.5, N^2, N^2 log N, N^3, 2^(N/2), 2^N.  (按增长率递增所排)
然后N log N and N log(N^2) 的增长率相同
??我怎么看不出来啊,我承认我数学不好,,然后和 N (log N)^2的比较我也弄错了...但是心中的一句话:python大法好,碰碰撞撞的忽悠除了函数的增长变化图,

惊不惊喜,小装一波~


还有那几个算法,看的时候,“这也行?”   “额...明天记下来哈”

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值