
算法分析
文章平均质量分 56
Theseus_sky
这个作者很懒,什么都没留下…
展开
-
图的m着色问题
1.问题 给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。2.解析算法思路:t=1->n 对当前第t个顶点开始着色:if: t>n 则已求得一个解,输出着色方案即可else:依次对顶点t着色(1-m)if:t与所有其它相邻顶点无颜色冲突,则继续为下一顶点着色;其中判断标准为:同相邻节点所有节点的颜色比较,如果有该节点且颜色有重复,都不符合要求,否则继续检原创 2021-06-21 15:26:07 · 239 阅读 · 0 评论 -
最优前缀码问题
1.问题 给定字符集C={X1,X2,……,Xn}和每个字符的频率或者说权重f(xi),求关于 C 的一个最优前缀码。2.解析 构造最优前缀码的贪心算法就是哈夫曼算法(Huffman) 构造哈夫曼二叉树的步骤主要为:为每个符号建立一个叶子节点,并加上其相应的发生频率当有一个以上的节点存在时,进行下列循环:把这些节点作为带权值的二叉树的根节点,左右子树为空选择两棵根结点权值最小的树作为左右子树构造一棵新的二叉树,且至新的二叉树的根结点的权值为其左右子树上根结点的权值之和。把权值最小原创 2021-06-20 10:53:46 · 698 阅读 · 0 评论 -
装载问题(01背包)
1.问题 求解装载问题(01背包):给定 n 个 w i 的集装箱和有最大装载量C 的轮船,问最多能装几个集装箱?2.解析 01背包问题和完全背包问题其实是差不多的,主要就是一个资源可以无限选,一个只能选择一次的问题,核心还是选与不选的问题,同时考虑选和不选之间的最大利益。主要思想可以参考之前的博客。 链接:https://blog.youkuaiyun.com/Theseus_sky/article/details/116947491?spm=1001.2014.3001.5502 链接:http原创 2021-06-19 22:35:13 · 379 阅读 · 0 评论 -
LCS算法&完全背包问题
1.问题 求解动态规划中关于最长公共子序列LCS问题、完全背包问题.2.解析最长公共子序列LCS问题:示例:假设X=ABCBDAB Y=BDCABA(1) i=1 A.J=1 X.A <> Y.B C[1,1]=MAX(C[1,0],C[0,1])=MAX(0,0)=0 B.J=2 X.A <> Y.D C[1,2]=MAX(C[1,1],C[0,2])=MAX(0,0)=0 C.J=3 X.A <> Y.C C[1,3]=MAX(C[1,2]原创 2021-06-02 00:05:13 · 362 阅读 · 3 评论 -
矩阵链乘问题--动态规划
1.问题 设A1,A2,…,An为 n 个矩阵的序列,其中Ai为Pi-1*Pi阶矩阵,这个矩阵链的输入用向量P=<P0,P1,…,Pn>给出。 给定向量 P,确定一种乘法次序,使得基本运算的总次数达到最小。2.解析示例:3.设计#include <iostream>#include <cmath>#include <iomanip>#include <string.h>#include <stdio.h>#原创 2021-05-24 20:29:59 · 258 阅读 · 0 评论 -
动态规划解决投资问题
1.问题设m万元钱,n项投资,函数fi(x)表示将x万元投入第i项项目所产生的效益,i=1,2,…, n.问:如何分配这m元钱,使得投资的总效益最高?2.解析xF1[x]F2[x]F3[x]F4[x]000001111111202121213313131630334142141505152643613.设计#include <iostream>#include <cma原创 2021-05-17 20:32:05 · 463 阅读 · 0 评论 -
特定分治策略选取第k小元素
1.问题在数组中,选取第k个小的元素,采用特定分治策略。2.解析3.设计int select(int a[], int l, int r, int k){int group, i, left, right, mid;int pivot, p, lnum;//规模小直接排序返回if (r - l + 1 <= 5){insertsort(a, l, r);return a[l + k - 1];}//分组规模group = (r - l + 1 + 5) / 5;//遍原创 2021-05-17 16:20:43 · 137 阅读 · 0 评论 -
平面最近点对算法
1.问题给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。2.解析分治法的一般步骤Step1:Devide——将要解决的问题划分成若干规模较小的同类问题Step2:Conquer——当子问题划分得足够小时,用较简单的方法解决 (递归)Step3:Combine——将子问题的解逐层合并构成原问题的解 以中间点为划分线的最近点对的距离有三种情况,一种是都在左边点集存在最短距离,一种是都在右边点集存在最短距离,最后一种则是一个点在左边点集一个点在右原创 2021-04-25 18:32:39 · 3476 阅读 · 3 评论 -
二分归并排序算法
1.问题 二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k2.解析二分归并排序算法算法步骤如下: (1) 分解:分解待排序的n个元素的数组成各具n/2个元素的两个子数组。 (2) 解决:使用归并排序递归地排序两个子序列。 (3) 合并:合并两个已排序的子序列以产生排序的答案。如图所示:3.设计void Merge(int a[],int start,int mid,int end){ int i=start,j=mid+1,k=start;原创 2021-04-19 15:09:23 · 222 阅读 · 0 评论 -
检索算法
1.问题 在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0。2.解析 主要有两种比较简单的算法实现:顺序查找算法和二分查找算法。 1.顺序查找算法:顾名思义,根据数值,一个个在有序数组中查找数据,找到即输出,利用for循环遍历即可。 2.二分查找算法:与日常应用有关,当给你一个有序区间时,一般都是从最中间的数开始猜起,不断地寻找合适的区间,大了就在大的区间继续二分,小了就在小区间继续二分,效率会比顺序查找高得多。3.设计1.顺序查找原创 2021-03-22 21:34:27 · 665 阅读 · 0 评论 -
用Floyd算法和Dijkstra算法解决最短路径问题
1.问题求解图中一个节点到其他所有节点的权值最短的路径即最短路径。包括单源最短路径问题——从某固定源点出发,求其到所有其他顶点的最短路径以及多源最短路径问题——求任意两顶点间的最短路径。2.解析最短路径问题可以分为两类,单源最短路径问题——从某固定源点出发,求其到所有其他顶点的最短路径以及多源最短路径问题——求任意两顶点间的最短路径。解决其问题有多种算法,今天介绍两种算法,floyd算法适用于多源最短路径问题,dijkstra算法适用于单源最短路径问题。Floyd算法:Dijkstra算法:原创 2021-03-22 21:30:04 · 481 阅读 · 0 评论 -
最小生成树的两种算法实现
1.问题如何求一个包含有原图所有n个结点的且所有边的代价和最小的极小连通子图。2.解析构造最小生成树有两种算法模式。第一种是Kruskal算法。它的要点就是选边。即从最短的边开始生成森林,最后连成树。简单的步骤:1.图中的所有边按权重从小到大排序;2.图中的n个顶点看成独立的n棵树组成的森林;3.按权重从小到大选择边,所选的边连接的两个顶点应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。4.重复3,直到所有顶点都在一颗树内或者有n-1条边为止。以下面为例。所有原创 2021-03-15 00:12:58 · 10417 阅读 · 2 评论