- 博客(12)
- 收藏
- 关注
原创 图的m着色问题
图的m着色问题1、问题给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。2、解析深度优先搜索回溯设G有n个顶点,将顶点编号为1,2,…,n,则搜索空间为深度n的叉完全树,将颜色编号为1,2,…,m,结点<x1,x2,…,xk>(x1,x2,…xk∈{1,…,m},1≤k≤n)表示顶点1的颜色,顶点2的颜色x2,…,顶点k的颜色xk。过程:用图的邻接矩阵a表示
2021-06-16 00:05:49 416 3
原创 最优前缀码
最优前缀码 哈夫曼编码1、问题2、解析最优二元前缀码:每个码字平均使用二进制位数最小的前缀码。哈夫曼算法:构造最优前缀码的贪心算法哈夫曼过程: - pop:从队列中取出两个权值最小的孩子节点 - push将取出的两个子节点权值相加构成一个新权值的节点作为其父节点,并放入队列中 - 不断重复,直到n-1次后形成哈夫曼树实例:【5,5,10,10,10,15,20,25】pop:取出最小两个子节点,5、5,push:权值相加,并形成一个新节点,权值为10,放入队
2021-06-15 22:03:27 1791 1
原创 LCS算法和背包算法
LCS算法和背包算法1.问题1.LCS问题:给定序列X=<x1,x2,…,xm>,Y=<y1,y2,…,y3>,求X和Y的公共子序列2.背包问题:一个旅行者准备随身携带一个背包,可以放入背包的最大重量限制是b,怎么选择放入背包物品以使得背包的价值最大2.解析LCS问题:Xi=<x1,x2,…,xi>Yi=<y1,y2,…,yj>Zk=<z1,z2,…,zi>如果Zk是Xi和Yj的最长公共子序列假设当前是最优状态值为C[i
2021-06-10 02:24:22 127
原创 矩阵链乘法
1.问题设A1,A2,…,An为n个矩阵的序列,元素都为整数且已知矩阵大小。如果要计算所有矩阵的乘积A1 * A2 * A3 … Am,最少要多少次整数乘法?2.解析暴力搜索(范围太大时会超时)动态规划法:1.刻画一个最优解的结构特征2.递归地定义最优解的值3.计算最优解的值,通常采用自底向上的方法从最底层的小区间开始逐个合并,最后合并到最大的区间。4.利用计算出的信息构造一个最优解3.设计4.分析5.源码...
2021-06-06 00:56:39 206
原创 投资最优问题
1.问题一般性描述:设m万元钱,n项投资,函数fi表示将x万元投入第i项项目所产生的效益,i=1,2,…,n.问:如何分配这m元钱,使得投资的总效益最高?组合优化问题:假设分配给第i个项目的钱数是x_i,问题描述为:目标函数:max{f1(x1)+f2(x2)+…+f3(x3)}约束条件:x1+x2+…+xn=m,xi∈\in∈n实例投资效益表(m=5,n=4)2.解析设Fk_kk(x)表示x万元投资给前K个项目的最大收益,k∈\in∈[1,2,…,n]设xk_k
2021-06-05 17:39:37 525
原创 选第k小元素
选第k小元素:特定分治策略1.问题在一个无序数组中寻找第k小的元素2.解析选择select:选取一个元素m*作为主元分区partiton:根据m划分序列,使得m左边的元素都比它小,右边的元素都比它大.左边部分序列记为S1,右边部分序列记为S2分治divide:根据给定的第k小,若m左边的元素数量大于k,那么可在S1部分寻找第k小的元素,若左边的元素数量小于k,那么可在S2寻找第k小的元素。若k=S1+1,则m就是所要寻找的第k小的数。递归recursion:若k!=S1+1,则重复d
2021-04-22 14:41:49 136
原创 最近对问题
最近对问题EfficientClosetPair(P,Q)1.问题令P为笛卡几平面上n>1个点构成的集合,假设每个点都不一样,给定每个点的坐标,找出最近两个点的距离。2.解析输入:输入n>=2个点的坐标,按x轴坐标升序排序,得到数组P;按Y轴坐标升序排序,得到数组Q输出:最近点对之间俺的欧几里得距离蛮力算法:一一枚举两个点对,得到最小距离的点对,时间复杂度为O(N^2)分治求解法divide:将n个元素从中间n/2分开,分为[left,n/2]和[n/2+1,rig
2021-04-17 15:45:15 315
原创 二分归并排序
二分归并排序Mergesort1.问题对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k2.解析归并排序是通过分治divide和归并merge的思想来实现的一种算法。divide:将n个元素从中间n/2分开,分为[left,n/2]和[n/2+1,right]merge:通过指针来比较当前两个元素的大小然后移动指针,然后根据排序要求逐个加入到另外的数组中,归并后再赋值给原数组。3.设计#include<bits/stdc++.h>using namespace st
2021-04-05 23:53:55 186
原创 检索算法:顺序查找+二分查找
1.问题在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T中的下标j;如果x不在T中,输出j=0.2.解析3.设计顺序查找:for(int i=0;i<n;i++){ if(x==T[i]) printf("%d",i);}if(i==n){ printf("该数不在数组中"); }4.分析5.源码...
2021-03-24 15:54:32 225
原创 最短路径问题:Floyd+Dijkstra算法
Floyd:求各顶点间的最短路径1.问题用Floyd算法求解下图各个顶点的最短距离2.分析Floyd算法原理:首先假设a(i)(j)是节点i到节点j的最短距离假设,然后对于每一个节点k,我们判断a(i,k) + a(k,j) < a(i,j)是否成立,若成立,则a(i,j) = a(i,k) + a(k,j),说明从i到k再到j的路径比i直接到j的路径短。当我们遍历完所有节点k,a(i,j)中记录的便是i到j的最短路径的距离。算法描述:1.从任意一条单边路径开始,所有两点之间的距离是边的权
2021-03-22 17:11:10 124
原创 最小生成树 Prim+Kruskal
最小生成树:Prim+Kruskal算法1.问题在某地分布着6个村庄,现在需要在6个村庄之间修路,每个村庄之前的距离不同,问怎么修最短的路,将各个村庄连接起来。2.解析Prim算法:在一个加权连通图中,顶点集合V,边集合为E随机选择一个初始顶点,标记为visit,计算所有与之相连接的点的距离,选择距离最短的边权dest,标记为visit.重复以上操作,直到所有点都被标记为visit。Kruskal算法:1.将每个顶点V放入其自身的数据集合中。2.按照权值Weight的升序来选择边
2021-03-14 19:10:01 246
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人