数据结构与算法基础
- 内容简介
- 数据结构
- 数据模型
- 数据结构的表现形式
- 基本概念
- 数据(Data)
- 数据元素(data element)
- 数据结构的定义
- 物理结构和逻辑结构
- 逻辑结构
- 逻辑结构表现形式
- 二元组模型
- 集合结构模型
- 线性结构模型
- 树结构模型
- 图结构模型
- 解决问题
- 顶层计算操作
- 底层计算操作
- 抽象数据类型(ADT)
- 抽象数据类型的三元组
内容简介
数据结构与算法的基础知识概览。我们深入而细致地引入了数据结构与算法领域的一系列基本概念,旨在为读者铺设一条理解之路。具体而言,本篇文章的首要目标是阐释数据结构的本质及其研究范畴,使读者能够清晰把握数据结构这一术语背后的深刻含义及其所涵盖的广泛议题。同时,也着重介绍了算法的概念,并深入探讨了如何评价一个算法的性能,包括效率、稳定性等多个维度,帮助大家建立起对算法性能评估的全面认知。
当人们运用计算机来解决现实世界中具体面临的挑战时,其过程往往遵循一套系统而严谨的流程。首先,基于对现实世界的深入理解和认知,人们形成印象并提炼出关键概念,进而转化为有价值的信息。
数据结构
数据结构,其核心聚焦于程序设计领域内计算机操作的对象,以及这些对象之间的关联方式与操作机制,旨在深入理解并优化数据在计算机中的存储、组织及处理方式。
数据模型
在上述的数据结构的基础上,构建一个能够反映现实世界实体及其相互关系的概念模型至关重要。随后,这一模型作为桥梁,将复杂的实际问题转化为计算机能够识别和处理的形式,并据此设计相应的程序逻辑。
数据结构的表现形式
数据结构紧密关联于从概念模型的构建到模型向计算机实现转化的全过程,为后续的程序设计奠定坚实基础。它深刻揭示了概念模型的内在构造,即探究一个概念模型由哪些基本元素(数据)构成,这些元素如何组织,以及它们所展现出的特定结构形态。
基本概念
首先,让我们引入并阐述一些基础性的概念与专业术语,为后续讨论奠定坚实的理论基础。
###
数据(Data)
数据是涵盖了描述客观事物的广泛范畴,包括数值、字符以及所有能被输入计算机并得到有效处理的符号集合。这一概念的边界相当宽泛,不仅限于常见的数值数据、字符及字符串,还广泛囊括了声音、图像等一切可数字化并输入计算机进行处理的元素。
举例来说,人的姓名、身高、体重等基本信息以字符和数字的形式存在,无疑是数据的一部分;同时,人的照片、指纹、三维模型乃至语音指令等,只要能够被计算机识别和处理,同样也属于数据的范畴。
数据元素(data element)
数据元素构成了数据的基本单元,是数据集合中的独立个体,在计算机程序中常被视作一个不可分割的整体进行处理。
举例来说,一条详尽记录某位学生信息的条目,或者空间中某一点的三维坐标值,均可视为一个数据元素。这些数据元素通常由多个数据项构成,数据项作为组成要素,如描述学生详细情况的姓名、性别、学号等,或三维坐标中每一维度的具体数值,均属于数据项范畴。
注意,数据项具有原子性特征,意味着它们是构成数据元素的最小且不可再分的单位。
数据结构的定义
相互之间存在一种或多种特定关联的数据元素所组成的集合,是一种专门设计用于组织和存储数据以便高效利用的格式。这种格式旨在清晰地反映数据的内部结构,即揭示一个数据由哪些成分数据构成、这些成分数据以何种方式相互关联以及整体呈现出何种结构形态。
物理结构和逻辑结构
信息不仅存在于逻辑思维的领域,还广泛存在于计算机的世界中。因此,作为信息载体的数据也同样分布于这两个层面。数据元素及其相互关系可以通过两种形式来表示:一方面是数据结构的逻辑层面,反映了数据的逻辑关系;另一方面是计算机世界中的物理层面,体现了数据的存储结构。
逻辑结构
数据的逻辑结构可以根据数据元素之间的相互关系特征进行分类,主要分为四种类型:集合、线性结构、树形结构和图状结构。在此我们重点讨论的主要数据结构包括线性表、栈、队列、树和图。
其中,线性表、栈和队列归属于线性结构,而树和图则被视为非线性结构。
逻辑结构表现形式
数据的逻辑结构可以通过两种方式进行描述:一是使用二元组,二是采用图形表示。
二元组模型
数据结构的二元组表示形式为:
数据结构 = {D , S}
( D ) 代表数据元素的集合,而 ( S ) 则是 ( D ) 中数据元素之间关系的集合。这些关系以序偶的形式表达,其构成是两个元素 ( x ) 和 ( y ),并按特定顺序排列,表达为二元组 ( <x, y> )。在这个序偶中,( x ) 被视为第一元素,( y ) 则为第二元素。
在使用图形表示数据结构时,图中的点代表数据元素,而弧则表示这些元素之间的关系。当数据元素 ( x ) 和 ( y ) 之间存在关系 ( <x, y> ) 时,图中会有一条弧从表示 ( x ) 的点指向表示 ( y ) 的点。
集合结构模型
一种数据结构可以用二元组的形式表示为 ( set = (K, R) ),其中 ( K = {01, 02, 03, 04, 05} ) 代表元素集合,而 ( R = {} ) 则为关系集合(空)。
线性结构模型
在此数据结构中,数据元素是有序排列的。其中一个元素可以被称为“第一个”元素(元素 01),而另一个则被称为“最后一个”元素(元素 04)。除了第一个元素外,每个其他元素都有且仅有一个直接前驱元素;同样,除了最后一个元素外,每个元素也有且仅有一个直接后续元素。
数据结构可以用二元组表示为 ( {linearity} = (K, R) ),K = {01, 02, 03, 04, 05} R = {<02,04>, <03,05>, <05,02>, <01,03>},这种特性表明,数据元素之间存在一对一的线性关系。因此,我们将这种特征的数据结构称为线性结构。
树结构模型
在数据结构 tree 中,除了一个数据元素(01)外,其余每个数据元素都有且仅有一个直接前驱元素,但可以有多个直接后续元素。这种结构的特征是数据元素之间呈现1对N的关系,因此我们将其称为树结构。
数据结构可以用二元组表示为 ( {tree} = (K, R) ),其中:
K = {01, 02, 03, 04, 05, 06}
R = {<01,02>, <01,03>, <02,04>, <02,05>, <03,06>}
图结构模型
在数据结构 graph 中,每个数据元素可以拥有多个直接前驱元素和多个直接后续元素。这种结构特征表现为数据元素之间的 M 对 N 关系,因此我们称之为图结构。
数据结构的二元组表示为 graph = (K,R),数据的存储结构主要包括对数据元素本身的存储以及其之间关系的表示。
K = {01, 02, 03, 04, 05}
R = {<01,02>, <01,05>, <02,01>, <02,03>, <02,04>, <03,02>, <04,02>, <04,05>, <05,01>, <05,04>}
在计算机中,数据元素之间的关系主要有两种表示方式:顺序映像和非顺序映像,这对应于两种存储结构:顺序存储结构和链式存储结构。
- 顺序存储结构数据元素存储于一块连续的内存区域,元素间的前驱和后续关系则通过它们在内存中的相对位置来体现。
- 链式存储结构的特征是数据元素存储于不连续的内存空间,每个存储节点对应一个待存储的数据元素。元素之间的逻辑关系通过存储节点之间的链接进行表达。
解决问题
在解决一个明确的问题时,首先需要选择一个合适的数据模型。接下来,需弄清楚该模型在已知条件下的初始状态与期望的结果状态,以及两者之间的关系。
然后,探索从数据模型的初始状态转变为所需结果状态所需的运算步骤。
顶层计算操作
在探索运算步骤时,我们应首先关注顶层的运算步骤,然后再深入底层的运算步骤。顶层运算步骤是指定义在数据模型层面的宏观运算,它们构成了解决问题的核心内容。这些步骤涉及数据模型中的变量,在此阶段,我们暂不考虑其具体数据结构。运算则以数据模型中的变量进行操作,既可以是运算对象,也可以是运算结果,或两者兼而有之,统称为基于数据模型的运算。由于在这一阶段不涉及变量的具体数据结构,这些运算具有抽象性,不关注细节实现。
底层计算操作
底层运算步骤指的是对顶层抽象运算的具体实现,依赖于数据模型的结构和其具体表示。因此,底层运算步骤可以分为两部分:一是数据模型的具体表示,二是基于该模型的运算的实际实现。我们可以将其视为微观运算。可以说,底层运算是顶层运算的细化,旨在为顶层运算提供支持。
为了使顶层算法与底层算法独立设计,避免相互干扰,我们需要对它们的接口进行抽象。这意味着底层运算仅通过这个接口来服务于顶层,而顶层则通过同样的接口调用底层运算。这种接口通常被称为抽象数据类型。
抽象数据类型(ADT)
抽象数据类型(Abstract Data Type,简称ADT)是由一种数据模型及其上定义的一组操作构成的。ADT包含定义和实现两个方面,其中定义与实现是相互独立的。抽象数据类型的定义仅依赖于其逻辑特性,而不受具体实现的影响。换句话说,尽管内部结构可能发生变化,只要其逻辑特性保持不变,其使用方式就不会受到影响。
根据抽象数据类型(ADT)的概念,对其进行定义意味着为该类型指定一个名称,并明确一组相关操作的名称。这些操作包括参数数量、每个参数的含义和顺序,以及每个操作的具体功能。一旦这些细节明确,人们便可以像使用基本数据类型那样方便地引用抽象数据类型。此外,这种定义也为抽象数据类型的实现提供了设计依据和目标。
抽象数据类型的三元组
抽象数据类型的使用与实现始终围绕其定义进行,因此二者之间没有直接联系。这种独立性确保了只要遵循规范,抽象数据类型的使用和实现可以相互独立,互不影响,从而实现对它们的有效隔离,达到抽象化的目的。
ADT = (D, S, P)
在定义抽象数据类型时,我们采用以下格式,其中 D 表示数据对象,S 是与 D 相关的关系集,而 P 则是作用于 D 的一组操作。
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}