活动安排问题
- 算法思想:
在活动安排问题中,做出的贪心选择为:每一次都选择结束时间最早并与前一个活动相容的活动。
证明:设集合A为我们得到的活动E集合中的最大相容子集,活动k为集合A中按活动结束时间排序的第一个元素,若k就是E中第一个元素,则集合A是一个通过贪心选择得到的最优解,若不是,则取B=(A-k)U(1)(E中的第一个元素),则最优解的大小不变,且贪心选择被包含在其中,则贪心性质可被证明。
设集合A1=A-1是第一步贪心选择后对剩余子集E-1(且与1相容)进行贪心选择得到的最优解,如果存在B>A1,则新解1+A1一定大于A,与A是最优解相矛盾,最优子结构得证。
Dijkstra算法
- 算法思想:
迪杰斯特拉算法是单源最短路径的贪心解法,它的贪心选择是将当前源点所能到达的最近的点加入到起点集合中。
算法的基本过程分为两部分:更新和选择,从dis数组选择当前距离原点最近的点,并将新加入点所能到达的点的距离更新。
时间复杂度:每次选择都能确定一个点,n个点的带权有向图最多需要n-1次,而每次更新也需要n次查询,所以时间复杂度为n^2;
Huffman编码
- 算法思想:
在解决霍夫曼编码问题的过程中,引入了带权路径长度的概念(叶结点的路径长度与它的权值(字符出现频率)的乘积),要求平均带权路径长度最短,也就是说频率越大的,它的路径越短,编码也就越短。而我们需要得到二进制编码,对应的就是二叉树。
每次我们都从已存在的节点中找到两个权值最小的节点,并将其作为新形成节点的左右子节点,新节点的权值就是左右两节点的和。重复操作,直到只剩下最后一个根节点。
时间复杂度:已知n个节点,每次都会将两个节点合并,n-1,并对n-1个进行排序(nlog(n))时间复杂度大约为n*nlogn;如果使用优先队列,开始需要创建队列,时间复杂度为nlogn,后面进行霍夫曼树的建立时需要再插入一个节点,插入n次,时间复杂度为nlogn,所以总的时间复杂度为nlogn;



