算法设计与分析
n0th1n9
这个作者很懒,什么都没留下…
展开
-
快速排序-递归与分治
1:代码实现#include <bits/stdc++.h>using namespace std;int Partition(int a[], int low, int high){ a[0] = a[low]; while(low < high) { while(low < high && a[0] <...原创 2018-03-22 19:30:46 · 270 阅读 · 0 评论 -
最小生成树-Prim算法-贪心
问题描述:设G = (V, E) 是无向连通带权图, 即一个网络。E的每条边(v, w)的权为c[v][w]。如果G的一个子图G1是一棵包含G所有顶点的树,则称G1为G的生成树。生成树上各边权的总和称为该生成树的耗费。在G的所有生成树中,耗费最小的生成树称为G的最小生成树。解法:1:Prim算法思路:设U为已并入最小生成树中的顶点集合,最初任选一点放入U,之后找U到V-U中的最小边,将对应新顶点并...原创 2018-05-04 13:39:23 · 2152 阅读 · 0 评论 -
装载问题(最优装载问题变形)-回溯法-深度搜索
问题描述:有n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且∑wi <= c1 + c2。问是否有一个合理的装载方案,可将这n个集装箱装上这2艘轮船。如果有,找出一种装载方案。问题分析:如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。(1)首先将第一艘轮船尽可能装满;(2)将剩余的集装箱装上第二艘轮船。将第一艘轮船尽可能装满等价于选取全体集装箱的一...原创 2018-05-04 16:32:07 · 24466 阅读 · 5 评论 -
汽车加油问题-贪心
问题描述: 一辆汽车加满油后可行驶nkm 。旅途中有若干个加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。编程任务: 对于给定的n和k个加油站位置,编程计算最少加油次数。数据输入: 第1行有2个正整数n和k,表示汽车加满油后可行驶nkm,且旅途有k个加油站。接下来的一行中,有k+1个整数,表示第k个加油站与第k-1个加油站之间的距离。第0个加油站表示出发地,汽车已加...原创 2018-05-11 11:24:58 · 2995 阅读 · 0 评论 -
独立任务最优调度问题-动态规划
问题描述:用2台处理机A和B处理n个作业。设第i个作业交给机器A处理时需要时间ai,若由机器B来处理,则需要时间bi。由于各作业的特点和机器的性能关系,很可能对于某些i,有ai>bi,而对于某些j,j≠i,有aj>bj。既不能将一个作业分开由2台机器处理,也没有一台机器能同时处理2个作业。设计一个动态规划算法,使得这2台机器处理完这n个作业的时间最短(从任何一台机器开工到最后一台机器停...原创 2018-04-27 14:38:57 · 15927 阅读 · 6 评论 -
单源最短路径-Dijkstra-贪心
问题描述:给定一个带权有向图G = (V, E), 其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算源到所有其他各定点的最短长度。这里路的长度是指路上各边权之和。这个问题通常成为单源最短路径问题。算法基本思想:设置顶点集合S并不断的做贪心选择扩充这个集合。S存放已经找到最短路的点的集合。算法流程:(1)设置一集合S存放已经找到最短路的点的集合。(2) 将源点并入S, 初始化...原创 2018-04-27 17:32:49 · 1233 阅读 · 0 评论 -
0-1背包问题 - 回溯法 - 深度搜索
算法描述:0-1背包问题是子集选取问题。一般情况下,0-1背包问题是NP难得。0-1背包问题的解空间可用子集树 表示。在搜索解空间的时,只要其左儿子节点是一个可行节点,搜索就进去其左子树(约束条件)。当右子树中可能包含最优解时才进入右子树搜索(限界函数)。否则就将右子树剪去。计算右子树中解的上界的更好方法是将剩余物品依其单位重量价值排序,然后依次装入物品,直至装不下时,再装入物品的一部分而装满背包...原创 2018-05-06 11:35:47 · 1996 阅读 · 2 评论 -
图的m着色问题-回溯法-深度搜索
问题描述:给定无向连通图G=(V, E)和m种不同的颜色,用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中相邻的两个顶点有不同的颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的两个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。算法设计:回溯法: 如果会了装载问题 和 0-1背包的回溯解法,这个题...原创 2018-05-06 12:56:55 · 3855 阅读 · 0 评论 -
旅行售货员问题-回溯法-深度搜索
问题描述:某售货员要到若干城市去推销商品,已知各城市之间的路程,他要选定一条从驻地出发,经过每个城市一遍,最后回到住地的路线,使总的路程最短。算法描述:回溯法,序列树, 假设起点为 1。算法开始时 x = [1, 2, 3, ..., n]x[1 : n]有两重含义 x[1 : i]代表前 i 步按顺序走过的城市, x[i + 1 : n]代表还未经过的城市。利用Swap函数进行交换位置。若当前搜...原创 2018-05-06 16:33:40 · 20964 阅读 · 0 评论 -
单源最短路径-分支限界法-优先队列式分支限界法-Dijkstra
问题描述:给定一个带权有向图G = (V, E), 其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算源到所有其他各定点的最短长度。这里路的长度是指路上各边权之和。这个问题通常成为单源最短路径问题。解法:用优先队列式分支限界法,代码核心跟贪心的Dijkstra算法差不多相同,要首先学会使用优先队列的使用。贪心的Dijkstra算法实现见Dijkstra算法实现代码:#incl...原创 2018-05-25 11:18:42 · 10835 阅读 · 2 评论 -
装载问题-分支限界法-队列式分支限界法
装载问题实质: 装载问题是一个子集选取问题,因此其解空间树是一颗子集树。这里实现队列式分支限界法,对难理解地方做了注释。#include <bits/stdc++.h>using namespace std;typedef struct QNode{ QNode *parent; int lchild; int weight;}QNode;int n;...原创 2018-05-25 16:53:28 · 8981 阅读 · 0 评论 -
装载问题-分支限界法-优先队列式分支限界法
装载问题实质: 装载问题是一个子集选取问题,因此其解空间树是一颗子集树。这里实现优先队列式分支限界法。如果你在用优先队列时用less关键字,发现生成的并不是优先队列 参考https://blog.csdn.net/m0_38015368/article/details/80461938#include <bits/stdc++.h>using namespace std;class...原创 2018-05-26 15:28:58 · 10286 阅读 · 0 评论 -
优先队列分支限界法解0-1背包问题
0-1背包问题都非常熟悉了,下面直接给出优先队列分支限界法解0-1背包问题的代码:#include <bits/stdc++.h>using namespace std;class Object{public: int id; int weight; int price; float d;};class MaxHeapQNode{publ...原创 2018-05-27 12:12:51 · 8691 阅读 · 0 评论 -
哈夫曼编码-贪心
哈夫曼树的定义:n个叶结点,权分别为w1,w2,···,wn的二叉树中,带权路径长度WPL最小的二叉树叫哈夫曼树(Huffman Tree ), 即:最优二叉树 哈夫曼原理:1)将字符集中每个字符c出现的频率f(c)作为权值2)根据给定的权值{w1,w2,···,wn}构造n个二叉树F={T1,T2,···,Tn}, 每个Ti只有一个根结点,权为wi。 3)在F中选取两棵根结点的权值最小的树构成...原创 2018-04-20 16:12:33 · 539 阅读 · 0 评论 -
最长公共子序列-动态规划
问题 : 给定2个序列X={x1,x2,…,xm}和 Y={y1,y2,…,yn},找出X和Y的最长公共子序列。动态规划的基本思想:如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。动态规划的基本步骤:1、找出最优解的性质,并刻画其结构特征。2、递归地定义最优值。3、以自底向上的方式计算最优值。4、根据计算最优值时得到的信息,构造最优解...原创 2018-04-06 17:30:55 · 613 阅读 · 0 评论 -
棋盘覆盖问题-分治策略
在一个2^k×2^k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。问题: 用4种不同形态的L型骨牌, 覆盖给定特殊棋盘上除特殊方格以外的所有方格,且任何2个不得重叠。1 : 代码求解#include <bits/stdc++.h>using namespace std;const int MAX = 100;int Board[M...原创 2018-03-20 20:50:48 · 3633 阅读 · 0 评论 -
2-3 改写二分搜索算法
设a[0 : n - 1]是已排好序的数组。请改写二分搜索算法,使得当搜索元素 x 不在数组中时,返回小于 x 的最大元素的位置 i 和大于 x 的最小元素位置 j。当搜索元素在数组中时,i 和 j 相同,均为 x 在数组中的位置。测试数据(自己写的):61234567输出 :i = 5 , j = -16123456-1输出 :i = -1 , j = 061235674输出 :i = 2 , ...原创 2018-03-25 15:20:45 · 5162 阅读 · 1 评论 -
2-8 数组换位问题
设a[0 : n-1]是一个有n个元素的数组,k(0<= k <= n - 1)是一个非负整数。 试设计一个算法将子数组a[0 : k - 1]与a[k , n - 1]换位。要求算法在最坏情况下耗时O(n),且只用到O(1)的辅助空间。解析:使用三次翻转法:核心代码void reverse(int *a, int begin, int end){ int temp; ...原创 2018-03-25 17:07:15 · 831 阅读 · 0 评论 -
矩阵连乘问题-动态规划
问题描述:给定n个矩阵:A1, A2, ... , An,其中Ai与Ai+1是可乘的,i = 1,2 ...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数据为矩阵个数和每个矩阵规模,输出结果为计算矩阵连乘积的计算次序和最少数乘次数。递推关系:m[i][j] = 0, ...原创 2018-04-08 11:16:04 · 600 阅读 · 0 评论 -
归并排序(合并排序)-递归与分治
1:代码部分:#include <bits/stdc++.h>using namespace std;const int MAX = 100;void Merge(int a[], int left, int mid, int right){ int t_pos = 0, low = left, high = mid + 1; int lenth = right...原创 2018-03-21 20:53:59 · 1101 阅读 · 0 评论 -
流水调度问题-动态规划-Johnson法则-两种方法
问题描述:n个作业{0, 1, 2, …, n}在2台机器上M1 和M2 组成的流水线上完成加工。每个作业加工的顺序都是先在M1 上加工,后在M2 上加工。在两台机器上加工的时间分别为ai 和bi 。 确定这n个作业的加工顺序,使得从第一台作业开始加工,到最后一个作业完成加工所需要的时间最少。 递归关系:T(S, t) = min{ ai + T(S - {i}, bi) } 1 <= i...原创 2018-04-14 14:20:30 · 9215 阅读 · 2 评论 -
0-1背包问题详解-动态规划-两种方法
问题描述:给定n种物品和一背包。物品i的重量为wi,其价值为vi, 背包容量为c。问应如何选择装入背包中的物品,使得背入背包的物品的总价值最大?解析:此问题形式化的描述是,给定c > 0, wi, vi, 1 <= i <= n(c为背包容量), 要找出一个n元0-1向量(x1, x2, ... , xn),xi ∈ {0, 1}, 1 <= i <= n, 使得∑ ...原创 2018-04-14 19:51:45 · 10871 阅读 · 2 评论 -
2-9 合并子数组
设子数组a[0:k-1]和a[k,n-1]已经排好序(0<=k<=n-1).设计一个合并这两个子数组的排序好的数组a[0:n-1]的算法。要求算法最坏情况下所用的计算时间为O(n),且只用到O(1)的辅助空间。解析:用三次翻转循环右移,举个栗子:n = 10, k = 5, a[0 : 9] = {0, 2, 4, 6, 8, 1, 3, 5, 7, 9}0 < 1, 不翻转...原创 2018-03-27 19:27:26 · 2695 阅读 · 4 评论 -
线性时间选择问题-第k小(大)问题-递归与分治
问题:给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素。在线性时间内O(n)?解析:定义查找第k小元素的算法为 Select(Type a[], int p, int r, int k) 。将n个输入元素划分成n/5个组,每组5个元素,只可能有一个组不是5个元素。用任意一种排序算法,将每组中的元素排好序,并取出每组的中位数,共n/5个。递归调用算法select来找出...原创 2018-03-28 19:22:05 · 5106 阅读 · 0 评论 -
2-14 用分治策略构造Gray码
Gray码是一个长度为2^n的序列。序列中无相同元素,每个元素都是长度为n位的串,相邻元素恰好只有1位不同。用分治策略设计一个算法对任意的n构造相应的Gray码。#include <bits/stdc++.h>using namespace std;void GrayCode(int a[][100], int n, int len){ if(n == 0) ...原创 2018-03-28 20:52:58 · 5384 阅读 · 0 评论 -
最优装载-贪心算法
问题描述:有一批集装箱要装上一艘载重量为 c 的轮船。其中集装箱 i 的重量为 wi 。最优装载问题要求在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。解析:该问题形式化描述为: max∑xi, 1 <= i <= n ∑wixi <= c, 1 <= i <= ...原创 2018-04-17 23:09:46 · 1556 阅读 · 0 评论 -
最长单调递增子序列
问题:设计一个O(n^2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。方法一:最长公共子序列,动态规划。思路:1:将数组a复制到b; 2:对b排序; 3:对数组b去重(注意去重是必要的,因为要求单调递增),这里利用hash表去重。 4:求a, b数组的最长公共子序列。 求最长公共子序列方法见 https...原创 2018-04-22 13:15:08 · 1451 阅读 · 1 评论 -
排列问题-递归
问题描述:对输入的元素进行全排列。代码实现:#include <bits/stdc++.h>using namespace std;void InPut(int * &_list, int &n){ scanf("%d", &n); _list = (int *)malloc(sizeof(int) * (n + 1)); for(...原创 2018-06-04 20:52:07 · 280 阅读 · 0 评论