您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法 - 绪论上

2016-09-20 20:50 411 查看

1.计算机

1.引言

Dijstra原话摘引,计算机无非就是计算工具而已
使我们使用的可以重复的,机械的,为了完成目的而使用的工具(当然每个工具都有自己的能力范围)

2.算法

所谓计算机算法,无非就是我们的计算过程:某种工具按照某种一定的规则,明确机械的重复某一些过程,即我们认为的解决问题的一些指令序列(特定的计算模型)
大致分为以下几个步骤:
1.输入(问题实际描述)
2.输出(对问题的解释)
3.正确性:一个算法我们只有认可了正确性的条件下,我们才可以正确的使用
4.可行性:对于每个基础操作,我们必须要认定其每个操作在常数时间内完成,并且整个算法必须可以兑现,可以有有限多个操作步骤组合而成
5.有穷性:整个算法中包含有穷个步骤

对于有穷性而言,我们引出Hailstone问题
Hailstone(n):
{1}  n<=1
{n} & Hailstone(n/2)   n为偶数
{n} & Hailstone(3*n+1)    n为奇数
很遗憾,我们目前还不能证明Hailstone是一个算法,因为我们我发证明对于任意的输入,我们都可以在有限地步骤内完成

所以说,我们这里引出了  Programm != Algorithm 的概念,因为我们可以随随便便的设计出不满足算法条件的程序来,但是对我们来说,有时候还是有用的

3.好的算法

一个好的算法:
1.输入:简单,大规模,一般性或者任意的合法输入我们都可以给出正确的结果
2.健壮性:对于不正确的输入,我们依然可以给出提示并正确退出
3.效率:我们要求我们的算法便携的程序有速度快,占用空间少的特性

2.计算模型

对于一个特定的算法我们一般只会考虑两部分:正确性,算法的成本
在这里,算法的成本只有两点,时间成本和空间成本,但是实际上,我们一般都不会考虑算法的空间成本,我们都重点关注算法的时间成本,也就是我们的 算法运行的效率
这里我们定义:
Ta(p):算法A求解问题示例p的计算成本  = 》T(n)求解问题的所需要的成本
为了稳妥起见,我们一般只关注成本提高的最坏的情况T(n) = max{T(p) | p = n}

1.Turing Machine

1.tape:无限长的纸袋,纸袋上有大量的格子,每个格子初始字符自己约定,比如我们约定为'#'
2.Alphabet:字符表,有限的字符表我们来修饰tape纸袋
3.head:读写头
4.state:TM总是处在悠闲中的状态中,读写头的每一次移动和读写都会造成我们的状态的转移
5.转移函数:包含但浅的状态,指向的格子的状态,即将读写的字符,移动的方向,以及下一次我们要转移的状态(特定的状态用来表示停机)

2.RAM(Random Access Machine)

顺序存储寄存器,无限的空间
包含大量的基本操作,例如:赋值,间接取值,简单的+,-运算,条件判断语句,终止语句

通过上述的两种计算模型,我们可以大致的将算法的运行时间抽象成我们算法的基本的操作次数,也就转化成了我们对基本的操作此时的求和的估算

3.Big-O and other charater for our analyse

算法的分析忽略常系数,忽略低阶项,保留高阶项

1.Big-O标记

基本上,随着问题的规模的上升我们的计算的成本也是不断的成正比上升(通常的情况下)
渐进分析 n>>2,算法的基本的操作次数T(n),算法的占用内存的存储单元S(n)
T(n) = O(f(n))
该含义是:存在c>0,当n>>2时,T(n)<c*f(n)
从函数的定义来看,我们发现,实际上O标记也就是我们的悲观的估计,但是他给出了我们算法的upper bound,也就是确定了我们算法最坏的情况,从而方便我们进行判断

2.Big-omega标记

定义:存在c>0,当n>>2,T(n)>c*f(n)
和上面的对应来看,其实omega标记实际上是我们的最乐观的估计,我们给出了我们算法的low bound,也就是说我们确定了我们算法的最低效率

3.Big-Sita标记

简而言之,就是上面的联众标记的综合,我们用确定的形式确定了我们的算法的实际的准确的运行增长

4.常见的复杂度

1.O(1):最理想的时间复杂度。此类算法的效率是最高的,只要程序中没有显示或者隐式的出现循环分支调用,递归的程序我们都可以认为是理想的时间复杂度,当然,也并不是说,出现了就不是O(1)是啊金复杂度的算法

2.O(lgn):对数或者对数的多项式的时间复杂度,其实我们在这里也是只考虑常系数和高阶项
此类算法的复杂度无限的接近于常数

3.O(n^c):多项式时间复杂度,我们在估算的时候,我们只去最高阶项,其中的O(n)表示我们的线性的时间复杂度

下面的复杂度算法称之为无效的算法,因为算法的时间成本增长的速度我们无法忍受
4.O(2^n)
n^c=O(2^n)(不可忍受的时间成本)
对于我们已经确定的NP问题,是不存在多项式时间复杂度的解的,但是只有在我们施加了约束条件之后,才有可能我们对问题进行合理的优化
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: