1.1基本概念
为什么要学习数据结构与算法?
Algorithms+Data Structures=Programs---- Niklaus Wirth ( Pascal程序设计语言之父、结构化程序设计首创者、图灵奖获得者)
- 计算机程序:使用计算机求解问题
- 算法是求解问题的步骤的描述:从蛮力到策略
- 数据结构是数据的组织与存储:从杂乱无章到井然有序
主要内容
按章节划分:
- 基本概念与复杂度分析
- 线性表、栈和队列
- 查找、排序与分治递归
- 树和二叉树
- 图与贪心算法
- 动态规划
按内容划分:
- 数据结构
- 线性结构:线性表、栈和队列
- 树:树和二叉树
- 图
- 算法分析
- 时间复杂度
- 算法设计策略
- 分支递归
- 贪心算法
- 动态规划
计算机问题
A task to be performed by computers(需要计算机解决的任务)
Problems Mathematical function from inputs to matching outputs. (输入到对应输出的一个数学函数)
A particular input must always result in the same output every time the function is computed
(每次同样的输入计算机给出同样的输出)
计算机问题求解步骤
- 算法是解决问题的方法
- 理解问题
- 设计算法前做的第一件事情
- 仔细阅读问题的描述
- 提出疑问
- 手工处理一些实例
- 考虑特殊情况
- 确定输入
- 抽象出问题,用数学表达式描述
- 了解计算设备的性能,确定计算方法
- 顺序算法
- 并行算法
- 选择精确解和近似解
- 某些重要的问题无法求得精确解
- 某些问题求精确速度慢,无法接受
- 确定适当的数据结构
- 算法+数据结构=程序
- 算法设计策略
- 使用算法解题的一般性方法用于解决计算领域的多种问题
- 设计并描述算法
- 自然语言
- 为代码
- 流程图
- 证明算法的正确性
- 证明对于每一个合法的输入,该算法都会在有限的时间内输出一个满足要求的结果。
- 一般方法:数学归纳法
- 证明算法的正确性与不正确哪一个更容易?
- 分析算法
- 算法有两种效率:时间效率和空间效率
- 算法的另外两种特性:简单性和一般性
- 为算法写代码
- 用计算机程序实现算法
- 在把算法转变为程序的过程中,可能会发生错误或者效率非常低
作为一种规律,一个好的算法是反复努力和重新修正的结果
-
计算机算法设计是一个最优性问题:对于给定的问题需要花费多少力气(资源)?
-
是不是每个问题都能够用计算机算法来解决?
发明或者发现算法是一个非常有创造性和非常值得付出的过程!!!!!!
常见的计算机问题
- 排序(Sorting)
- 查找(Search)
- 串处理(String)
- 图问题(Graph)
- 组合问题(Combination)
- 几何问题(Geometry)
- 数值问题(Numerical)
什么是算法?
- 算法是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。
算法的几个要点
- 算法的每一个步骤都必须清晰、明确。
- 算法所处理的输入的值域必须仔细定义。
- 同样的一个算法可以用几种不同的形式来描述
- 可能存在几种解决相同问题的算法
- 针对同一个问题的算法可能会基于完全不同的解题思路,而且解题速度也会有明显的区别。
算法的特征
- 输入(input):算法有零个或多个输入量;
- 输出(output):算法至少产生一个输出量;
- 确定性(definiteness):算法的每一条指令都有确切的定义,没有二义性;
- 有穷性(diniteness):算法必须总能在执行有限步之后终止。
程序与算法的比较
- 计算机程序是算法用某种程序语言的一个具体表示(实现)一个Java程序和一个C程序可能是用同样的方法解决同一个问题,这两个语言的表达的就是同一个算法
- 计算机程序是用来给计算机读的
- 而算法是给人来读的,直接将算法输入计算机是不能运行的
- 程序可以不满足算法的有穷性
算法设计的目标
- 用计算机解决相应的计算机问题
- 在规定的资源限制下将问题给解决
- 两个矛盾的目标
- 容易理解,编码,调式
- 有效利用计算机资源
算法设计的策略
-
Exhaustive search (穷举搜索)
-
Greedy method(贪心法)
-
Divide-and-conquer (分而治之)
-
Dynamic programming (动态规划)
-
Back tracking (回溯法)
-
Branch-and-bound (分支定界法)
…
数据结构
数据结构的例子
线性结构(线性表)
树形结构
网状结构(图)
数据结构基本概念和术语
- **数据(Data) :**是客观事物的符号表示。在计算机科学中指的是所有能输入到计算机中并被计算机程序处理的符号的总称。
- **数据元素(Data Element) :**是数据的基本单位,在程序中通常作为一个整体来进行考虑和处理。
- 一个数据元素可由若干个**数据项(Data Item)**组成。数据项是数据的不可分割的最小单位。数据项是对客观事物某一方面特性的数据描述。
- **数据对象(Data Object):**是性质相同的数据元素的集合,是数据的一个子集。如字符集合C={’A’,’B’, ‘C’,…} 。
什么是数据结构
数据结构(Data Structure):是指互相之间具有(存在)一定联系(关系)的数据元素的结合。元素之间的相互联系(关系)称为逻辑结构。数据元素之间的逻辑结构有四种基本类型
- **集合:**结构中的数据元素除了“同属于一个集合”外,没有其它关系。
- **线性结构:**结构中的数据元素之间存在一对一的关系。
- **树型结构:**结构中的数据元素之间存在一对多的关系。
- **图状结构:**结构中的数据元素之间存在多对多的关系。
逻辑结构
- 数据元素之间的关系可以是元素之间代表某种含义的自然关系,也可以是为处理问题方便而人为定义的关系,
- 这种自然或人为定义的 “关系”称为数据元素之间的逻辑关系,相应的结构称为逻辑结构。
物理结构
物理结构包括数据元素的存储和元素之间的关系的表示。
元素之间的关系在计算机中有两种不同的表示方法:顺序表示和非顺序表示。由此得出两种不同的存储结构:
**顺序存储结构:**用数据元素在存储器中的相对位置来表示数据元素之间的逻辑结构(关系)。
链式存储结构:在每一个数据元素中增加一个存放另一个元素地址的指针(pointer),用该指针来表示数据元素之间的逻辑结构(关系)。
-
顺序结构:数据元素存放的地址是连续的;
-
链式结构:数据元素存放的地址是否连续没有要求。
数据的逻辑结构和物理结构是密不可分的两个方面,一个算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的存储结构。
在C语言中,用一维数组表示顺序存储结构;用结构体类型表示链式存储结构。
数据结构的三个组成部分
- 逻辑结构: 数据元素之间逻辑关系的描述
- 存储结构: 数据元素在计算机中的存储及其 逻辑关系的表现称为数据的存储结构或物理结构。
- 数据操作: 对数据要进行的运算。