数据结构与算法(绪论)

第一章绪论

基本概念和术语

一、数据与数据结构

数据:所有能输入到计算机中,且能被计算机程序处理的符号的总称。是计算机操作的对象的总称。是计算机处理的信息的某种特定的符号表示形式

数据元素:是数据(集合)中的一个个体”,是数据结构中讨论的基本单位。可由若干个数据项组成。

数据项:是数据结构中讨论的最小单位。数据元素可以是数据项的集合。

数据对象:是性质相同的数据元素的集合,是数据的一个子集。

数据结构:带结构的数据元素的集合。是相互之间存在一种或多种特定关系的数据元素的集合。

不同的“关系”构成不同的“结构”。

数据结构是相互之间存在着某种逻辑关系数据元素集合

数据的逻辑结构可归结为一下四类:

线性结构:有唯一前驱和后继

树形结构:一对多

图状结构或网状结构:多对多

集合结构:无关系

特殊的集合结构:键值对

数据结构的形式定义为:

数据结构是一个二元组:Data_Structures = (D,S)

其中D是数据元素的有限集,SD上关系的有限集。

数据的存储结构:逻辑结构在存储器中的映像

关系的映像方法:(表示<x, y>的方法)

顺序映像:以相对的存储位置表示后继关系。整个存储结构中只含数据元素本身的信息。

链式映像:以附加信息(指针)表示后继关系。需要用一个和x在一起的附加信息指示y的存储位置。

在不同的编程环境中,存储结构可有不同的描述方法。当用高级程序设计语言进行编程时,通常可用高级编程语言中提供的数据类型描述之。

二、数据类型

不同类型的变量,所能取的值的范围不同,所能进行的操作也不同

三、抽象数据类型(Abstract Data Type简称ADT

是指一个数学模型以及定义在此数学模型上的一组操作。

ADT有两个重要特征:

数据抽象:用ADT描述程序处理的实体时,强调的是其本质的特征、其所能完成的功能以及它和外部用户的接口(即外界使用它的方法)

数据封装:将实体的外部特征和其内部实现细节分离,并且对外部用户隐藏其内部实现细节。

抽象数据类型的描述方法:

抽象数据类型可用(D,S,P)三元组表示。D是数据对象,SD上的关系集,P是对D的基本操作集。

多形数据类型:是指其值成分不确定的数据类型。

抽象数据类型的表示和实现

抽象数据类型需要通过固有数据类型(高级程序设计语言中已经实现的数据类型来实现)

四、算法和算法分析

算法是为了解决某类问题而规定的一个有限长的操作序列。一个算法必须满足以下五个重要特性:

  1. 有穷性:

对于任意一组合法输入值,在执行有穷步骤之后一定能结束。即:算法中的每个步骤都能在有限时间内完成。

  1. 确定性

对于某种情况下所执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含义及如何执行。并且在任何条件下,算法都只有一条执行路径,不允许有二义性。

  1. 可行性

算法中的所有操作必须足够基本,都可以通过已经实现的基本操作运算有限次实现之。

  1. 有输入

作为算法加工对象的量值,通常体现为算法中的一组变量。

  1. 有输出

它是一组与输入有确定关系的量值,是算法进行信息加工后得到的结果,这种确定关系即为算法的功能。

算法设计的原则:

  1. 正确性

满足以特定“规格说明”方式给出的需求

  1. 不含语法错误
  2. 输出满足要求的结果
  3. 精心选择、典型、苛刻且刁难性样例给出结果
  4. 一切样例给出结果

C是衡量算法是否合格标准

  1. 可读性

易于人的理解

  1. 健壮性

输入数据非法,能给出相应的处理。处理出错的方法不应只是中断程序的执行,而是返回一个表示错误或错误性质的值。

  1. 高效率与低存储量需求

效率是指算法执行时间,存储量是指所需最大存储空间。

算法效率的度量

事后统计法:

缺点:1.必须执行程序2.其他因素掩盖算法本质

事前分析估算法

和算法执行时间相关的因素:

  1. 算法选用的策略
  2. 问题的规模
  3. 编写的语言
  4. 编译质量
  5. 计算机速度

一个特定算法“运行工作量”只依赖于问题的规模(通常用n表示)它是问题规模的函数。

算法执行时间增长率和f(n)的增长率随n增长相同。T(n) = O(f(n))

T(n)为算法(渐进)时间复杂度

如何估算算法的时间复杂度?

算法=控制结构+原操作

算法执行时间=Σ原操作执行时间x原操作执行次数

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

冒泡排序可优化到nlogn

多项式时间问题P问题

算法的存储空间需求

S(n)=O(g(n))表示随着问题规模n的增大,算法运行所需存储量的增长率与g(n)的增长率一样

算法的存储量包括:

  1. 输入数据2.程序本身3.辅助变量

若输入数据所占空间只取决于问题本身,和算法无关,则只需要分析除输入和程序之外的辅助变量所占额外空间。

若所需额外空间相对于输入数据量来说是常熟,则称此算法为原地工作。

若所需存储量依赖于特定的输入,则通常按最坏情况考虑。

猜你喜欢

转载自www.cnblogs.com/lightac/p/12817043.html