-
算法及相关概念
- 算法
- 解决特定问题的求解步骤及描述,在计算机中为指令的有限序列,每条指令表示一个或多个操作。
- 算法特性
- 有穷性、确定性、可行性、输入、输出
- 算法设计要求
- 正确性、可读性、健壮性、高效率和低存储量需求
- 算法时间复杂度及大O阶推导
- 大O阶推论:
- 使用常数1代替运行时间中所有的常数加法
- 修改后的运行次数函数中,只保留最高阶项
- 如果最高阶项存在且系数不为1,去除该项的系数
- 常见的时间复杂度耗时排列:O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(!n) < O(n^n)
- 一般而言,所指的时间复杂度通常是指最坏情况的耗时情况
- 大O阶推论:
- 算法
-
线性表
- 线性表:零个或多个数据元素的有限序列
- 线性表的两种存储结构:顺序存储&链式存储
- 单链表结构&顺序存储结构对比
- 若线性表需要频繁的读取而插入和删除操作较少时,顺序存储结构更加合适,若有频繁的插入和删除操作,则单链表结构更加合适
- 当线性表元素变化较大或者不知道有多大时,单链表结构更加合适,不需要考虑内存预先存储空间的大小问题,而如果已知具体长度,则使用顺序存储效率较高
- 静态链表
- 用数组描述的链表叫做静态链表
- 静态链表的优缺点:
- 静态链表实际上是给没有指针的高级语言设计的一种实现单链表的方法,尽管存在一定的缺陷,但是设计思想十分巧妙
- 栈和队列
- 栈是限定仅在表尾进行插入和删除操作的线性表
- 队列是只允许在一端插入数据在另一端删除数据的线性表
- 顺序栈和链栈的对比
- 插入删除时间复杂度均为O(1)
- 对于空间复杂度,顺序栈需要事先确定长度,会存在内存空间浪费问题,链栈存取方便,但是需要指针域增大存储开销。如果栈的长度不确定,使用链栈,反之使用顺序栈比较合适
-
串
- 串是指零个或多个字符组成的有限序列,又叫字符串
- 串的顺序存储一般使用定长数组进行定义,对于字符串操作存在的溢出问题,串值的存储空间的执行过程中动态分配的堆内存,有动态函数malloc()和free()来管理
-
树
- 树是n个结点的有限集,当n=0时,为空树。在任意一个非空树中有且仅有一个特定的称为根的结点;当n>1时,其余结点可以分为m个互不相交的有限集,每一个集合本身又是一棵树,称为根的子树。
- 树的结点包含一个数据元素&若干个指向其子树的分支,结点拥有的子树数目称为结点的度。度为0的结点称为叶结点或终端结点,度不为0的结点,称为分支结点,分支结点中除了根节点,其他结点也称为内部结点,树的度为树内所有结点的最大值
- 结点的层次从根结点开始定义,根为第一层,根的孩子为第二层,树中结点的最大层次称为树的深度或高度
- 线性表与树结构的差异
- 线性结构:第一个元素无前驱,最后一个元素无后继,中间元素有一个前驱一个后继
- 树结构:根节点唯一,无双亲,叶结点无孩子,可以有多个,中间结点,一个双亲多个孩子
- 树的存储结构:对于树这种存在一对多的情况,单纯使用顺序存储无法满足其逻辑关系,结合顺序存储和链式存储可以实现对树的存储结构的要求
- 二叉树:由n个结点构成的有限集,当n=0时,为空树,当n>0时,由一个根结点和两颗互不相交的,分别为根结点的左子树和右子树的二叉树构成
- 二叉树特点:
- 每个结点最多只有两颗子树,二叉树中不存在度大于2的结点,可以是两颗子树,也可以是一颗或者没有子树
- 左子树和右子树有顺序,次序不能任意颠倒
- 即使树中某个结点只有一颗子树,也要区分是左子树和右子树
- 二叉树的五种基本形态:
- 空二叉树
- 只有一个根结点
- 根节点只有左子树
- 根节点只有右子树
- 根结点既有左子树又有右子树
- 特殊二叉树
- 斜树,所有结点都只有左子树的二叉树称为左斜树,所有结点都有右子树的二叉树为右斜树,斜树的结点数即为该树的深度
- 满二叉树,所有分支的结点都存在左子树和右子树,并且所有的叶子都在同一层上,这样的二叉树称为满二叉树
- 满二叉树特点:1. 叶子只能出现在最下一层 2. 非叶子的结点的度一定是2 3. 满二叉树的结点个数最多,叶子数最多
- 完全二叉树,对一颗n个结点的二叉树按层序编号,若编号为i的结点于对应深度的满二叉树中的编号一致,则称为完全二叉树
- 二叉树的遍历
- 前序遍历,二叉树为空,则空操作返回,否则先遍历根结点,然后遍历左子树,最后遍历右子树
- 中序遍历,二叉树为空,则空操作返回,否则先遍历左子树,然后遍历根结点,最后遍历右子树
- 后序遍历,二叉树为空,则空操作返回,否则先遍历左子树,然后遍历右子树,最后遍历根结点
- 层序遍历,二叉树为空,则空操作返回,否则按照层序从左到右依次访问结点
- 二叉树遍历性质
- 已知前序和中序,可以确定一颗二叉树
- 已知后序和中序,可以确定一颗二叉树
-
图
- 图是由顶点的有穷非空集合和顶点之间的边的集合组成,通常表示为:G(V,E)G表示一个图,V是图中顶点的集合,E是图中边的集合
- 线性表中数据元素叫元素,树中数据元素叫结点,图中的数据元素叫顶点
- 线性表中可以没有元素,叫空表,树中可以没有结点,叫空树,而图中不能没有顶点,图中v是顶点的集合,有穷且非空
- 线性表中,相邻的数据元素具有线性关系,树结构中,相邻两层的结点具有层次关系,而图中任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边的集合可以是空的
- 图是由顶点的有穷非空集合和顶点之间的边的集合组成,通常表示为:G(V,E)G表示一个图,V是图中顶点的集合,E是图中边的集合