数据结构、算法与应用
一、预备知识
C++回顾
函数与参数(实参会把值赋给形参),异常,动态存储空间分配,自有数据类型(class),异常类,递归函数,标准模板库,测试和调试(白盒法和黑盒法)
程序性能分析
程序最重要的属性是正确性,程序的性能是指程序对内存和时间的需求。空间复杂度(指令空间和数据空间、环境栈空间),时间复杂度。
渐进记法
大O记法,复杂度分析
性能测量
二、数据结构
线性表-数组秒奥数
数组,vector
线性表-链式描述
单向链表(链表元素地址随机分布,数组元素地址由数学公式决定),循环链表和头结点(将单向链表的尾结点和头结点链接起来),双向链表(每个元素的节点既有一个指向后继的指针又有一个指向前驱的指针),应用(箱子排序,基数排序,凸包,并查集)
数组和矩阵
数组,矩阵,对称矩阵,稀疏矩阵
栈(后进先出)
抽象数据类型,数组描述,链式描述
队列(先进先出)
抽象数据类型,数组描述,链式描述
跳表和散列
字典,抽象数据类型,线性表描述,散列表描述
二叉树和其他树
树(层次结构),二叉树(二叉树的每个元素都恰好有两棵子树,每个元素的子树都是有序的),二叉树的特性(有n个元素则有n-1条边,高度为h时最少有h个元素最多有2的h方-1个,树有n个元素它的高度最大为n最小为log2(n+1),),二叉树描述,二叉树操作,二叉树遍历(前序,中序,后序)
优先级队列(元素出队列的顺序由元素优先级决定)
定义和应用(每个元素都有一个优先权或值),抽象数据类型,堆(一个大根堆既是大根树也是完全二叉树),左高树,堆排序(先用n个待排序的元素来初始化一个大根堆,然后从堆中逐个提取元素)
搜索树
二叉搜索树(每个元素都有一个关键字任意两个元素的关键字都不同;在根节点的左子树中,元素的关键字都小于根节点的关键字;在根节点的右子树中,元素的关键字都大于根节点的关键字;根节点的左右子树都是二叉搜索树),抽象数据类型,二叉搜索树的操作
平衡搜索树
AVL树(最坏情况下高度为O(logn)的树称为平衡树,特征:n个元素的高度O(logn);对于每一个n都存在一个AVL;)红黑树(树的每一个节点都是红色或黑色;根节点是黑色;根节点至外部节点路径上,没有连续的两个节点是红色;)B-树
图(用线或边连接在一起的节点或顶点的集合)
图的搜索(广度优先遍历;深度优先遍历)
第三部分 算法设计与方法
贪婪算法
贪婪算法思想(逐步构造一个最优解)
分而治之
算法思想(把一个大问题分为多个小问题;分别解决每个小问题;把这些小问题的解组合成大问题的解)
动态规划
问题的最优解可以由子问题的最优解推出
回溯法
就是试探法,按照优选条件去向前搜索,以达到目标
快排从小到大
void quicksort(int array[], int start, int last)
{
int i = start;
int j = last;
int temp = array[i];
if(i<j)//先检查左右条件
{
while(i<j)
{
while(i<j&&array[j]>=temp)//从右向左
j--;
if(i<j)
{
array[i]=array[j];
i++;
}
while(i<j&&temp>array[i])
i++;
if(i<j)
{
array[j]=array[i];
j--;
}
}
array[i]= temp; //把基准放到i处
quicksort(array,start,i-1);//以i为中间值,左右两边递归调用
quicksort(array,i+1,last);
}
}