
算法
文章平均质量分 79
Andy01_
欲戴其冠 必承其重
展开
-
图的m着色问题(DFS回溯算法)
1. 问题图的m着色问题。给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答 “NO”“NO”“NO” 。2. 解析设 GGG 有 nnn 个顶点,将顶点编号为 1,2,…,n1,2,…,n1,2,…,n 则搜索空间为深度 nnn 的 mmm 叉完全树,将颜色编号为 1,2,…,m1,2,…,m1,2,…,m,结点 <x1,x2,…xk>(x1,x2,…xk∈{1,…,m},1≤k原创 2021-06-14 17:51:41 · 730 阅读 · 0 评论 -
最优前缀编码 哈夫曼算法
1. 问题给定字符集 C=<x1,x2,...,xn>C=<x_1,x_2,...,x_n>C=<x1,x2,...,xn> 和每个字符的频率 f(xi)f(x_i)f(xi),求关于 CCC 的一个最优前缀码。2. 解析构造最优前缀码的贪心算法就是哈夫曼算法pop:pop:pop: 每次从队列中取出两个权值最小的节点当作孩子节点push:push:push: 根据 poppoppop 操作取出的两个子结点,构成一个带有新的权值(两个子结原创 2021-06-14 17:34:52 · 1360 阅读 · 0 评论 -
装载问题(01背包)
1. 问题装载问题,给定 nnn 个 wiw_iwi 的集装箱和有最大装载量 CCC 的轮船,问最多能装几个集装箱。2. 解析3. 设计装载问题#include<bits/stdc++.h>const int N = 1e3+10;using namespace std;int n,m,k;int w[N];int dp[N],pre[N][N];/** * 打印装载方案 */void print() { cout<<"\nthe ma原创 2021-06-14 14:02:21 · 151 阅读 · 0 评论 -
矩阵链乘法
1. 问题2. 解析bottom−up:bottom-up:bottom−up: 自底向上。从最底层的小区间开始逐个合并,最后合并到最大的区间。divide:divide:divide: 区间的分割。根据分割点k,我们可以分割为两个区间,例如 [i,j][i,j][i,j] 可以分割为 [i,k][i,k][i,k] 和 [k+1,j][k+1,j][k+1,j] 两个区间。transfer:transfer:transfer: 状态的转移,或可以说是区间的合并。由于 [i,k][i原创 2021-05-01 19:34:01 · 232 阅读 · 0 评论 -
动态规划求解投资最优问题
1. 问题一般性描述:设 mmm 元钱,nnn 项投资项目,函数 fif_{i}fi 表示将 xxx 元投入第i项项目所产生的效益,i=1,2,⋅⋅⋅,ni=1,2,···,ni=1,2,⋅⋅⋅,n问:如何分配这 mmm 元钱,使得投资总效益最高?组合优化问题:假设分配给第i个项目的钱数是 xix_{i}xi目标函数:max(f1(x1)+f2(x2)+⋅⋅⋅+fn(xn))max({f_1(x_1)+ f_2(x_2)+···+ fn(x_n)})max(f1(x1)+原创 2021-04-25 18:43:44 · 1590 阅读 · 0 评论 -
分治策略找第K小元素
1. 问题使用特定的分治策略去寻找无序数组中第 kkk 小的元素。2. 解析select:select:select: 我们每次会挑选一个主元 pivotpivotpivot 。这里有多种选择策略,这里我们选择挑取序列第一个。partition:partition:partition: 根据 pivotpivotpivot 划分序列。保证 pivotpivotpivot 左边元素均比它小,右边元素均比它大 。divide:divide:divide: 分治策略。我们根据给定的要原创 2021-04-19 23:02:49 · 2131 阅读 · 0 评论 -
平面最近点对算法 ClosestPair
1. 问题平面最近点对问题,给定一个平面内所有点的坐标,找出这些点中最近的两个点的距离。2. 解析朴素暴力算法:求解平面最近点对问题,需要枚举两个点对,然后记录最小的点对距离,故总时间复杂度为 O(N2)O(N^2)O(N2)分治法求解最近点对:DivideDivideDivide:将当前的集合问题转化为两个子集合问题,即将当前 [l,r][l,r][l,r] 的集合分割成 [l,mid][l,mid][l,mid] 和 [mid+1,r][mid+1,r][m原创 2021-04-13 21:35:06 · 1337 阅读 · 0 评论 -
归并排序 MergeSort
1. 问题使用归并排序对 nnn 个不同的数构成的数组 A[1..n]A[1..n]A[1..n] 进行排序,其中 n=2kn=2^kn=2k。2. 解析归并排序通过分治和有序表归并的思想,可以通过递归实现,是一种稳定的排序算法。DivideDivideDivide:将当前的元素分成两份,即将 [L,R][L,R][L,R] 区间的元素分割成 [L,mid][L,mid][L,mid] 和 [mid+1,R][mid+1,R][mid+1,R]。MergeMergeMerge:原创 2021-03-29 20:07:03 · 118 阅读 · 0 评论 -
检索算法 BinarySearch + InterpolationSearch
1. 问题在有序数组 T[1...n]T[1...n]T[1...n] 中查找 xxx如果 xxx 在 TTT 中,输出 xxx 在 TTT 的下标 jjj如果 xxx 不在 TTT 中,输出 j=0j = 0j=02. 解析二分查找算法:二分查找通过将当前查询区间一分为二的思想进行查找,由于 xxx 必然在当前查询区间中,那么我们通过左边界 LLL 和 RRR 可以确定分割点为 mid=(L+R)/2mid = (L+R)/2mid=(L+R)/2 ,那么 xxx 必然在分割点原创 2021-03-25 17:11:13 · 141 阅读 · 0 评论 -
最短路 Floyd + Dijkstra
1. 问题在一给定的有向图 G<V,E>G<V, E>G<V,E> 中,V代表点集,E<u,v,w>E<u, v,w>E<u,v,w> 代表连接顶点 uuu 与顶点 vvv 且边权为w的边集。给定顶点 SSS 和起点 EEE,要求出 SSS 点到 EEE 点的总权值的最小路径,即最短路问题。用FloydFloydFloyd 算法求解下图各个顶点的最短距离,并求得距离矩阵(顶点之间的最短距离矩阵)。对于下图使用 Dijks原创 2021-03-17 08:41:55 · 131 阅读 · 0 评论 -
最小生成树 Prim + Kruskal
1. 问题在一给定的无向图G<V,E>G<V, E>G<V,E> 中,E<u,v>E<u, v>E<u,v> 代表连接顶点 uuu与顶点 vvv 的边,而 W<u,v>W<u, v>W<u,v> 代表此边的权重。若存在 TTT 为 EEE 的子集且为无环图,使得的 W(T)W(T)W(T) 最小,即需要找到一颗最小权重生成树(简称最小生成树)。2. 解析PrimPrimPrim 算法:开始随机选原创 2021-03-09 14:13:12 · 292 阅读 · 0 评论