绪论
结构:元素之间的关系
逻辑结构(关系):集合结构(平等)、线性结构(一对一)、树形结构(一对多)、图形结构(多对多)
物理结构(存储):顺序结构、链式结构
算法
算法:解决特定问题求解步骤的描述
算法特性:输入、输出、有穷性、正确性、可行性
函数的渐进增长:给定两个函数f(n)和g(n),如果存在一个整数N使得对于所有的n>N时f(n)总是比g(n)大,那么,f(n)的渐进增长快于g(n)
推导大O阶:
1. 用常数1取代所有加法常数
2. 只保留最高阶项
3. 若最高阶项存在且不为1则去除与该项相乘的常数
原理:随着数据增大,以上三点的影响逐渐变小,直至可被忽略
算法的时间复杂度:语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。记作:T(n)=O(f(n)),f(n)为问题规模n的函数
一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法
算法的空间复杂度:通过计算算法所需的存储空间实现,记作:S(n)=O(f(n)),f(n)为n所占存储空间的函数
线性表
线性表:具有相同类型的数据元素的有限序列
顺序存储结构:内存中一块连续的地址空间
链式存储结构:适用于对插入和删除较多的情况
单链表:数据 + 后继指针
循环链表:最后节点的后继指针指向头结点
双向链表:前驱指针 + 数据 + 后继指针
静态链表:用数组人工制作链表,结构 = 数据 + 下一个数据的索引,适用于没有指针的某些高级语言
栈和队列
栈和队列是一种特殊的线性表
栈:限定仅在表尾(栈顶)进行插入和删除操作的线性表,后进先出
共享空间问题:顺序栈拥有固定的存储空间,当有两个相同的栈时可以使用一个数组存储,数组两端分别作为一个栈的栈底,好处在于空间共享,变相扩容
栈应用之递归:
自己调用自己的函数成为递归函数,递归必须至少有一个终结条件
斐波那契数列:F(n)=F(n-1)+F(n-2)(n>1),前面相邻两项之后构成了后一项
栈应用之四则运算:
逆波兰(后缀)表示法:所有运算符都在操作数的后面,对比于常规的中缀表示法
队列:只允许在一段进行插入操作,而在另一端进行删除操作的线性表,先进先出
循环队列:解决队列顺序存储的问题,通用计算队列长度公式:(rear - front + QueueSize) % QueueSize
串
串:由字符组成的有限序列,也叫字符串。是一种由字符组成的特殊的线性表
串的比较:通过ASCII码
串的顺序存储结构:使用最高位或者末位记录串的长度数据,或者将末位置为\0表示结束
串的链式存储结构:指定一个节点可以容纳多少个字符,不足为补特殊字符,如"#"
模式匹配之朴素算法:按位比较,一旦不同则左移一位重新按位比较
模式匹配之KMP算法:已经比较过的字符不应该再次比较,是朴素算法的优化
树
二叉树......
赫夫曼书:最优二叉树,压缩原理