一、绪论
1、数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,别输入给计算机处理的符号集合。
数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。
数据项:一个数据元素可以由若干个数据项组成。数据项是数据不可分割的最小单位。
数据对象:是性质相同的数据元素的集合,是数据的子集。
总结:数据 > 数据对象 > 数据元素 > 数据项
2、数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。
逻辑结构:数据对象中数据元素之间的相互关系。集合结构、线性结构、树形结构、图形结构。
物理结构:是指数据的逻辑结构在计算机中的存储形式。顺序存储结构(是把数据元素放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的)、链式存储结构(是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的)。
二、算法
1、算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
五个基本特性:输入、输出、有穷性、确定性和可行性。
2、算法时间复杂度:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,记作:T(n)=O(f(n)),大O记法。
常见的时间复杂度:
算法的空间复杂度通过计算算法所需的存储空间实现。写代码时,可以用空间来换取时间。
三、线性表
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
定义:
线性表的链式存储结构,使用一组任意的存储单元存储线性表的数据元素,这组存储单元可以连续也可以不连续。
定义:
对比:
总结:若线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构。若需要频繁插入和删除时,宜采用单链表结构。当线性表中的元素个数变化较大或者根本不知道有多大时,最好用单链表结构,这样可以不需要考虑存储空间的大小问题。
其它链表:静态链表、循环链表、双向链表。
四、栈与队列
1、栈
栈的顺序存储结构:类似于线性表的顺序存储。
栈的链式存储结构:栈顶放在链表的头部,在栈顶进行插入和删除。
栈的应用:四则运算表达式求值
后缀(逆波兰)表达式,所有的符号都是在要运算数字的后面出现,不需要括号。例如 9+(3-1)*3+10/2,后缀表示法应该是 9 3 1 - 3 * + 10 2 / +
我们平时所用的标准四则运算表达式叫做中缀表达式,中缀表达式到后缀表达式的转化:
计算器实现:
将中缀表达式转化为后缀表达式(栈用来进出运算的符号)、将后缀表达式运算得出结果(栈用来进出运算的数字)
2、队列
队列的顺序存储结构:类似于线性表的书继续存储。
队列的链式存储结构:对头在链表的头部,入队在链表尾部插入,出队在链表头部删除。
循环队列中,约瑟夫环问题。在其它博客中已有阐述,此处省略。
五、串
定义:串是由零个或对各字符组成的有限序列,又名叫字符串。用双引号括起来。
计算机中的常用字符是使用标准的ASCII编码,由8位二进制数表示一个字符,总共可以表示256个字符。
串的顺序存储结构:用一组地址连续的存储单元来存储串中的字符序列。
栈的链式存储结构:每个结点中可存放一个字符,也可以存多个字符。
KMP模式匹配算法:
对于主串中进行搜索的i值不回溯,只关注字串中重复的字符对应的j值,其中子串中每个位置 j 值变化的定义:
然后根据不匹配处的j值移动字串到位置i处。
六、树
1、二叉树
完全二叉树:
性质:
二叉树的遍历:前序遍历、中序遍历、后序遍历、层序遍历
线索二叉树:
把指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树。在中序遍历中更新二叉树的前驱和后继。
七、图
定义:
有向图、无向图
存储结构:
1、邻接矩阵
2、邻接表
图的遍历:深度优先遍历、广度优先遍历
最小生成树:普利姆算法、克鲁斯卡尔算法
最短路径:迪杰斯特拉算法、弗洛伊德算法
拓扑排序:
AOV网、AOE网
关键路径:从源点到汇点具有最大长度的路径