我将开始撰写一系列的数据结构教程,大家在阅读过程中,尤其是对于一些概念性的描述,如果没有写过代码的可能很难理解有些内容的含义。如果遇到这种情况,可以先跳过那一部分不理解的内容,等把所有的内容都学完了再回过头看一下,应该都可以理解的。
本系列教程需要大家对C#语言的语法有一定的熟悉和了解,本系列课程中不会重点去介绍C#语言本身的内容,默认大家已经对C#语言有一定的了解。如果大家对C#语言本身不了解,可以单独去学习一下C#的语法知识后,再来学习我们的数据结构教程。
当前文章主要对数据结构做一个概念性的说明。
示例代码地址
本系列课程中的所有代码上传带gitee平台,如有需要可以自行克隆学习,代码地址为https://gitee.com/jiamingyuanjin_admin/data_struct.git
考虑到github平台经常访问失败,示例代码并没有github的地址。
什么是数据结构
通俗一点来说,数据结构分为两部分,一是数据,二是结构,理解了这两个概念,就明白了数据结构是什么。
数据指的是一组有相似特征的数据元素集合(比如一组int集合、一组float集合等)。
结构指的是这一组数据元素之间的逻辑结构和物理结构。
逻辑结构指的是从逻辑上来描述一组数据中各个元素之间的关系,逻辑结构和程序的关系不大,仅仅是对元素之间关系的一种描述而已。元素之间的关系有线性关系(线性表、堆栈、队列)和非线性关系(数和图)两种。
物理结构指的是这一组数据在计算机(内存)中的存储方式,这个结构和我们的编程是有密切关系的。物理存储结构有 顺序存储(数组实现) 和 链式存储(指针实现) 两种。
研究数据结构一定是先有逻辑结构(先弄明白数据元素之间逻辑关系),然后我们才能在计算机程序中通过程序(物理存储结构)的方式去实现它。实际上,每一种逻辑结构都有顺序存储和链式存储两种实现方法。 所以大家一定要记住逻辑结构和物理结构这两个概念。后续所有的文章,我们都是先介绍一种逻辑结构的特点,然后在程序中用顺序存储和链式存储两种物理结构去实现这种逻辑结构。
数据结构的分类如下图:
研究一组数据的结构有什么用
简单一点说,就是把这些数据元素按照一定的结构存储起来之后,方便我们后续对这组数据进行各种各样的处理,比如后面我们要对这一组数据进行增删改查操作,不同的结构就有不同结构的优势。比如顺序存储的优势就是查询速度极快,增删改的速度较慢。链式存储的优势是新增方便,删除,更新较快。但是查询确实比较慢的。
什么是算法
说完数据和结构这两个概念,现在介绍一下,什么是算法。简单来说,我现在有一个问题需要解决,你给我提供了几种解决方案。那么这几个方案就是算法。官方的定义是这样的:算法是由一系列清晰、明确的指令组成的解题方案,用于系统的方法描述解决问题的策略和机制。算法和数据结构有着密不可分的关系。
算法的五大特性
1、输入:一个算法必须有0个或者多个输入
2、输出:一个算法必须要有一个或多个输出
3、有穷性:一个算法必须在一定的时间范围内终止,不能无限制的执行下去
4、确定性:一个算法的每一步,都必须要明确的说明,不能包含任何歧义,确保算法的执行者和阅读者能充分理解算法该如何执行。
5、可行性:一个算法的每一步,必须是通过基本的程序操作来实现。
说完这5个特性,大家想一想程序中那种东西最符合这五个特征。那当然是函数啦,可以把算法比喻成一个函数,这个函数接受0个或者多个参数 (输入) ,并且在函数中的每一行代码都有其明确的含义 (确定性) ,函数经过一段时间 (有穷性) 执行之后通过return返回对应的返回值或者函数没有返回值 (输出) 。至于 可行性 这个特性我实在是不知道在函数中怎么比喻它,但是我相信你可以理解它的含义。所以如果你实在不理解算法是什么的话,在这里就简单的把算法理解成一个函数,实际上算法的具体实现主要也是通过一个个函数是实现的。
算法时间复杂度
时间复杂度描述的是一个问题的规模n和解决这个问题所需要的程序运行时间O(n)之间的关系。简单点说,就是有一个函数,这个函数有一个参数n,当输入不同的n的时候程序的运行时间0(n)是多少。程序的运行时间要忽略掉外部因素:比如说机器性能的差异、运行时服务器温度的差异等
通常描述时间复杂度有以下几种:
1、常数关系 O(1) 程序执行时间和问题规模n没关系,不管输入参数n是多少,程序执行的时间都是固定不变的。
2、线性关系 O(n) 程序执行时间和问题规模n呈线性关系,比如我输入的n分别为1、2、3、4的时候,程序执行时间也依次为1、2、3、4。
3、指数关系 O(n2) 程序执行的时间和问题规模n呈指数关系,比如我输入的n分别为1、2、3、4的时候,程序执行时间也依次为1,2,9,16。
4、对数关系 O(log n) 程序执行时间和问题规模n呈对数关系,比如我输入的n分别为1、2、3、4的时候,程序执行时间也依次为log 1、log2 log3、log4
5、立方阶关系 O(n3) 程序执行时间和问题规模n呈三次方关系,比如我输入的n分别为1、2、3、4的时候,程序执行时间也依次为1X1X1、2X2X2、3X3X3、4X4X4。