时间复杂度:
在规模为 n 的所有输入中,选择执行时间最长者作为 T(n),并以 T(n)度量该算法的时间复杂度
将 T(n)定义为算法执行基本操作的总次数,即 T(n)决定于组成算法的所有语句各自的执行次数,及其中所含基本操作的数目
空间复杂度:
算法所需要的存储空间的大小,一般不对其专门考察,因为任何一个算法的任何一次运算过程中消耗的存储空间,都不会多于其间所执行基本操作的累计次数,所以时间复杂度是空间复杂度的天然上界
常数时间复杂度,对数时间复杂度,线性时间复杂度,多项式时间复杂度等
数组到容器:
数组的读取、修改等基本操作可以在常数时间内完成,只要从数组所在空间的起始地址A出发,即可根据每一元素的编号,经过一次乘法运算和一次加法运算,获得访问元素的物理地址。
将数组结构做一般性推广就是容器(vector),经过这个抽象后,不在限定同一容器中的各元素都属于同一基本类型,他们本身是来自于更一般性的某一类对象,各元素也不见得同时具有某种数值属性,故而并不保证他们可以比较大小
不在需要的向量应该借助析构函数及时清理,以释放其占用的系统资源,同一对象只能有一个析构函数,不能重载
动态空间管理,执行 insert 操作前都是检查空间是否够,如果不够,就重新申请一个大空间,将元素搬过去。同理,容器缩容一样
size()和get()等静态操作可以在常数时间内完成,insert()和remove()等动态操作需要线性时间
列表:
列表和容器一样同属序列结构的范畴,其中元素也构成一个线性逻辑次序,但元素的物理地址是可以任意的,列表逻辑上是前驱和后继的关系
使用动态存储策略,可以大大降低动态操作的成本,但静态操作的成本增大
列表是链表结构的一般化推广,其中的元素称作节点
二叉树:
节点的孩子总数叫做度,无孩子的节点称为叶节点,包括根在内的其余节点称为内部节点
节点所有的后代及其之间的联边称为子树
二叉树每个节点的度不超过2
不含一度节点的二叉树称为真二叉树
满二叉树,所有层的节点数都达到最大
完全二叉树,除了最后一层,其他层节点数都是满的,最后一层如果不满,所有的节点都在左边
完全二叉树度为 1 的节点个数是 0 或者 1
度为 0 的节点个数等于度为 2 的节点个数加 1
二叉树的所有节点 N = N0+N1+N2 ,度为 0,1 2 的节点数之和,或者 N = N1 +2N2+1
二叉树的遍历
中序遍历(左根右)
先序遍历(根左右)
后序遍历(左右根)
已知先序遍历和中序遍历,可以唯一知道二叉树
已知后序遍历和中序遍历,可以唯一知道二叉树
已知后序遍历和先序遍历,不可以唯一知道二叉树
根据先序遍历确定根节点,然后再其他顺序中确定左右子树,递归下去
二叉排序树
二叉排序树 (BST)
是一棵具有下列性质的二叉树。
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结构的值
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结构的值
- 它的左子树和右子树都是二叉排序树
哈夫曼树
哈夫曼树也叫做最优二叉树
在权为 w1,w2,w3,...,wn 的 n 个叶子节点的所有二叉树中,带权路径长度 WPL 最小的二叉树称为赫夫曼或最优二叉树
树的带权路径就是树中所有的叶子节点的路径长度。
哈夫曼树的构造(哈夫曼算法)