数据结构与算法Python版学习笔记(一)——概述


一、问题求解的计算之道

基于有穷观点的能行方法:

  • 有限数量的明确有限指令构成;
  • 指令执行在有限步骤后终止;
  • 指令每次执行都总能得到唯一结果;
  • 原则上可以由人单独采用纸笔完成,而不依靠其它辅助;
  • 每条指令可以机械地被精确执行,而不需要智慧灵感

关于“计算”的数学模型:

  • 哥德尔和克莱尼的递归函数模型
  • 丘奇的Lambda演算模型
  • 波斯特的Post机模型
  • 图灵的图灵机模型

注:

  • 研究证明,这几个“基于有穷观点的能行方法”的计算模型,全都是等价的
  • 虽然希尔伯特的计划最终被证明无法实现,但“能行可计算”概念成为计算理论的基础

二、图灵机计算模型

图灵机Turing Machine基本概念:

  • 基本思想是用机器模拟人们用纸笔进行数学运算的过程,但比数值计算更为简单
  • 在纸上写上擦除某个符号;
  • 注意力从纸的一个位置转向另一个位置;
  • 在每个阶段,要决定下一步动作依赖于此人当前所关注的纸上某个位置的符号此人当前思维的状态

图灵机的基本定义:
图灵机由以下几部分构成:

  • 一条无限长的分格纸带,每格可以记录1个符号
  • 一个读写头,可在纸带上左右移动,能读出和擦写格子的字符
  • 一个状态寄存器,记录有限状态中的1个状态
  • 一系列有限的控制规则:某个状态,读入某个字符时:要改写成什么字符;要如何移动读写头;要改变为什么状态

一个图灵机实例:
判定{ambm|m>=0}:左半部全是a,右半部全是b,且ab数量相等的字符串
规则思路:

  • 读写头来回移,将a和b一一对消,如果最后剩下空白B则接受,否则拒绝
  • 初始状态s0是读写头停在第一个字符处
  • s1状态是读写头正在右移
  • s2状态是读写头到字符串最右边
  • s3状态是读写头正在向回左移

判定ambm模式串图灵机的规则:

  • <s0, a, B, s1, R>:初始碰到a消去,s1,右移
  • <s1, a, a, s1, R>:消去1个a的状态,继续右移
    ,找最后一个b
  • <s1, b, b, s1, R>:遇到b,继续右移
  • <s1, B, B, s2, L>:右移到尾,状态s2,回移
  • <s2, b, B, s3, L>:如果有b,消去,进入左移
    状态s3
  • <s3, b, b, s3, L>:左移遇到b,继续左移
  • <s3, a, a, s3, L>:左移遇到a,继续左移
  • <s3, B, B, s0, R>:左移到头回初始状态s0,右移检查下个字符
  • <s0, B, B, sY, N>:a,b都能一一消完,则进入“接受”状态,停机
  • <s0, b, b, sN, R>:b多了,或者b在a前,进入“拒绝”状态,停机
  • <s2, a, a, sN, R>:s2是末尾状态,如果碰到a,表示a多了,或者a在b后,进入“拒绝”状态,停机
  • <s2, B, B, sN, R>: s2是末尾状态,如果没碰到b,表示a多了,进入“拒绝”状态,停机

三、算法和计算复杂性

问题的分类:

  • What:是什么?面向判断与分类的问题,可以通过树状判定分支解决
  • Why:为什么?面向求因与证明的问题,可以通过有限的公式序列来解决
  • How:怎么做?面向过程与构建的问题,可以通过算法流程来解决。(解决问题的过程:算法和相应数据结构的研究,即为本课主要内容)

计算复杂性:

  • 由于资源(时间/空间)相当有限,对于问题的解决需要考虑其可行性如何

  • 定义一些衡量指标,对问题的难易程度(所需的执行步骤数/存储空间大小)进行分类,是计算复杂性理论的研究范围**

  • 计算复杂性理论研究问题的本质,将各种问题按照其难易程度分类,研究各类问题的难度级别,并不关心解决问题的具体方案**

  • 而算法则研究问题在不同现实资源约束情况下的不同解决方案,致力于找到效率最高的方案

  • 存在不可计算问题,有不少定义清晰,但无法解决的问题,如停机问题、不可计算数等

四、突破计算极限

  • 超大规模分布式计算
  • 新型计算技术:光子计算、DNA计算、量子计算
  • 分布式智慧——众包

五、抽象和实现

计算机科学主要研究的是问题、问题解决过程,以及问题的解决方案包括了前述的计算复杂性理论以及对算法的研究
抽象(Abstraction):

  • 为了更好地处理机器相关性独立性,引入了“抽象”的概念
  • 从 “ 逻辑Logical ” 或 者 “ 物理Physical”的不同层次上看待问题及解决方案
  • 例如计算对于一般大众来说就是用来编辑文档、收发邮件、上网聊天、处理照片等等,并不需要具备计算机内部如何处理的知识,利用这些功能是计算机的“逻辑”层次;而对于计算机科学家、程序员、技术支持 、系统管理员来说就必须要了解从硬件结构、操作系统原理到网络协议等各方面的低层次细节,内部如何实现,是计算机的“物理”层次

编程:

  • 编程是通过一种程序设计语言,将抽象的算法实现为计算机可以执行代码的过程
  • 算法+数据结构=程序

程序设计语言实现算法的基本机制:

  • 程序设计语言需要为算法的实现提供实现“过程”和“数据”的机制,具体表现为“控制结构”和“数据类型”
  • 程序设计语言均有语句对应控制结构,包括顺序处理、分支选择、循环迭代
  • 程序设计语言也提供最基本的数据类型来表示数据,如整数、字符等,但对于复杂的问题而言,直接使用这些基本数据类型不利于算法的表达

六、为什么研究数据结构与算法

清晰高效地表达算法:

  • 为了控制问题和问题解决过程的复杂度,利用抽象来保持问题的“整体感”,而不会陷入到过多的细节中去
  • 这要求对现实问题进行建模的时候,对算法所要处理的数据,也要保持与问题本身的一致性,不要有太多与问题无关的细节

ADT抽象数据类型:

  • “过程抽象”启发我们进行“数据抽象”,相对于程序设计语言中基本数据类型,抽象数据类型(ADT:Abstract Data Type)是对数据进行处理的一种逻辑描述,并不涉及如何实现这些处理,抽象数据类型ADT建立了一种对数据的 “封装Encapsulation”,封装技术将可能的处理实现细节隐蔽起来,能有效控制算法的复杂度

  • 数据结构是对ADT的具体实现,同一ADT可以采用不同的数据结构来实现,采用程序设计语言的控制结构基本数据类型来实现ADT所提供的逻辑接口属于ADT的“物理”层次,对数据实现“逻辑”层次和“物理”层次的分离,可以定义复杂的数据模型来解决问题,而不需要立即考虑此模型如何实现

为什么研究和学习算法:

  • 首先,学习各种不同问题的解决方案,有助于我们在面对未知问题的时候,能够根据类似问题的解决方案来更好解决
  • 其次,各种算法通常有较大差异,我们可以通过算法分析技术来评判算法本身特性,而不仅仅根据实现算法的程序在特定机器和特定数据上运行的表现来评判它,即使同一个程序,在不同的运行环境和输入数据的情况下,其表现的差异可能也会很大
  • 在某些情况下,当我们碰到棘手的难题,得能区分这种问题是根本不存在算法还是能找到算法,但需要耗费大量的资源
  • 某些问题解决需要一些折衷的处理方式我们需要学会在不同算法之间进行选择,以适合当前条件的要求
发布了9 篇原创文章 · 获赞 0 · 访问量 1087

猜你喜欢

转载自blog.csdn.net/Divine0/article/details/104783870
今日推荐