数据结构与算法绪论
·课程性质与课程目标
- 课程目的是能够了解计算机所处理的数据对象的特性,掌握数据的表示、组织和处理方法,以便选择合适的数据的逻辑结构、存储结构以及相应的运算,将现实中的问题转化为在计算机内部的表示和处理。
- 课程内容包含:
(1) 掌握各种线性与非线性数据结构的逻辑结构与物理结构的定义、性质和表述方法,熟悉建立在各种数据结构上的常见算法。
(2) 掌握计算机数据处理中的两大常用运算,查找和排序。
·引言
- 著名的瑞士计算机科学家沃斯(N.Wirth)教授曾提出:算法+数据结构=程序;这里的数据结构指的是数据的逻辑结构和存储结构,而算法则是对数据运算的描述。
- 数据结构是研究非数值计算的程序设计问题中,计算机的操作对以及它们之间的关系和操作的一门课程。具体地说,数据结构指的是数据元素之间的逻辑结构、存储结构及其数据的抽象运算。即按某种逻辑关系组织起来的一组数据,再按一定的存储表示方式把它们存储在计算机的存储器中,并在这些数据上定义一系列运算的集合,就叫做一个数据结构。
·基本概念和常用术语
- 数据(data) date,描述客观事物的数、字符以及能输入计算机中并被计算机处理的符号的集合。其实质是信息的载体,信息的物质表示。
- 数据元素(data element),是数据的基本单位。表中的一行,树中的一个节点,图中的一个顶点等都是一个数据元素。数据元素是一个分子,可以由若干个原子,即数据项组成。
- 数据对象(data object),是具有相同性质的数据元素的集合,是数据的子集。
·数据结构包含的内容
- 数据结构是带有结构的数据元素的集合。即数据对象+对象间关系=数据结构
- 结构指的是数据元素之间的相互关系,即数据的组织形式,结构中的数据元素被称为结点。
·数据结构的三个方面 - 数据元素之间的逻辑(抽象)关系,即数据的逻辑结构:
(1) 数据的逻辑结构是从逻辑关系上描述数据的,它与数据的存储结构无关。是独立于计算机的。因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。例如在线性表中,对表中任意一个节点,与之相邻的且在它前面的结点称为直接前趋,这种前趋最多只有一个;与之对应,在此节点之后存在最多一个的直接后继。表中第一个结点没有直接前趋,称为开始结点;表中最后一个结点没有直接后继,称为终端结点。
(2) 数据的逻辑结构可以分为:
① 线性结构:数据元素,即结点之间存在着一对一的关系,且结构中只有一个开始结点与一个终端结点,其余结点有且仅有一个直接前趋和一个直接后继。
② 非线性结构:数据元素之间存在着一对多(树)或多对多(图)的关系。即一个结点可能存在多个直接前趋和直接后继。包括了树、图、网。 - 数据元素及其关系在计算机内的存储表示(映像),亦称为数据的存储结构或物理结构。
(1) 如果各向量,(数据元素具有方向性)按其逻辑关系顺序存储,就称为“顺序存储结构”;
(2) 如果各向量按其指针连接存储在内存中,就称为“链式存储结构”。
(3) 数据的存储结构可以用以下四种方式实现:
① 顺序存储方法:把逻辑上相邻的结点存储在物理位置上也相邻的连续存储单元里,由此得到的存储结构称为顺序存储结构。它通常有程序设计语言里的数组来描述的。该方法主要应用于线性的数据结构,但非线性的数据结构也可以通过某种线性化的方法来实现顺序存储;
② 链接存储方法:逻辑上相邻的结点在物理内存中不一定相邻,主要是通过指针域表示其与直接前趋与直接后继的关系。它主要是通过程序设计语言中的指针实现的。
③ 索引存储方法:通常是在存储元素信息的同时,还建立附加的索引表。表中的索引项一般形式是:(关键字,地址)。关键字是能唯一标识一个元素的一个数据项或多个数据项的组合。
④ 散列(Hash)存储方法:基本思想是根据元素的关键字直接计算出该元素的存储地址。 - 数据的运算,即对数据元素施加的操作(行为)。
(1) 数据的运算是定义在数据的逻辑结构上的,每种逻辑结构都有一个运算的集合,最常用的运算有:检索,插入,删除,更新,排序等。数据运算是数据结构不可分割的一个方面。对数据运算定义的不同,可能导致完全不同的数据结构。插入删除只能在表的一端,被称为栈;插入在一端,删除只能在另外一端的,被称为队列。 - 数据类型,data type,是一个值的集合和定义在值集上的一组操作的总称。在高级程序设计语言中,每一个变量,常量或表达式都有一个它所属的数据类型。数据类型规定了在程序运行期间变量或表达式可能的取值范围以及在这些值上所允许的操作运算。例如,在C语言中的整数类型,就给出了一个整型量的取值范围,取决于不同的机器或编译系统,定义了对整型量可施加的加减乘除取模等算术运算。
·抽象数据类型
- 抽象数据类型(Abstract data type ),简称ADT。它是抽象数据的组织和与之相关的操作。一个ADT可以看作是定义了相关操作运算的一个数学模型。例如,集合与集合之间的交、并、补、差运算就可以定义为一个抽象数据类型。在面向对象语言中,我们可以把ADT定义为一个类。
· 算法的描述和分析
- 前边已经叙述过,研究数据结构的目的在于更好地进行程序设计。而程序设计离不开数据的运算,这种运算的过程通常称为算法。
- 算法是对问题求解步骤的一种描述。通俗地讲,一个算法就是一种解题的方法。严格地说,算法是由若干条指令组成地又穷序列,其中每条指令表示一个或多个操作。
- 算法地五条特性:
(1) 输入。算法开始前必须给算法中用到的变量初始化,一个算法的输入可以有零个或多个。
(2) 输出。算法至少有一个输出。
(3) 有穷性。算法中每一条指令的执行次数有限,每一步都在有穷的时间内完成,即算法必须在执行有限步后结束。
(4) 确定性。算法的每一步的含义必须明确,,无二义性。。
(5) 可行性。算法中的每一步都可以被有限次的运算来实现。 - 算法优劣的比较:
(1) 算法必须是正确的,是指对于一切合法的输入,该算法必须在有限的时间内得到正确的结果
(2) 执行算法所需的步骤数,即时间复杂度
(3) 执行算法所需的存储空间,即空间复杂度
(4) 算法应易于理解,易于编程,易于调试,即可读性和可操作性。
在以上4点中,最重要的是第二条,即时间复杂度。 - 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记为:T(n)=O(f(n))
- 求一个算法的时间复杂度,只需要估计它的阶即可。
(1) 常数:O(1)
(2) 对数:O(log n)
(3) 线性:O(n)
(4) 线性对数阶:O(nlogn)
(5) 平方:O(n^2)…幂次方阶
(6) 指数:O(2^n)
(7) 阶乘:O(n!)