算法 (一) 算法与算法分析

时间:2021-05-22 11:10:42

前言

Algorithms +  Data Structures = Programs  //N.Wirth 1976

任何一个算法的设计取决于选定的数据(逻辑)结构,而算法的实现依赖于采用的存储结构。

虽然大一大二学了数据结构和很多算法,但是一到用的时候就经常想不起来...,而且明年就要考研了,为了能让自己更系统的掌握,决定要全面的学习一下,为以后打好基础!!!

一、概念

计算 = 信息处理 

借助某种工具,遵照一定规则,以明确而机械的形式进行

计算模型 = 计算机 = 信息处理工具

算法:即特定计算模型下,旨在解决特定问题的指令序列

二、特征

输入:待处理的信息(问题)

输出:经处理的信息(答案)

正确性:的确可以解决指定的问题

确定性:任一算法都可以描述为一个由基本操作组成的序列

可行性:每一基本操作都可实现,且在常数时间内完成

有穷性:对于任何输入,经有穷次基本操作,都可以得到输出

三、评定(算法的好坏)

正确:符合语法,能够编译、链接,并且能够正确处理各种类型的输入

健壮:能辨别不合法的输入并做适当的处理,而不致非正常退出

可读:结构化 + 准确命名 + 注释 + ......

效率:速度尽可能快;存储空间尽可能少

四、算法效率的度量

度量算法通常有两种方法:

1)事后统计的方法(依赖于计算机的硬件,软件等环境因素,故一般不采用)

2)事前分析估算的方法

  1.依赖算法采用何种策略

  2.问题分规模

  3.书写程序的语言

  4.编译程序所产生的机器代码的质量

  5.机器执行指令的速度

通常一个算法用不同语言,或者用不同的编程程序进行编译,或者在不同的计算机上运行,效率均不相同,这表明用绝对的时间单位来衡量算法的效率是不对的,应该撇开计算机硬件、软件有关的因素,一般可以认为一个特定算法的"运行工作量"的大小只依赖于问题的规模(通常用n表示)。

算法由控制结构和原操作所构成,为了比较同一问题的不同算法,通常的做法是从算法中选取一种对于该问题是基本操作的原操作,以原操作重复执行的次数(f(n))作为算法的时间量度,常用大O表述,记作:

  T(n) = O(f(n))

他表示随着问题的规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度

不同数量级的时间复杂度的增长速度

算法 (一) 算法与算法分析

层次级别

算法 (一) 算法与算法分析

五、算法的存储空间的需求

类似于时间复杂度的讨论,一个算法的空间复杂度S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。渐近空间复杂度也常常简称为空间复杂度。以空间复杂度作为算法所需存储空间的量度,记作:

  S(n) = O( f(n) )

一个算法在计算机存储器上所占用的存储空间包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。存储算法本身所占用的存储空间由代码长短决定,想节省这方面的存储空间,就需要把代码尽量写短。算法的输入输出数据所占用的存储空间只由问题本身决定,不由算法决定。算法在运行过程中临时占用的存储空间随算法的不同而异,有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,我们称这种算法是原地工作的,是节省存储的算法,有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如快速排序和归并排序算法就属于这种情况。