码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构与算法笔记 - 绪论

时间:2017-11-07 20:50:40      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:common   存储空间   公式   多项式   dijkstra   view   应用   img   指令   

数据结构与算法笔记 - 绪论

 

1. 什么是计算
2. 评判DSA优劣的参照(直尺)
3. 度量DSA性能的尺度(刻度)
4. DSA的性能度量的方法
5. DSA性能的设计及其优化

x1. 理论模型与实际性能的差异
x2. DSA优化的极限(下界)

 

计算机与算法

计算机科学(computer science)的核心在于研究计算方法与过程的规律,而不仅仅是作为计算工具的计算机本身,因此E. Dijkstra及其追随者更倾向于将这门科学称作计算科学(computing science)。

计算 = 信息处理

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

1. 计算机的本质是计算,计算是寻找对象的规律,并从中找到技巧。计算的目标是高效,低耗。

2. 算法就是借助一定的工具,在一定的规则下,以明确而机械的形式来进行的计算。
算法定义:基于特定的计算类型,旨在解决某一信息处理问题而设计的一个指令序列。

3. 算法需具备以下要素
        输入与输出
                输入(input):对所求解问题特定实例的描述
                输出(output):经计算和处理之后得到的信息,即针对输入问题实例的答案
        确定性和可行性:算法应可描述为由若干语义明确的基本操作组成的指令序列,且每一基本操作在对应的计算模型中均可兑现。
        有穷性:任意算法都应在执行有限次基本操作之后终止并给出输出
        正确性:算法所给的输出应该能够符合由问题本身在事先确定的条件
        退化和鲁棒性:例如算法数据的各种极端的输入实例都属于退化(degeneracy)情况,鲁棒性(robustness)要求尽可能充分地应对此类情况。
        重用性:算法模式可推广并适用于不同类型基本元素的特性

 

证明算法的有穷性和正确性:从适当的角度审视整个计算过程,找出其所具有的某种不变性和单调性
        单调性:问题的有效规模会随着算法的推进不断递减
        不变形:不仅应在算法初始状态下自然满足,而且应与最终的正确性相呼应----当问题的规模缩减到0时,不变性应随即等价于正确性
        例如, 冒泡排序的正确性证明:(不变性)经过k趟扫描交换后,最大的前k个元素必然就位;(有穷性)经过k趟扫描交换后,待求解问题的有效规模将缩减至n-k。

 

好的算法:效率最高(速度尽可能快,存储空间尽可能少)同时又兼顾正确(算法能够正确地解决问题)、健壮(容错性好)、可读(易于阅读)。 类似既要马儿跑的快,又要吃的少。

算法 + 数据结构 = 程序         (算法 + 数据结构) * 效率 = 计算

 

计算模型

1. 一个好的程序不仅要考虑数据结构与算法,还要考虑效率,即:(数据结构+算法)*效率 = 程序 => 应用。

2. 算法分析的两个重要指标 (需要进行度量)
        正确性:算法功能是否与问题一致
        成本:时间消耗与存储空间消耗

3. 定义:T(n) 为一个算法在最坏的情况下所需要操作的步骤。不同算法之间的好坏主要看T(n)的大小,T(n)是屏蔽了计算机硬件差异,语言差异,编译差异等差异之后的理想平台下的运行指标,如大O,大Ω,大Θ等。

4. 一般的计算模型有图灵模型与RAM模型,它们均将算法的运算时间转换成算法执行的基本操作次数。

 

图灵机模型

图灵机的三个组成要件
        1. 有限的字母表: cell中存储的内容
        2. 读写头: 只是当前位置, 可读可写
        3. 状态表: 当前读写头的状态

图灵机状态转换过程 transform(q,c; d,L/R,p)
        q:当前状态
        c:读写头所指cell当前的内容
        d:读写头所指cell改写的内容
        L/R:向左/右移位
        p:读写头转换后的状态

 

技术分享

 

RAM 模型

1. 与图灵机类似,均假设有无限空间
2. 由一系列顺序编号寄存器组成,但总数无限
3. 算法所运行的时间转换成算法运算时的次数

技术分享

 

数据结构

数据结构示意

        数据对象由数据元素组成,数据元素由数据项组成,数据项是最基本的单位
        数据结构指数据对象中数据元素之间的关系
        数据结构主要研究非数值计算程序问题中的操作对象以及它们之间的关系

数据结构的逻辑结构

        集合结构
        线性结构
        树结构
        图结构

数据结构的物理结构

        顺序存储结构
        链式存储结构

数据的运算

        插入
        删除
        修改
        查找
        排序

 

复杂度度量

1. 算法的效率主要看时间消耗与存储空间消耗,这里我们屏蔽存储空间的消耗,仅仅考虑时间的消耗。

2. 大O的定义:T(n)=O(f(n)) ,f(n)为一个函数。当c>0,T(n)<c?f(n),即大O记号表示T(n)的一个上界,其性质为:
        O(n)=O(c?n)
        O(n2+n)=O(n2)

3. 大Ω的定义:T(n)=Ω(f(n)) ,f(n)为一个函数。当c>0,T(n)>c?f(n),即大O记号表示T(n)的一个下界。

4. 大Θ的定义:T(n)=Θ(f(n)) ,f(n)为一个函数。当c1>c2>0,c1?f(n)>T(n)>c2?f(n),即大O记号表示T(n)的一个区间。

5. 大O记号的分类:
        常数类:O(1)=2 or222222 ,有效
        对数类:O(logcn)与常底数、常数次幂无关,复杂度接近常数,有效。
        多项式:O(nc)
        线性:O(n)
        指数:cn=O(2n)任何c均可。成本增长极快,不是有效的。

6. 时间复杂度T(n) :特定算法处理规模为n的问题所需的时间,由于n相同,但T(n)不同,---->简化为:
                                        在规模为n的所有输入中选择时间最长者作为T(n),并以T(n)度量算法的时间复杂度。

7. 渐进时间复杂度:注重时间复杂度随问题规模n的增长的总体变化趋势
        大O记号(T(n)的渐进上界):
                若存在正的常数c和函数f(n),使的对任何n>>2都有: T(n) <= c * f(n),即认为在n足够大之后,f(n)给出了T(n)增长速度的一个渐进上界,记为:T(n) = O( f(n) )

8. 大O记号性质:
对于任一常数 c > 0, 有O( f(n) ) = O( c * f(n) ):在大O记号意义下:函数各项正的常系数可以忽略并等同于1
对于任意常数 a > b > 0,有 O( n ^ a + n ^ b ) = O( n ^ a ):在大O记号意义下:多项式中的低次项均可忽略

9. 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。

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

        一般情况下,一个程序在机器上执行时,除了需要存储程序本身的指令、常数、变量和输入数据外,还需要存储对数据操作的存储单元。若输入数据所占空间只取决于问题本身,和算法无关,这样只需要分析该算法在实现时所需的辅助单元即可。若算法执行时所需的辅助空间相对于输入数据量而言是个常数,则称此算法为原地工作,空间复杂度为O(1)。

        关于O(1)的问题, O(1)是说数据规模和临时变量数目无关,并不是说仅仅定义一个临时变量。举例:无论数据规模多大,我都定义100个变量,这就叫做数据规模和临时变量数目无关。就是说空间复杂度是O(1)。

        当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1);当一个算法的空间复杂度与以2为底的n的对数成正比时,可表示为0(10g2n);当一个算法的空I司复杂度与n成线性比例关系时,可表示为0(n).若形参为数组,则只需要为它分配一个存储由实参传送来的一个地址指针的空间,即一个机器字长空间;若形参为引用方式,则也只需要为其分配存储一个地址的空间,用它来存储对应实参变量的地址,以便由系统自动引用实参变量。

10. 对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。

11. 通常,我们都使用“时间复杂度”来指运行时间的需求,使用“空间复杂度”指空间需求。当不用限定词地使用“复杂度”时,通常都是指时间复杂度。

 

算法分析

1. 算法分析主要有两个任务: 

        正确性

        复杂度

2. 复杂度的分析方法有三种: 

        迭代式算法:级数求和

        递归式算法:递归跟踪 + 递归方程

        猜测 + 验证

3. 算数级数:与末项的平方同阶 

技术分享

4. 幂方级数:比幂次高出一阶 

技术分享

5. 几何级数(a>1):与末项同阶 

技术分享

6. 收敛级数:O(1)

7. 可能未必收敛,但长度有限 

技术分享

8. 循环:一般随着层数的增加指数式增长

9. 递归跟踪分析:检查每个递归实例,累计所需时间(调入语句本身,计入对应的子实例),总和即为算法执行时间。

 

迭代与递归

算法的两种思想方法:分而治之,减而治之。
        分而治之:将一个问题分两个规模大小差不多的子问题。
        减而治之:将一个问题分为一个子问题和一个规模缩减的问题。

 

动态规划

1. 动态规划的目的:
        make it work(递归可以保证)
        make it right(递归可以保证)
        make it fast(迭代可以保证)
2. 递归对于资源的消耗大而且O(n)比较大,然而迭代可以降低对存储空间的使用,有时亦可以降低O(n)
3. 子序列:由原序列中若干个元素,按原来相对次序排列而成的新的序列。
4. 最长公共子序列(longest common subsequence, LCS)是两个序列中,在其相同的子序列中长度最长的那个子序列,可能含有多个。

 

--------------------------------------------------------------------------------

参考 http://blog.csdn.net/horizontalview/article/details/50804801

参考 http://www.cnblogs.com/joh-n-zhang/p/5759226.html

 

数据结构与算法笔记 - 绪论

标签:common   存储空间   公式   多项式   dijkstra   view   应用   img   指令   

原文地址:http://www.cnblogs.com/lsgxeva/p/7800652.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!