数据结构与算法(入门笔记) 第一部分 了解数据结构与算法

数据结构与算法是什么

(1)问题抽象

(2)存储结构设计与优化(数据结构)

(3)解决思路设计与优化(算法)

将生活中的实际问题,抽象为问题模型,经过不断的精化,用计算机实现问题求解

是研究数据的组织、存储和运算的一般方法的课程

数据:信息的载体,能被计算机识别、存储和加工处理的符号总称

从问题到程序

而抽象的问题模型分为:易于理解但不严格的需求模型,较为抽象但很精确的数学模型,易于计算机理解或执行的实现模型

程序就是使用程序设计语言精准描述的实现模型,而将一个实际问题转化为一个正确的求解程序,一般分为以下几个阶段:

对应(1)问题分析与抽象

分析阶段:弄清用户需求,对用户需求进行深入分析,使用规范说明语言(数学语言等)给出需求模型(或数学模型)

对应(2)(3)程序的设计与实现

选择算法、选择抽象数据类型——>实现算法描述(粗略)、数据结构设计实现抽象数据类型——>算法的精化和代码的生成

设计阶段:建立实现模型,重点是算法的设计和数据结构的设计。对于大型、复杂的系统,还包括抽象数据类型或模块的设计。一般设计过程是从粗到细,需经过多次精化

编码阶段:采用适当的程序设计语言(C、C++或JAVA等)把设计阶段的成果编写成可执行的程序

调试和维护:使用足够的例子调试编写的程序,发现和排除程序代码中的错误;在计算机上执行得到解;也包括在系统投入运行后,解决发现的隐藏错误和使用中的要求进行维护和完善

抽象数据类型

类型:(type)是一组值(或对象)的集合

数据类型:(data type)是指在计算机(语言)中可以使用的一个类型,不仅包括这个类型值的集合,还包括定义在一个类型上的一组操作

抽象数据类型:(Abstract Data Type ,ADT)可以定义为具有一定行为(操作)的抽象(数学)类型

抽象数据类型:三元组(D,S,P)

D:数据元素集合

S:D中元素的关系集合

P:D中元素的基本操作集合

ADT 抽象数据类型名 is

{ 数据对象:〈数据对象的定义〉D = {(c1, c2) | c1, c2 | R}

数据关系:〈数据关系的定义〉S = {<c1, c2>}

基本操作:〈基本操作的定义〉void Assign(*A, c1, c2)

​ ……

} ADT 抽象数据类型名称

抽象数据类型的实质是抽象出数据类型的要求,而把它的具体表示方法和运算的实现细节都隐藏起来,允许独立地考虑数据类型的外部接口和内部实现

从问题求解(使用者)的角度来看,抽象数据类型仅仅规定了数据类型应该具有的行为(操作)

这让应用程序只要按抽象数据类型的接口统一其使用界面,不管它如何实现,也不管它是否实现

对于系统的分解、设计、维护和修改均有好处

数据结构

什么是数据结构

可理解为 计算机中表示(存储)的、具有一定逻辑关系和行为特征的一组数据-> “抽象数据类型的物理实现”

解决问题:一选择存储结构,二是实现抽象数据类型中的各种操作

数据结构的三个核心要素:

逻辑结构:定义了数学模型中的基本元素(结点)和元素之间的相互关系

存储结构:给出了数学模型的具体表示方式,包括结点的表示和关系的表示

操作:给出抽象数据类型关系的各种行为存储结构上具体实现算法 ->算法

如何根据抽象数据类型的需要选择适当的存储结构,使得主要运算的开销在时间和空间(主机运行时间和内存存储空间)的权衡中达到最佳效果,这是数据结构研究的核心问题

数据结构的分类

一般根据逻辑结构和存储结构来分类

按逻辑结构分类

线性结构

每个结点最多只有一个前驱和一个后继

线性表、串、栈、队列等都是线性结构(一般来说,对于线性结构,开始结点和终端结点都可以不是唯一的 指在动态操作中)

树形结构

每个结点最多只有一个前驱,但可有多个后继

二叉树、树和森林等都是树形结构(一般来说,对于树形结构,开始结点和终端结点都可以不是唯一的 指在动态操作中)

复杂结构

结点的前驱、后继结点个数不做要求

有向图、无向图和网络等都是复杂结构

集合结构

结点之间没有任何关系

上述逻辑结构之间具有以下包含关系:

集合结构线性结构树形结构复杂结构

按存储结构分类

各种逻辑结构在计算机中的存储或表示,主要包括结点的表示和关系的表示

设计目的:使用较少空间记录逻辑结构的必要信息,并能有效实现抽象数据类型汇中要求的操作

顺序表示

用一个连续的空间顺序存放数据结构中的各个结点

链接表示

结点的存放位置是任意的,结点之间的关系通过与结点关联的指针(或引用)方式显式表达出来

散列表示

又称关键码-地址转换法 选择适当的散列(杂凑)函数,根据关键码的值将结点映射到给定的存储空间(散列表)中

索引表示

类似散列,但是是通过建立辅助的索引结构解决,是由索引项组成的结构,每个索引项包含一个结点的关键码和该结点的存储位置

存储结构不一定非要是四者之一,也有可能是其中几种的组合

算法

什么是算法

由有穷规则构成的为解决某一类问题的运算序列(方法或过程)

分为:算法特性、算法的设计与描述、算法性能分析与度量

算法特性

算法具有以下性质:

有0个或多个输入、至少有1个输出

有穷性:一个算法必须在执行了有穷步之后结束,且每步要在可接受时间内完成

确定性:每一步必须有确切的定义,无二义性;相同的输入应得到相同的结果

可行性:算法可行,能够转换为程序语言运行

算法的设计

目标:正确性、可读性、健壮性、高效性(时空效率)

算法的正确性:如果一个算法以一组满足初始条件的输入开始,那么该算法的执行一定会终止,并且在终止时得到满足要求的(输出)结果

(算法程序无语法错误、对合法的输入能产生满足要求的输出、对非法输入能得到提示、对任意数据有满足要求输出)

(便于阅读、理解和交流)

(不合法数据的输入,能做出相关处理,而不是崩溃或莫名其妙的结果)

(时间效率高、存储空间少)

以下为几种常用的算法设计方法:

贪心法:目的是求最优解,那么将整个问题的求解分解成若干个小问题来求解,在每个小问题都看成为最优解问题,以期望通过各小问的局部最优选择到达整体最优

分治法:分而治之(自顶向下) 把一个大的问题分解成若干个与原问题相似的若干子问题,先对子问题进行求解,再把各子问题的解合并起来,得出整个问题的解

回溯法:(深度优先策略)采用一步一步向前试探的方法,当一步有多个选择时,任选一个可行的继续向前,一旦发现到达某步后无法向前,说明之前的选择可能存在问题,就可以后退,回到上一步重新做选择

动态规划法:类型于分治法(自下向上) 分解的子问题可能比较多,且子问题相互包含,为了重用已经计算的结果,要把计算的中间结果保存起来

分支界限法:(广度优先策略)类似于回溯法 在搜索过程中,还利用了最优解属性的上下界来控制搜索的分支,剪去不必再花时间搜索的部分,从而提高搜索的效率

算法的分析

算法效率度量的方法:

1.事后统计:通过好的测试数据和程序,利用计算机计时器对不同算法程序进行运行时间的比较

2.事前分析估算:计算机程序编译前,依据统计方法进行估算

程序在计算机上运行时间取决于:

算法策略:是算法好坏的根本

编译产生的代码质量:取决于软件的支持

问题的输入规模

机器执行指令的速度:取决于硬件

去除软硬件因素,分析算法主要是看它的 运行算法所要花费的时间 和 算法中使用的各种数据占有的空间 称之为算法的时间代价和空间代价,在该课程学习中仅考虑最坏情况下的代价即可

算法的“运行工作量”是问题规模的函数

计算规则

加分规则:
T ( n ) = T 1 ( n ) + T 2 ( n ) = O ( f 1 ( n ) ) + O ( f 2 ( n ) ) = O ( m a x ( f 1 ( n ) , f 2 ( n ) ) ) T(n)=T1(n)+T2(n)=O(f1(n))+O(f2(n))=O(max(f1(n),f2(n))) Tn=T1(n)+T2(n)=O(f1(n))+O(f2(n))=O(max(f1(n),f2(n)))
乘法规则:
T ( n ) = T 1 ( n ) ∗ T 2 ( n ) = O ( f 1 ( n ) ) ∗ O ( f 2 ( n ) ) = O ( ( f 1 ( n ) ∗ f 2 ( n ) ) ) T(n)=T1(n)*T2(n)=O(f1(n))*O(f2(n))=O((f1(n)*f2(n))) Tn=T1(n)T2(n)=O(f1(n))O(f2(n))=O((f1(n)f2(n)))
选择规则:
T ( n ) = m a x ( T 1 ( n ) , T 2 ( n ) ) = O ( m a x ( f 1 ( n ) , f 2 ( n ) ) ) T(n)=max(T1(n),T2(n))=O(max(f1(n),f2(n))) Tn=max(T1(n),T2(n))=O(max(f1(n),f2(n)))
推导大O阶时间复杂度方法

从算法中选取一种对于所研究的方法来说是 基本操作 的原操作;以该基本操作在算法中重复执行的次数作为算法运行时间的衡量标准

(1)用常数1取代进行时间中的所有加法常数

(2)在(1)结果中,只保留最高阶项

(3)最高阶项如果存在,且不是1,则去掉其系数

注意:

if-else结构的复杂度取决于if的条件判断复杂度和两个分支部分的复杂度,总体复杂度取三者中最大

for循环的时间复杂度等于循环次数乘以循环体内代码的复杂度

logan=lg n/lg a=lg n (换底公式)

等差数列Sn=n* (a1+an)/2=n * a1+n* (n-1)* d/2

等比数列Sn=a1* (1-qn)/1-q

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值