数据结构
什么是数据结构?
数据结构 是计算机存储、组织数据的方式,是指数据元素的集合以及数据元素之间存在的一种或者多种关系的集合,元素之间的关系包括数据的逻辑结构、数据的存储结构和数据的运算结构。
数据 是信息的载体,是可以被计算机识别存储并加工处理的描述客观事物的信息符号的总称。 数据元素 是数据的基本单位,在计算机程序中通常作为一个整体考虑。一个数据元素由若干个 数据项 组成。数据项是数据结构中讨论的最小单位。有两类数据元素:如果数据元素不能再分,则称为 原子项 ;如果数据元素由若干个数据项组成,则称为 组合项
在计算机科学中,数据结构是一门研究非数值计算的学科,主要研究数据元素以及它们之间的关系和运算等,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。在程序设计以及大型系统中,数据结构的选择是一个很关键的步骤,优良的数据结构可以降低系统实现的难度,提高系统的性能。
数据结构分类
数据结构有两个要素,一个是数据元素的集合,另一个是关系的集合。在形式上,数据结构通常可以采用一个二元组来表示。数据结构按数据元素之间关系的不同,可以分为以下四类基本结构:
- 集合结构。数据元素属于同一个集合。
- 线性结构。数据元素之间存在着一对一的关系。常见的有链表、队列、栈等。
- 树形结构。数据元素之间存在着一对多的关系。常见的有二叉树、二叉查找树、平衡二叉查找树等。
- 图形结构。数据元素之间存在着多对多的关系。
按照存储方式的不同,数据结构可以分为顺序存储结构和链式存储结构:
顺序存储结构,表示数据元素在存储器中是连续存储的,可以用相对位置来表示数据元素之间的逻辑结构,如顺序表、队列、栈等。
链式存储结构,每个数据元素里设置了一个指针用来指向另一个元素的存储地址,以此来表示数据元素之间的逻辑结构。
按照逻辑结构来分,数据结构可以分为线性结构和非线性结构,如果数据元素之间存在一对一的关系,则称为线性结构,否则称为非线性结构。集合结构、树形结构、图形结构都称为非线性结构。
算法
这一节课我们简单的来了解下算法。算法(Algorithm)是对某一个或者某一类问题的解决方案的描述,根据问题的输入,在有限的计算时间里输出预期的结果。不同的算法解决问题所需的时间和空间可能会不同,通常用时间复杂度和空间复杂度来评估算法的优劣,我们在下一节课会介绍如何计算算法的时间和空间复杂度。
算法有以下5个特征:
- 有穷性。算法必须在执行有限个操作后终止。
- 确切性。算法的每一个操作必须有明确的定义。
- 输入项。算法有零个或多个输入,描述算法的初始状态。
- 输出项。算法有一个或多个输出,没有输出的算法我们认为是没有意义的。
- 可行性。算法的每个计算操作都可以在有限时间内完成。
数据结构描述了数据元素之间的逻辑关系,算法描述了数据元素的操作步骤,数据结构和算法组成了程序世界。数据结构和算法之间是不可分割的关系,数据结构是程序的基础,算法将数据互相联系起来,形成了一套能解决具体问题的方案。
在解决问题时,一般我们会优先确定数据结构,然后再来完善算法,有时也会反过来,根据算法来选择合适的数据结构。选择一个合适的数据结构,可以降低算法的复杂度,提高算法的效率。
复杂度分析
算法的复杂度是评估算法性能优劣一个重要的指标,可以帮助程序员估算出算法在执行之后所需要的时间和空间,所以分析算法的复杂度几乎成了每个程序员必须掌握的能力。
算法的复杂度分为算法的时间复杂度和空间复杂度。在介绍时间复杂度之前,我们需要引入 时间频度 的概念。时间频度是指算法中语句的执行次数,用 T(n) 来表示, n 为问题的规模。
有些时候,时间频度的表达方法有点复杂,我们需要更直观的表达方法,于是引入了时间复杂度的概念。如果有一个辅助函数 f(n),在 n 趋向于无穷大时,T(n)/f(n) 的极限值为不等于 0 的常数,则我们近似的将 f(n) 替代 T(n),记为 T(n)=O(f(n)),称为算法的渐进时间复杂度。
时间复杂度只关心算法中最耗时的部分,舍去常数部分,通常用简单的函数来表示。
按效率从高到低排列,时间复杂度一般有以下几种:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/77027.html