1.数据结构
- 什么是数据元素,数据项,数据对象,数据结构
- 数据元素:是数据的基本单位,通常作为一个整体考虑和处理
- 数据项:一个数据元素可以由多个数据项组成,数据项是构成数据元素的不可分割的最小单位
- 数据对象:是具有相同性质数据元素的集合,是数据的一个子集,侧重于数据元素的内容。
- 数据结构:是相互之间存在一种多多种特定关系的数据元素的集合,侧重于数据元素之间的关系,对数据内容不关心
- 数据结构三要素
- 数据的存储结构
- 顺序存储
- 把逻辑上相邻的元素,存储在物理位置也相邻的存储单元中
- 链式存储
- 逻辑上相邻的元素,在物理位置上可以不相邻,使用指针来表示元素之间的逻辑关系
- 索引存储
- 在存储元素信息的同时,还建立附加的索引表
- 散列存储
- 根据元素的关键字,直接计算出该元素的存储地址,又称哈希(Hash)存储
- 链式,索引,散列存储都是非顺序存储
- 数据的存储结构会影响存储空间分配的方便程度
- 数据的存储结构会影响数据的运算速度
- 顺序存储
- 数据类型
- 数据类型是一个值的集合和定义在此集合上一组操作的总称。
- 原子类型。不可再分解的数据类型
- 结构类型。可以再分解为若干成分的数据类型
- 数据类型是一个值的集合和定义在此集合上一组操作的总称。
- 抽象数据类型(ADT)
- 抽象数据组织及与之相关的操作,对数据结构逻辑的描述,不关心物理结构(存储结构)
- 数据的存储结构
- 算法
- 算法是对特定问题求解步骤的一种描述
- 算法特性(五个特性)
- 有穷性
- 一个算法必须在执行有穷步之后结束,每一步都在有穷时间内完成
- 算法必须是有穷的,而程序可以是无穷的
- 死循环不是算法
- 确定性
- 算法中每条指令必须要有确切的含义,相同的输入只能得到相同的输出
- 可行性
- 算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现
- 输入
- 一个算法有零个或多个输入
- 输出
- 一个算法有一个或多个输出
- 有穷性
- 好算法的特性
- 正确定
- 可读性
- 健壮性
- 输入非法数据时,能够适当的作出处理,不会产生莫名其妙的结果
- 高效率和低存储量需求
- 高效率:执行时间少,时间复杂度低。
- 低存储量需求:不费内存,空间复杂度低。
- 算法的时间复杂度
- 算法的空间复杂度
- 递归
S(n)=O(n),S(n)=O(n**2),n的平方
- 递归
线性表
- 线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列。其中n为表长,n为0时,线性表是一个空表
- 几个概念
- a[i]是线性表中第i个元素,线性表中的位序,位序从1开始,数组下标从0开始
- a[1]是表头元素,a[n]是表尾元素
- 除第一个元素外,每一个元素仅有一个直接前驱,除最后一个元素外,每一个元素仅有一个直接后继
- 在c#中传参,注意 &
- 几个概念
- 顺序表
- 用顺序存储的方式实现线性表的顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中。
- 顺序表的实现
- 静态分配
- 无法扩展
- 动态分配
- c语言中,malloc函数,动态申请内存空间,c++,new函数
- c语言中,free函数,动态释放内存空间,c++,delete函数
- 顺序表的特点
- 随机访问
- 存储密度高,每个节点只存储数据元素
- 扩展容量不方便(即便采用动态分配方式扩展容量,时间复杂度也比较高)
- 插入,删除操作不方便,需要移动大量元素
- 静态分配
- 单链表
- 双链表
- 循环链表
- 循环单链表
- 表尾节点的next指针指向头节点
- 初始化写代码:表头节点的next指针指向自己本身
- 循环双链表
- 表尾节点的next指针指向表头节点
- 表头节点的prior指针指向表尾节点
- 初始化写代码:头节点的next指针,prior指针都指向头节点本身
- 循环单链表
- 线性表总结
- 顺序表
- 优点:支持随机存取、存储密度高
- 缺点:大片连续空间分配不方便,改变容量不方便
- 链表
- 优点:离散的小空间分配方便,改变容量方便
- 问题:请描述顺序表和链表的 bla bla bla..
- 实现线性表时,用顺序表还是链表好?(6分)
- 顺序表和链表的逻辑结构都是线性结构,都属于线性表。但是二者的存储结构不同,顺序表采用顺序存储(特点,带来的优点缺点);链表采用链式存储.(特点、导致的优缺点)。由于采用不同的存储方式实现,因此基本操作的实现效率也不同。当初始化时;当插入一个数据元素时…;当删除一个数据元素时…;当查找一个数据元素时…
- 顺序表
栈和队列
- 栈
- 栈(Stack)是只允许在一端进行插入或删除操作的线性表
- 栈顶:允许插入和删除的一端
- 栈底:不允许插入和删除的一端
- 特点:后进先出,LIFO
- Push:增加,只能在栈顶操作。
- Pop:删除,并返回栈顶元素,只能在栈顶操作。
- GetTop:查找栈顶元素,不删除。
- StackEmpty:判断一个栈是否为空。若为空,则返回true,否则返回false。
- 链栈等同于头插法单链表
- top=-1,指向栈顶,top=0插入元素的位置
- 队列
- 队列(Queue)是只允许在一端进行插入,在另一端删除的线性表。
- 特点:先进先出,FIFO
- 队尾:允许插入。
- 队头:允许删除。
- 判断队列已满:
(Q.rear+1)%MaxSize == Q.front - 判断队列已空:
Q.rear == Q.front - 使用tag标记插入删除,来判断队列已满,已空。
- tag=0删除,tag=1插入
Q.front==Q.rear && tag == 1,已满。由于插入操作,导致队头指针和队尾指针指向同一个位置。Q.front==Q.rear && tag == 0,已空。由于删除操作,导致队头指针和队尾指针指向同一个位置。
- 卡特兰数前几项1, 1, 2, 5, 14, 42, 132
- 中缀表达式,前缀表达式(波兰式),后缀表达式(逆波兰式)
树和二叉树
- 树
- 有且仅有一个根节点
- 没有后继的节点称为“叶子节点”(或终端节点)
- 有后继的节点称为“分支节点”(或非终端节点)
- 除了根节点外,任何一个节点都有且仅有一个前驱
- 每个节点可以有0个或多个后继。
- 属性:
- 节点的层次(深度) --- 从上往下数
- 节点的高度 --- 从下往上数
- 树的高度(深度) --- 总共多少层
- 节点的度 --- 有几个孩子(分支)
- 树的度 --- 各节点的度的最大值
- 高频考点
- 二叉树
- 二叉树是n(n>=0)个节点的有限集合:
- 或者为空二叉树,即n=0。
- 或者由一个根节点和两个互不相交的被称为根的左子树和右子树组成。左子树和油子树又分别是一棵二叉树。
- 特点:
- 每个节点至多只有两棵子树
- 左右子树不能颠倒(二叉树是有序树)
- 满二叉树
- 满二叉树是特殊的完全二叉树
- 高度为h,含有
2^h-1个结点的二叉树 - 特点:
- 只有最后一层有叶子结点
- 不存在度为1的结点
- 按层序从1开始编号,结点i的左孩子为2i,右孩子为2i+1:结点i的父节点为[i/2」(如果有的话)
- 完全二叉树
- 在满二叉树的基础上可去掉若干个编号更大的结点
- 特点:
- 只有最后两层可能有叶子结点
- 最多只有一个度为1的结点
- 按层序从1开始编号,结点i的左孩子为2i,右孩子为2i+1:结点i的父节点为[i/2」(如果有的话)
- i<=[n/2]为分支结点,i>=[n/2]为叶子结点
- 二叉排序树
- 左子树关键字<根节点关键字<右子树关键字
- 平衡二叉树
- 左右子树深度差不超过1
- 高频考点
- 二叉树的遍历
- 注意:
- 前序遍历:根节点在最左边
- 后序遍历:根节点在最右边
- 中序遍历:根节点在中间
- 层序遍历:根节点在最左边
- 一定要有中序遍历才能确定唯一的二叉树
- 树,森林,二叉树的转换
- 哈夫曼树
图
- 图的定义
- 无向图,有向图
- 简单图,多重图
- 简单图
- 不存在重复边
- 不存在顶点到自身的边
- 简单图
- 图的存储
- 邻接矩阵
- 适合用于存储稠密图
- 含义:从A-D长度为2的路径有一条
- 邻接表
- 十字链表---存储有向图
- 邻接多重表---存储无向图
- 图的广度优先遍历
- 图的深度优先遍历
- 最小生成树
- 最短路径-BFS算法
- 依托于广度优先遍历
- 只适用于无权图,或权值相同图
- 最短路径-Dijkstra算法
- 不适用于有负权值的边
- 不适用于有负权值的边
- 最短路径-Floyd算法
- 可以解决有负权值的边
- 不可以解决有负权回路的图
- 有向无环图
- 拓扑排序
- 关键路径
- AOE网
- 仅有一个入度为0的开始顶点(源点)
- 仅有一个出度为0的结束顶点(汇点)
- 具有最大长度的路径,为关键路径,这条路上的活动称为关键活动。
查找
- 平均查找长度(ASL)
- 通常考虑查找成功,查找失败,两种情况的ASL
- 折半查找
- mid=(low+hight)/2向下取整,右子树节点比左子树节点多0个或1个
- mid=(low+hight)/2向上取整,左子树节点比右子树节点多0个或1个
- 折半查找判定树一定是一个平衡二叉树
- 折半查找判定树只有最下面一层是不满的
- 树高
h=log2(n + 1)
- 二叉排序树(BST)
- 平衡二叉树(AVL)
- 简称平衡树
- 树上任一结点的左子树和右子树的高度之差不超过1。
- 结点的平衡因子=左子树高-右子树高。
- 平衡因子的绝对值大于1,就不是平衡二叉树
- 平衡二叉树的删除
- 散列查找(哈希查找)
- 平均查找长度(成功)
- 平均查找长度(失败)
- 平均查找长度(成功)
排序
- 稳定性
- 稳定的:插入排序,冒泡排序,归并排序,基数排序
- 不稳定的:希尔排序,快速排序,简单选择排序,堆排序