六、数据结构与算法基础:
数据结构:
已学省略
线性表——顺序存储和链式存储对比
二叉树:
二叉排序树:
哈夫曼树:
线索二叉树:
使用线索划线的方法,将对应的线索二叉树的对应序列写出,前序线索就对应前序遍历,然后看对应序列的叶子节点的直接前驱和直接后继节点是谁,用叶子节点的左子树指针指向直接前驱,再用右子树节点的指针指向直接后继
平衡二叉树:
排序二叉树中,同一组权值可以构造出不同的排序二叉树,查找的效率不一样,但一般树越平衡越饱满,查找的效率越好。因此提出了平衡二叉树。
稀疏矩阵:
一般出现在选择题,这里针对考试提出一种简单好记的方法。代入排除法。首先选项给出公式,问哪个公式能正确显示这个稀疏矩阵,既然是公式,那它肯定是通用的,所以直接将矩阵中的元素代入,如果得出结果不对,则公式错误,排除至最后一个公式即可。
图:
图的存储使用邻接表和邻接矩阵存储
深度优先遍历和广度优先遍历:
拓扑排序:
最小生成树:
由图衍生出来的一种树形结构
求最小生成树的两种算法:
普利姆算法:
首先从最小权的点出发选择一条最小权将两个点连接起来,再从这两个点的所有边中选择权值最小的一条边连接
克鲁斯卡尔算法:
从所有的边中选择权值最小的一条边将两个点连接起来,重复这个过程知道所有的点连接起来的,注意连接的过程中不能形成环
算法的特性:
算法复杂度:
查找:
顺序查找:
平均查找长度O(n)
二分查找:
前提是必须是有序排列
O(log2n)
散列表:
散列表存储,一般使用散列函数进行地址空间的分配,对于冲突地址,使用线性探测法或伪随机数法进行处理,可以将冲突的数使用另一个散列函数处理
线性探测法:
冲突的数存入下一地址空间
伪随机数法:
随机存入一个空闲空间
排序:
稳定排序:出现相同的数字时排序后不改变原本相同数字的顺序。
不稳定排序:相对稳定排序来说,会改变
内排序:在内存中进行排序
外排序
-
插入排序:
-
直接插入排序
将后一个元素和前面已经排好序的元素对比直到它小于一个元素并且大于一个元素时插入到中间的位置
-
希尔排序
希尔排序其实就是分组的直接插入排序,首先取一个小于n的增量,将间隔增量个元素的数字归为一组,然后对组内进行直接插入排序,然后缩小增量,重复直接插入排序,直到增量为1.
-
-
交换类排序:
-
冒泡排序
-
交换排序
-
快速排序
快速排序用到的分而治之和递归的方法,首先选择一个序列中的元素作为基准,将大于基准和小于基准的元素放在基准两边,使用递归重复操作两边的数列。
-
-
选择类排序:
-
直接选择排序
在待排序元素中选择一个最小的元素与第一个元素进行交换,继续在待排序元素中选出最小的元素与第二个元素交换
-
堆排序
- 小顶堆:所有孩子节点都大于根节点
- 大顶堆:所有孩子节点都小于根节点
初建堆,将序列中所有值按照完全二叉树进行构建,从最后一个非叶子节点开始构建大顶堆,将孩子节点的较大者与父节点交换重复操作直至根节点。
堆的输出,将堆顶元素输出,然后将最后一个叶子节点放到根节点的位置,然后进行堆的调整。堆排序对输出部分元素(例如输出前三名)具有很高的效率
-
-
归并排序(二路归并)
首先,两两分组,使用两组指针指向组的第一个元素,输出较大者(或较小者),被输出的组指针后移,继续比较。
-
基数排序
基数排序,就是将各个元素中的个位十位百位分别比较一次然后收集新的数列。采用链表的方式处理相同位。
总结: