算法设计与分析的基础知识(1)

来源:互联网 发布:淘宝店3c认证怎么办理 编辑:程序博客网 时间:2024/06/05 10:51

距离算法考试还有两周的时间,准备从现在开始用笔记的形式记录自己学习或复习算法课程的成果。不是有那么一句名言嘛:好记性不如烂笔头。Learn From Now!

算法是一系列解决问题的清晰指令,即对符合一定规范的输入,在有限时间内获得所要求的输出。


算法需要满足以下四大性质

1、输入:有零个或多个外部量作为算法的输入(意思是可以没有输入)

2:输出:有一个或多个量作为输出(意思是必须有输出)

3、确定性:组成算法的每条指令清晰,无歧义。

4、有限性:算法中每条指令的执行次数或执行时间在有限的范围内。

在这里特别强调与程序的区别:

程序是算法用某种程序设计语言的具体实现。(可不满足以上四大性质)

以下是算法的几个要点:

1、算法的每个步棸都必须清晰,明确,不得有半点模糊。

2、算法所处理的值域必须仔细定义。

3、同样一种算法可以用不同的形式描述

4、同一个问题可能存在不同的解决算法

5、针对同一个问题不仅可能解决算法的思路差别很大,而且解题速度可能也会相差很大。

算法概念的再理解:

算法是问题的程序化解决方案,这些解决方案本身并不是答案,而是能够得到答案的精准指令。

名言:人们常说,一个人只有把知识教给别人,才能真正掌握它。实际上,一个人只有把知识教给“计算机”,才能真正掌握它。

算法中的所有理解性的概念中最难的当数复杂度分析了:时间复杂度、空间复杂度

算法复杂度分析是指算法在运行过程中所需的计算机资源量。

需要的时间资源的量叫时间复杂度;

需要的空间资源的量叫空间复杂度。

TS来表示时间复杂性和空间复杂性,有: 

T=T(N,I)S=S(N,I)。 

N代表问题的规模,I代表输入。

假定计算机上能够提供k种元运算,记为:O1O2…,Ok

执行一次这些元运算所需要的时间分别为  t1t2…,tk

对于给定算法A,所用到的,Oi的运算次数为ei,i=1,2,…,k,

因为ei 是N,I的函数,即:ei= ei(N,I)。

因此:

      

算法的时间的复杂度可从以下三个方面进行分析:

1、最坏情况下的时间复杂度

2、最好情况下的时间复杂度

3、平均情况下的时间复杂度

一般情况下,我们研究算法是研究其最坏情况下的时间复杂度。最好情况下的时间复杂度是在特例情况下发生的,不具有代表性。如果能保证最坏情况下的效率是理想的,对于问题的解决才是有意义的。

非递归算法一般从以下四个方面来分析:
(1)for/ while 循环
循环体内计算时间*循环次数;
(2)嵌套循环
循环体内计算时间*所有循环次数;
(3)顺序语句
各语句计算时间相加;
(4)if-else语句
if语句计算时间和else语句计算时间的较大者。
例如:(插入排序算法)

template<classType>

voidinsertion_sort(Type *a, intn)

{

    Type key;                                      //  cost        times

    for (int i = 1; i< n; i++){                 //   c1          n  

          key=a[i];                                  //   c2          n-1

          int j=i-1;                                   //   c3          n-1

          while( j>=0 && a[j]>key){       //    c4          sum of ti

   a[j+1]=a[j];                          //    c5          sum of (ti-1) 

   j--;                                       //   c6          sum of (ti-1)

   }

         a[j+1]=key;                              //   c7          n-1

        }

}

最坏情况下时间复杂度为:O(n*ti)

最好情况下时间复杂度为:O(n)#这是在原来排好序的情况下

因此时间复杂度:O(n的平方)

本文为算法复习第一篇,也是算法迅速提升的开始。不足之处,日后改之。

原创粉丝点击