关闭

[数据结构与算法] 2,算法

155人阅读 评论(0) 收藏 举报
分类:

1 算法

算法是解决特定问题的求解步骤描述,在计算机中表现为有限的指令序列,每个指令代表一个或者多个操作。


2 选择一门好算法的重要性

问题:求1+2+3+...+100的结果。

方法1:for循环1到100。f(n) = n

int i ,sum = 0;
for (i=1;i<=100;i++) {
  sum+=i;
}
方法2: f(n) = 1


这两种方式对比,结果显而易见,方法2只需要一行代码便可以实现。选择一门好的算法对于程序运行的高效性至关重要。

3 算法的基本特性:输入,输出,有穷,确定,可行

3.1 输入输出:算法具有任意个输入,但是具有至少一个输出,输出包括打印或者返回值。

3.2 有穷:算法执行完有限步骤之后,自动结束而且不会出现死循环,并且每个步骤在可接受的时间内完成。

3.3 确定:算法的每个步骤都具有确定的含义。

3.4 可行:算法的每一步都是可行的,并且执行完成之后得到正确的结果。


4 算法的设计要求

4.1 正确:算法的正确性指算法应该至少具有输入,输出和加工处理无歧异性,能够正确反映问题的需求,能够得到问题的正确答案。

4.2 可读性:算法设计同时也要便于阅读,交流以及理解。

4.3 健壮性:一个好的算法应该同时还能够对不合法的输入做出合适的处理,比如输入的时间跟距离不应该是负数。而不是产生莫名其妙的输出结果。

4.4 时间效率低存储量低:如果多个算法都能够解决同个问题,那么应该优先选择时间花费少的那个以及执行过程中占用存储空间少的算法。

      时间效率:算法的执行时间。存储量:算法执行过程需要的存储空间。


5 算法效率的度量方法

算法的描述:


事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算。一般算法消耗的时间取决于以下因素:

5.1 算法采用的策略,方法;(根本)

5.2 编译产生代码的质量;(软件的有关因素)

5.3 问题的输入规模;

5.4 机器执行指令的速度。(硬件有关因素)

抛开软硬件因素,我们可以知道算法的效率跟问题输入规模以及算法的好坏有十分紧要关系。

测试算法运行时间就是计算对运行时间由消耗的基本操作的执行次数,运行时间跟执行次数成正比。(不计循环索引的递增和循环的终止条件,变量的声明,打印语句)

于是我们将基本操作的执行次数表示成输入规模的函数。如下图:


6 函数的渐近增长


当n=4之后,算法4n+8的执行次数少于2n^2+1,我们就说,当n=4,算法C的渐近增长慢于D。

函数的渐近增长:给定函数f(n),g(n),如果存在整数N,当n>N, g(n)>f(n),我们说g(n)的渐近增长快于f(n)



我们可以知道判断一个函数的执行效率的时候,我们主要关于主项,也可以忽略与最高次项相乘的常数,也就是最高次项。


7 算法的时间复杂度

7.1 算法的时间复杂度,也就是算法的时间量度,记做T(n)=O(f(n)),它表示随着问题规模的n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度,其中f(n)是问题规模的某个函数。这样O()来体现时间复杂度,我们称作大O记法。


7.2 推导时间复杂度


7.3 常数阶 O(1)


7.4 线性阶 O(n)

int i ,sum = 0;
for (i=1;i<=100;i++) {
  sum+=i;
}
7.5 对数阶 O(log2n), 2^x=n -> x=log2n


7.6 平方阶 O(n^2)

7.7 时间复杂度计算方法示例


8 常见的时间复杂度



9 最坏情况和平均情况

最坏情况是运行时间的保证,运行时间不可能超过最坏情况,这也是一个重要的需求,通常除非特别指定,不然我们所说的都是最坏情况。

平均运行时间在所有情况中最有意义,他是期望的运行时间,但是实际中很难分析得出。

10 算法的空间复杂度

有时候,我们常常可以用空间来换取时间,通过耗费更大的内存空间来换取更少的运行时间。

算法的空间复杂度是通过计算算法所需的空间。计算公式:S(n) = O(f(n)),n为问题的规模,f(n)是关于n的所占空间存储的函数。

算法分析主要还是时间复杂度。









0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:27734次
    • 积分:603
    • 等级:
    • 排名:千里之外
    • 原创:21篇
    • 转载:79篇
    • 译文:0篇
    • 评论:1条
    最新评论