本周知识要点:
主要是介绍与了解
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 ≥ 时,T(N)≤ cf(N),则记为T(N) = O(f(N))
定义二:如果存在正的常数c和 使得当 N ≥ 时,T(N)≥ cg(N),则记为T(N) = (g(N))
定义三:T(N)= (h(N)) 当且仅当T(N) = O(h(N)) 且T(N)= (h(N))
定义四:如果T(N) = O(p(N))且T(N) ≠ (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);
}