数据结构和算法不仅是数学意义上的问题描述、建模和求解,停留在“纸面上”,更是需要结合计算机硬件特性和编程语言本身特点去真正实现,最终形成一个完整的可执行程序,解决实际的问题。
C语言+数据结构+算法=C语言程序。编程过程中,对于一个真实的问题,编程解决步骤是:
第1步:分析问题,
第2步:找到数学方法“纸面上”解决它,也就是找到“算法”,(关键---思考算法)
第3步:选择合适的数据结构存放数据,实现“算法”,
第4步:选择编程语言,编写可执行的代码,实现数据结构和算法。
基本概念
# 数据结构概念
指相互之间存在一种或多种关系的数据元素的集合,使用集合二元组来描述有两个要素部分,分别是数据元素集合、数据元素关系集合。
数据结构完整描述可以分为逻辑结构和存储结构,逻辑结构描述本质上的关系,存储结构是根据计算机和编程语言特点实现关系,一种逻辑结构可以有多种存储结构实现,同样,一种存储结构可以被用于实现多种逻辑结构。
# 逻辑结构分类
逻辑结构对应数据结构中数据元素的关系,简单可以分为集合、线性、树型、图状四类。
- - 集合:最松散的关系,相当于空关系,只要数据元素取值属于同一个集合即可。
- - 线性:一对一关系,数据元素逻辑上结构是排列的一条“线”,有先后次序。
- - 树型:一对多关系,存在一个父亲结点和多个孩子结点,逻辑上是一颗“树”。
- - 图状:多对多关系,数据元素可以有任意的对应关系,形似一张“网图状”。
# 存储结构分类
存储结构是数据结构的逻辑结构在计算机中的物理实现表示,因此也可以称为物理结构,简单分为2大类:
- - 顺序存储方式:数据按照顺序在内存中存放,数据的逻辑顺序和计算机物理内存地址顺序对应,C语言实现可以使用数组、动态内存分配的顺序表表示。
- - 链式存储方式:数据可以在内存中随机存放,同时数据结点中通过一个指针将数据按照逻辑顺序串接起来,例如链表。
# 算法
- - 算法是对特定问题的求解步骤的描述,是通用的数学意义上的问题求解。
- - 程序是算法在计算机中的一种实现,需要使用特定的编程语言和计算机指令。
- - 算法常见时间复杂度大小关系:O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n),其中O(1)表示常量时间,和问题规模无关。
- - 算法空间复杂度:是指算法需要除数据元素之外的辅助空间大小,O(1)表示只需要固定的辅助空间,和问题规模无关,原地工作。
# 对比理解
1.逻辑结构和存储结构:数据结构的两个重要方面,一种逻辑结构可以有多种存储结构实现,存储结构实现和计算机硬件特性、编程语言特性相关,不同的存储结构实现,其数据结构最终的处理效率是不同的,各有优劣。
2.数据结构和算法:这两个概念也是密切相关,算法是对问题的求解,必然涉及到数据处理,因此需要选择数据结构存放数据。使用不同的数据结构直接影响算法对于问题的处理效率。一个可以用计算机解决的实际问题,需要同时选择一个合适的算法和数据结构,最终形成完整的可执行程序。
3.数据结构作用主要是处理数据,因此基本上每种数据结构都需要提供增加、修改、删除、查询、显示数据等通用功能,根据数据结构的具体存储结构,其实现的过程和效率均不相同。
常用的数据结构
# 线性表
线性表是最简单的一种数据结构,具有相同类型的数据元素组成的序列。顺序表、链表是其两种简单实现。
注:数组也可以算一种简单的线性表。
链表可以分为:
- - 带头结点的简单链表
- - 不带头结点的简单链表
- - 静态链表
- - 循环链表
- - 双向链
# 栈
限定增加和删除数据操作只能在线性表的末端进行,因此是一种受限的特殊线性表。
实现方式有:
- - 顺序栈
- - 链栈
栈典型的特点是:数据“后进先出”,栈可以用来实现递归。栈数据结构的主要操作是出栈、入栈。
# 队列
限定增加数据元素在线性表的末端,删除数据元素在线性表的始端。
实现方式有:
- - 顺序队列
- - 循环队列
- - 链队列
- - 双端队列
队列典型的特点是:数据“先进先出”,队列使用常见是日常各种“排队”。队列的主要操作包括入队、出队。
# 数组
最常用最简单的数据结构。C语言内置数组结构,特点是长度固定,无法动态增加数组长度,数据元素在内存是顺序存放,可以使用数组下标直接访问。
数组典型使用在数学的矩阵运算处理上。
# 字符串
计算机很重要的应用是非数值对象的处理,也就是字符串的处理。字符串,就是由零或多个字符串组成的序列。字符串可以定长数组顺序表示、动态分配堆存储表示、块链表示。
字符串数据结构在文本处理、编程语言编译、搜索等非数值计算应用广泛。重要的应用算法是字符串的模式匹配算法。
# 树
树是一种非线性数据结构,描述一对多关系,例如组织架构、族谱等。数据元素分为父亲结点和孩子结点,一个父亲结点可以有多个孩子结点,但是一个孩子结点有且只有一个父亲结点。
树型数据结构常用有:二叉树、满二叉树、完全二叉树、线索二叉树、平衡二叉树。存储结构实现包括顺序存储、二叉链表、三叉链表等。其中二叉树数据结构最重要的操作是遍历,分为先序、中序、后序、层次遍历四种。
树型数据结构常用算法应用包括:最优二叉树、哈夫曼编码。
# 图
数据元素之间的关系是任意的,任意两个元素都可以有关系。图状数据结构可以分为有向图、无向图、完全图、网(边上带权的图)。
图的存储结构常用表示有:邻接矩阵、邻接表、十字链表、邻接多重表。图状数据结构重要操作是遍历,主要分为广度和深度优先遍历。
图状数据结构常用算法应用包括:最小生成树、最短路径。
# 查找表
查找表是同种数据元素的集合,数据元素之间没有关系,仅仅是属于同一集合。查找表主要操作是查询和检索。
查找表数据结构可以分为静态查找表、动态查找表、哈希表。
其中静态查找表包括:
- - 顺序表
- - 有序表(折半查找)
- - 静态树表
- - 索引顺序表
动态查找表包括:
- - 平衡二叉树
- - B树
- - B+树
- - 键
哈希表:非常重要好用的数据结构,核心思想是将关键字和物理存储位置建立对应关系,直接根据关键字即可定位到数据。
# 排序算法
排序是各类数据结构通用的操作,数据进行排序后,方便查找和处理。常用的有12个排序算法。
总结
以上是C语言常用的数据结构,基本上都需要学习了解,特别是线性表、栈、队列是C语言初学者必须掌握的数据结构。
---------- End ----------