算法分析与设计(第一周)【已完结】

本周知识要点:

主要是介绍与了解

1.1 时间复杂度的概念以及简单运算

1.2 一些简单算法的时间复杂度的计算

1.1 时间复杂度的概念以及简单计算时间复杂度

1、一些简单的知识提要

b=bit, B=Byte=8bit

K=Kilo=1024, M=Mega=1024K, G=Giga=1024M, T=Tera=1024G, P=Peta=1024T

k=10^3, m=10^6, g=10^9, t=10^12, p=10^15

实际上 经常会有 2^10 ≈10^3  这样的做法,在某种意义上 其实可以这么做。

 

常见速度:CPU计算速度 = CPU缓存cache >内存mem >固态硬盘SSD >机械硬盘HD

 

2、时间复杂度的定义

四个定义:【注:T(N)是实际的时间复杂度,但是一般求解比较苦难所以确定上下界即可】

定义一:如果存在正的常数c和n_{0} 使得当 N ≥ n_{0} 时,T(N)≤ cf(N),则记为T(N) = O(f(N))

定义二:如果存在正的常数c和n_{0} 使得当 N ≥ n_{0} 时,T(N)≥ cg(N),则记为T(N) = \Omega(g(N))

定义三:T(N)= \Theta(h(N)) 当且仅当T(N) = O(h(N)) 且T(N)= \Omega(h(N))

定义四:如果T(N) = O(p(N))且T(N) ≠  \Theta(p(N)),则T(N) = o(p(N))

这些定义的母的是要在函数间建立一种相对的级别。

程序运行时间是输入规模N的一个函数T(N),但T(N)精确的表达式难以得到,转而求近似时间。N小时一般T(N)也小,此时往往运行时间可以接受。所以一般关心N趋于无穷大时T(N)的近似。如果T(N)是一个N的多项式,则N趋于无穷大时,影响T(N)的因素有:最高次项的次数,最高次项的系数,次高次项的次数、系数……,重要性依次递减。不局限于多项式,形象地说,时间复杂度,是输入规模N趋于无穷大时,所花时间T(N)的最高阶部分,忽略常系数因子,忽略所有低阶部分。

以下给出两种时间复杂度不同的代码 计算斐波那契数列(不保证数值不会溢出的现象)

时间复杂度比较高的算法(递归算法)

#include<stdio.h>
#include<time.h>

int f( int n)
{
	if(n == 1||n == 2)	return 1;
	else return f(n-1)+f(n-2);
	
}

int main()
{
	clock_t start,fin;
	start = clock();
	for(int n = 1;n<45; n++) printf("%d\n",f(n));
	fin = clock();
	float time = (double)(fin-start)/CLOCKS_PER_SEC;
	printf("time is %f s", time);
	
} 

时间复杂度比较低的算法(动态规划)

#include<stdio.h>
#include<time.h>


int main()
{
	clock_t start,fin;
	start = clock();
	int a1 = 1;
	int a2 = 1;
	int temp;		
	for(int n = 1;n<45; n++)
	{
		if(n<3) printf("1\n");
		else{
			temp = a1;
			a1 = a1 + a2;
			a2 = temp;
			printf("%d\n",a1);
		}	
	} 	
	fin = clock();
	float time = (double)(fin-start)/CLOCKS_PER_SEC;
	printf("time is %f s", time);
} 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值