
算法实现与设计
文章平均质量分 68
『gorgeous』
这个作者很懒,什么都没留下…
展开
-
图的m着色问题
问题给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”解析考虑所有的图,讨论在至多使用m种颜色的情况下,可对一给定的图着色的所有不同方法。通过回溯的方法,不断的为每一个节点着色,在前面n-1个节点都合法的着色之后,开始对第n个节点进行着色,这时候枚举可用的m个颜色,通过和第n个节点相邻的节点的颜色,来判断这个颜色是否合法,如果找到那么一种颜色使得第n个节点能够着色,那么说明m种颜色的方案是原创 2021-06-06 10:23:13 · 190 阅读 · 2 评论 -
哈夫曼树及编码
1.问题最优前缀码问题给定字符集C={x1,x2,…,xn}和每个字符的频率f(xi),求关于C的一个最优前缀码解析2.解析构造最优前缀码的贪心算法就是哈夫曼算法哈夫曼编码:对于一颗具有n个叶子的哈夫曼树,若对树中的每个左分支赋予0,右分支赋予1,则从根到每个叶子的路径上,各分支的赋值分别构成一个二进制串,该二进制串就成为哈夫曼编码。哈夫曼树满足两条性质:性质1: 哈夫曼树是前缀编码。性质2: 哈夫曼树是最有前缀编码。 对于包含n个数据字符的文件,分别以它们出现的次数为权值构造哈夫曼树,则利原创 2021-05-31 09:17:44 · 469 阅读 · 0 评论 -
装载问题(0-1背包问题)
问题整数规划问题,0-1 背包问题解析思路:轻者先装,直到再装任何集装箱将使轮船载重量超过 C 时停止。定理:对于任何正整数 k,算法(轻者先装)对 k 个集装箱的实例得到最优解。证明: ( 数学归纳法)(1) k=1,只有1个集装箱,其重量小于C。 任何装法都只有一种方式,因此都是最优解,因此轻者先装也是最优解。(2)归纳假设:假设算法对于规模为 k的输入都能得到最优解。 考虑规模为k+1的输入,N= {i,2…,k+1},w.={w1,w2,w3…wk+1} …是集装箱 重量, w1≤原创 2021-05-24 09:58:18 · 299 阅读 · 0 评论 -
LCS和背包问题
问题最长公共子序列LCS给定序列X =< X1,X2,…,Xm >Y =< Y1,Y2,…,Yj >求X和Y的最长公共子序列。解析动态规划法Xi =< x1,x2,…,xi >Yj =< y1,y2,…,yj >Zk =< z1,z2,…,zk >如果Zk是Xi和Yj的最长公共子序列(1)xi=yj,那么zk=xi=yj,Zk-1是Xi-1和Yj-1的最长公共子序列(2)xi≠yj,zk≠xi,那么Zk是Xi-1和Yj的最原创 2021-05-18 23:50:24 · 120 阅读 · 0 评论 -
矩阵链乘法(动态规划)
问题描述问题:设A1,A2,……,An为n个矩阵的序列,其中Ai为Pi-1×Pi阶矩阵,这个矩阵链的输入用向量P=<P0,P1,……,Pn>给出。给定向量P,确定一种乘法次序,是的具备运算的总次数达到最小。解析Ai…j:表示矩阵链相乘的子问题AiAi+1…Aj;m[i…j]:表示得到乘积Ai…j所用的最少基本运算次数;假定,最后一次相乘发生在矩阵链Ai…k和Ak+1…j之间,即AiAi+1…Aj=(AiAi+1…Ak)(Ak+1Ai+2…Aj) k=i,i+1,…,j-1e.g.原创 2021-05-09 15:11:33 · 520 阅读 · 0 评论 -
投资问题(动态规划)C++
投资问题(动态规划)C++问题设m元钱,n项投资,函数fi(x)表示将x元投入到第i项项目中所产生的效益,i=1,2,3…n问:如何分配这m元钱,使得投资的总效益最高?解析假设分配给第 i 个项目的钱数是 xi,问题描述为:目标函数:max{f1(x1)+f2(x2)+…+fn(xn)}约束条件:x1+x2+…+xn=m,xi∈N;设Fk(x)表示x元投给前k个项目的最大效益,k=1,2,…,n,x=1,2,…,m递推方程:Fk(x)=max{fk(xk)+Fk-1(x-xk)}(0≤x原创 2021-04-26 17:09:02 · 1468 阅读 · 1 评论 -
选第k小元素:特定分治策略(JAVA)
选第k小元素:特定分治策略(JAVA)问题在一个数组S中查找第k小的元素并输出。解析以S中的某个元素m作为划分标准,将S划分为两个子数组S1和S2,把这个数组中比m小的都放入S1的数组中,数组S1的元素个数是|S1|个;把这个数组中比m*大的都放入S2的数组中,数组S2的元素个数是|S2|个。若k<|S1|,则原问题归纳为在数组S1中找第k小的子问题。若k=|S1|+1,则m*就是要找的第k小元素。若k>|S1|+1,则原问题归纳为在数组S2中找第n−|S1|−1小的子问题。原创 2021-04-19 16:56:37 · 602 阅读 · 0 评论 -
最近对问题(C++)
最近对问题(C++)问题问题描述:平面上有n个点P1,P2,…,Pn,n>1,Pi的直角坐标为(Xi,Yi),i=1,2,…,n.求距离最近的两个点及他们之间的欧几里得距离。解析一维情况为了简单化问题,我们先考虑一维情形,即所有的点都在x轴上(假如顺序是有序的,也可以排好序,为简单,直接输入有序序列),x轴上某个点m将集合划分为s1和s2,并且两个集合的点数都是相同的,递归的求解两个子集最近对的点,(p1,p2)和(q1,q2)。如果,两个集合的最近点对都在子集s1和s2中,则 dista原创 2021-04-12 19:43:03 · 957 阅读 · 0 评论 -
二分归并排序(C语言)
二分排序待写原创 2021-04-05 22:18:51 · 1478 阅读 · 0 评论 -
二分查找和普通排序(C语言)
二分查找和普通查找(C语言)问题写出两种检索算法:在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0.按实验模板编写,“分析”部分仅给出复杂度结果即可。解析想要从一个已经有序的数组,我们想要快速的找到其中特定值的所在位置,我们首先会想到普通的暴力遍历,优化一点的话,就会想到二分查找普通查找我们只需要从左往右依次遍历数组,和要查找的值进行比较,如果相同的话就返回下标核心代码为:void stupid(int a[],int num){原创 2021-03-26 17:10:32 · 216 阅读 · 0 评论 -
Floyd算法、Dijkstra算法最短路径问题(C语言)
Floyd算法、Dijkstra算法最短路径问题(C语言)问题给定一个已知各边权重的有向图,现要求指定点到图中各点的最短距离。解析Floyd算法假设采用矩阵存储图中各点到其余点的距离,Floyd算法的核心就是遍历其他点,看看直接从选中点直接到目标点的距离是否比从选中点途径其他点再到目标点的距离长,如果是的话就更新选中点对应的举证位置的值。Floyd算法的核心是:if(graph[i][j]>graph[i][k]+graph[k][j]){ graph[i][j] = graph[原创 2021-03-22 13:16:44 · 387 阅读 · 2 评论 -
Prim算法,Kruskal算法构造最小生成树(C语言)
Prim算法、Kruskal算法构造最小生成树(C语言)问题给定一个边权重的连通图,以点1为起点,构建一个能将图中所有定点连接起来,且边权重和最小的图。解析prim算法prim算法的核心是从起始点开始,每次选择到已有点路径距离最短的点连接,但不能成环。实现示意图如下:这样一个图我们选取点1为起始点:step 1:step2:step3:step4:step5:kruskal算法与prim算法的目的相同,但kruskal算法选择边,即每次选择图中权重最小的边,值得注意的是原创 2021-03-13 21:30:22 · 1241 阅读 · 0 评论