目录
1 什么是数据结构?
首先,什么是数据结构呢?数据结构,简而言之,就是那些相互间通过一种或多种特定关系紧密相连的数据元素的集合,它们共同编织出程序的骨架。
数据结构不仅仅是数据的简单集合,它是算法设计和实现的基础。选择合适的数据结构可以显著提高算法的效率,降低计算成本,从而使程序运行得更快、更稳定。在解决复杂问题时,合理的数据结构设计甚至能够决定问题的可解性。
在编程的世界里,我们常常说:
程序 = 算法 + 数据结构。
如果我们把编写程序比作为建造一座房子,算法好比建造房子的设计理念与规划蓝图,数据结构则是挑选出来的建筑材料,它们根据设计蓝图的要求,被精准地放置于建筑的每一个角落。
算法和数据结构是相辅相成的。算法定义了解决问题的步骤和方法,而数据结构则提供了实现这些步骤所需的数据组织形式。优秀的算法设计需要依赖于高效的数据结构来支持,而高效的数据结构也需要通过算法来展现其价值。
2 基本概念与术语阐释
在计算机科学的广阔领域中,数据、数据元素、数据对象以及数据结构构成了构建知识体系的基石。以下是对这些关键概念及术语的深入解读与实例说明:
数据(Data):作为信息的载体,数据是对现实世界客观事物的抽象表示。在计算机科学的语境下,数据涵盖了所有能够被计算机接收、存储、处理及输出的符号集合。这些符号可以是数字、文字、图像乃至声音。
数据元素(Data Element):作为数据的基本构成单元,数据元素在计算机程序中通常以整体的形式被考虑和处理。一个数据元素可能由多个更细粒度的组成部分——数据项(Data Item)构成,而数据项则是不可再分的最小数据单位,它直接反映了数据的本质特征。
数据对象(Data Object):当多个性质相同或相近的数据元素聚集在一起时,便形成了数据对象。数据对象是数据的一个子集,它体现了特定类型数据的集合性特征。
数据结构(Data Structure):数据结构的核心在于揭示数据元素之间的内在联系与特定关系。它不仅仅是一种数据的组织形式,更是一种存储、检索及处理数据的逻辑结构
实例深化:
想象一下,你正在构建一个在线学习平台,专注于计算机科学的各个领域。在这个平台上,“学习计算机所需的书籍”便成为了一个核心的数据对象。每本书籍(如《数据结构》、《计算机导论》、《C++程序设计》等)作为独立且完整的数据元素,被赋予了丰富的数据项,包括书名、作者、出版社、出版时间、ISBN码以及详细的内容简介等。
为了优化用户体验,你采用了多种数据结构来组织和管理这些书籍信息。首先,你利用哈希表(Hash Table)根据书名或ISBN码实现了书籍的快速检索;其次,你构建了分类树(Classification Tree),根据书籍的主题、难度等属性进行了精细化的分类与排序;最后,你还引入了图状结构(Graph Structure)来表示书籍之间的引用关系与推荐链,帮助用户发现更多有价值的学习资源。
数据结构的基本分类:
上面示例中所提到的哈希表,分类树,图状结构都是常见的数据结构。
根据数据元素之间关系的不同特性,通常有以下4类基本的结构:
- 集合(Set)
- 集合是一种简单而直接的数据结构,其内部元素之间除了共同隶属于该集合外,不存在其他任何显式关系。这种结构的核心特点在于元素的无序性与不重复性,即集合中的每个元素都是唯一的,且没有特定的排列顺序。
- 线性结构(Linear Structure)
- 线性结构则展现了数据元素之间一对一的紧密关系,它们按照某种线性顺序排列,形成了一条有序的数据链。
- 树形结构(Tree Structure)
- 树形结构将数据元素组织成一个具有层次关系的树状网络,其中每个元素(除根节点外)都恰好有一个前驱元素,并可以有零个或多个后继元素。这种一对多的关系使得树形结构在表示具有层级或分类关系的数据时尤为有效。
- 图状机构或网状结构(Graph Structure)
- 图状结构或网状结构是数据结构中最复杂也最灵活的一种,它允许数据元素之间存在多个对多个的关系。这种结构能够直观地表示现实世界中复杂多变的网络关系。
数据类型 vs 抽象数据类型
数据类型 | 抽象数据类型(ADT) | |
定义 | 变量或表达式的值的性质和范围,决定了变量能够存储的数据种类和操作 | 一种理论工具,用于描述数据结构及其上的操作,而不需要具体说明这些数据结构在计算机中的表示方式。 |
分类 | 基本数据类型(整数、浮点数、字符、布尔值)和复合数据类型(数组、结构体、类、枚举)。 | 侧重于数据结构的逻辑特性和操作,不关心物理实现。 |
用途 | 提供基本和复合的数据表示方式,用于存储和操作数据。 | 为程序员提供高级别的数据模型,提高编程效率和代码质量。 |
关注点 | 数据的具体表示方式和操作。 | 数据结构的逻辑特性和操作,独立于物理实现。 |
3 算法与算法分析
可以看一下我之前写的文案
3.1 算法
一个算法具有以下重要特征。
有穷性:算法必须在执行有限个步骤之后终止,即算法的执行时间是有限的。(算法必须在有限步骤内完成。)
确定性:算法的每一步骤都必须有明确的定义,即每一步的执行都是没有歧义的,算法的描述不应有模棱两可的情况。(算法中的每一步骤都必须是明确无误的。)
输入:算法可以具有零个或多个输入,这些输入是算法开始执行前所需要的已知条件或数据。(算法需要接收明确规定的输入。)
输出:算法至少应有一个输出,它是算法执行完成后得到的结果。该结果应与输入有某种确定的关系。(算法必须产生符合要求的输出。)
可行性:算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的,即算法中的操作必须是足够基本的,可以在有限时间内完成。(算法中的每一个操作都必须是有效的,并能被精确执行)
之前提到过,编程就像建筑。 在编程的实践中,选择恰当的数据结构,就如同选用最适合的建筑材料。它不仅能够优化程序的性能,减少资源消耗,还能使代码更加清晰、易于维护。正如建筑师在选材时会考虑材料的耐久性、成本及美观性,程序员在选用数据结构时,也会综合考虑其适用性、效率与易用性。
判断一个算法的好坏通常基于以下几个标准:
- 正确性:算法必须能正确解决问题。
- 可读性:算法应易于理解和维护。
- 健壮性:算法应能处理异常输入,避免因错误输入而崩溃。
- 效率与资源消耗:算法应尽可能高效地运行,并减少存储和计算资源的消耗。
3.2 算法分析
在代码正确的前提下,通常情况下通过时空复杂度(时间复杂度与空间复杂度)来区分算法的好坏。
详细可看我之前发的文章。时空复杂度
3.2.1 时间复杂度
时间复杂度,顾名思义,计算的是代码运行所花费的时间。但是我们知道,一个程序是在电脑上运行的,而电脑不同,同一个程序的运行时间也是不同的。同样的一套程序,我们用十年前的电脑和现在的电脑分别运行,最终的运行时间肯定是不同的。
所以,此处所说的时间复杂度并不是真正的代码运行所需的时间,而是一个程序中 代码所运行的次数 。然后将这个次数写成一个 数学函数表达式。此时,这个表达式就是这个程序的时间复杂度。
我们通常通过计算算法中基本操作(如赋值、比较、循环等)的执行次数来评估时间复杂度。这种评估方法采用大O渐进表示法,即只关注执行次数的最高次项,并忽略低次项和系数。
3.2.2 空间复杂度
空间复杂度则关注算法在执行过程中临时占用的存储空间大小。这里的“空间”主要指算法运行过程中创建的变量个数,而非程序实际占用的物理内存字节数。同样采用大O渐进表示法来量化空间复杂度。
最后,全部笔记如下:
谢谢大家!!
标签:绪论,复杂度,元素,算法,3.2,数据结构,数据 From: https://blog.csdn.net/2302_81681363/article/details/142067172