数据结构学习笔记1

程序设计=数据结构+算法
谈谈算法 
数据结构与算法是“好基友”,如果单独谈数据结构,或者单独谈算法是没什么意义的。来一个牛叉的算法吧!
计算1+2+3+4+.........100,程序怎么写?
以前我还很傻B地用for循环来写这个小程序,傻B小程序如下:
int i, sum=0,n=100;
for(i=1;i<=n;i++)
{
    sum=sum+i;
}
printf("%d",sum);
这个程序就是让sum=sum+i执行100次。比如一条指令需要1微秒时间,那么这个程序需要大约103微秒时间。
如果用高斯先生的方法来写这个小程序,简单,高效啊:
Int i,sum=0,n=100;
sum=(1+n)*n/2;
printf("%d",sum); 
将高斯先生的数学技术应用到编程中,哇塞,比如一条指令需要1微笑时间,那么这个程序需要大约3微秒时间。
虽然现实中102微秒跟3微秒对于我们人类来说是没什么感觉,但数字一大的话,差别就很明显了!

第三节—时间复杂度与空间复杂度
计算算法执行时间有两种方法=事前分析估算方法+事后统计方法
事后统计方法:就是写好测试程序来计算算法的执行时间,这个工作量很大,而且程序经常变化,那么测试程序也跟着变化?小甲鱼有一个很好的比喻,叫了赔了娘子又折兵,亏大了!(这个方法没用)
事前分析估算法:就是用一些数学知识来大约计算程序的执行时间。(这个是主要方法) 
算法的复杂度:T(n)=O(f(n))
用小甲鱼的游戏攻略:
攻略1:用常数1取代运行时间中的所有加法常数。
攻略2:在修改后的运行次数函数中,只保留最高接项。
攻略3:如果最高项存在且不等于1,就去除与这个项相乘的常数。
下面是解说↓
攻略1:
printf("i love you".);
printf("i love you".);
printf("i love you".);
printf("i love you".);
printf("i love you".);
printf("i love you".);
那么这个大O是多少?O(8)?错了,是O(1)。
攻略2和攻略3:
int i,j,n=100;
for(i=0;i<n;i++)
{
    for(j=i;j<n;j++)
    {
        printf("I love you ");
    }
}
这个比较复杂,当i=0时,内循环n次,当i=1时,内循环n-1次。当i=n-1时,内循环执行1次,噢?这么熟悉的?就是高斯先生的算法啊。
n+(n-1)+(n-2)+..........+1=n(n+1)/2
内循环的次数是n(n+1)/2次,外循环就是n次。
那么T(n)=1/2*n^2+3/2*n。
按照攻略2,T(n)=1/2*n^2;
按照攻略3,T(n)=n^2;
常用的时间复杂度所耗费的时间从小到大依次是:O(1) < O(logn) < (n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)
虽然还有空间复杂度,但是我们一般不去考虑它,当直接要让我们求“复杂度”时,通常指的是时间复杂度
 

猜你喜欢

转载自blog.csdn.net/usstmiracle/article/details/81712289