
算法设计与分析课
文章平均质量分 78
深海鱼肝油ya
在读盐焗生,北境第一深情,吉他爱好者。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
kmp算法(快速子字符串匹配)的next数组理解
因为没什么时间,所以本文只是匆匆记述了此时的感悟对于next数组的理解心得:也就是next数组相当于一个转化函数,当遇到某个位置不匹配就找next数组对应的位置,看如何滑动子串。因为根本不需要看主串,只看子串就可以了,所以next数组记录的就是当前不匹配的配置让子串当前不匹配位置之前的哪个字符位置滑动过来(因为子串是要往后走的,即走多少停止)eg:子串s[]="0ababeopr"(假设初始下标为1开始记录子串),假设s[5]处出现不匹配,也就是前四个(abab)都匹配,此时应找匹配字符原创 2020-08-21 11:37:44 · 1996 阅读 · 0 评论 -
BFS(JAVA版讲解)
可以先refer to这篇C++版文章 广度优先搜索(Breadth First Search , BFS)遍历类似于树的按层次遍历的过程,则是以广度为第一关键词,当碰到岔道口时,总是先依次访问从该岔道口能直接到达的所有结点,然后再按这些结点被访问的顺序去依次访问它们能直接到达的所有结点,以此类推,直到所有结点都被访问为止。广度优先搜索的整个算法过程很像一个队列,因此,广度优先搜索一般由...原创 2020-02-07 00:02:52 · 11145 阅读 · 8 评论 -
(回溯剪枝)0/1背包详解
基本思路:要选择的物品有两种状态,选或者不选,很明显这是一个子集问题,所以递归部分参照子集模板修改,选了物品i就i+1,tw+w[i],tv+v[i]到下一层,不选就不变光i+1到下一层,然后每个子集(叶子节点)都比较得出的tv(价值),最后得出最优解(最大价值)。本文测试样例:5 102 62 36 55 44 6输出样例:15子集树:递归(回...原创 2019-11-02 13:44:50 · 2521 阅读 · 4 评论 -
(回溯法)求所有子集
相关数学知识:子集个数公式:n个元素就有2^n个子集,因为每个元素在子集中只有两种状态:有或没有 。代码如下:今天在研究最佳调度问题时突然加深理解了子集和回溯,其实dfs里else中的代码可以替换成如下代码,一样行得通。for(int j=0;j<2;j++){//j代表有几种选择 x[i]=j; dfs(a,n,i+1,x);}import java.ut...原创 2019-11-01 17:35:24 · 1861 阅读 · 0 评论 -
(分治法)快速排序
手写快排比Java自带的Arrays.sort()快吗?代码如下:public class quick_sort { //输出函数 static void disp(int[] a,int n){ int i; for(i=0;i<n;i++){ System.out.print(a[i]+" "); } System.out.println()...原创 2019-10-31 15:20:27 · 1549 阅读 · 0 评论 -
(分治法)查找最大和次大元素
这道题本来是C的源码,但是Java没有指针,不能在函数里修改参数的值,所以只能把两个变量放到一个1*2的数组里,用可以改变数组元素值的方式来改变变量值!java里除了用final定义的变量,其他的变量值都可以修改!代码如下:public class 查找最大和次大元素 { //java不提供指针,所以不能在函数里修改变量的值 static void solve(in...原创 2019-10-31 13:18:56 · 3435 阅读 · 2 评论 -
开始慢慢理解递归原理
看算法设计与分析课本!递归的过程就是入栈出栈的过程!先以阶乘递归函数作为形象示例:系统栈变化过程:贴个代码说明:代码是利用递归在一个数组中找到最大元素,从后往前搜索,两两对比,前一个赋值为较大的值,然后fmax(a,i-1),继续往前比较,直到a[0]为最大值。public class 数组中的最大元素 { //方式1 static int fmax1(i...原创 2019-10-31 11:39:49 · 938 阅读 · 1 评论 -
N皇后问题——递归
在n×n格的国际象棋上摆放n个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。思路:可暴力破解,这里采用递归(dfs)#include<iostream>#include<cmath>using namespace std;#define N 20 //最大皇后个数 int q[N]; //存放各皇后所在的列号,...原创 2019-04-24 20:47:11 · 1595 阅读 · 2 评论 -
任务分配——回溯法
有n个任务需要分配给n个人执行,每个任务只能分配给一个人,每个人只能执行一个任务,第i个人执行第j个任务的成本是c[i][j](1<=i,j<=n)。求出总成本最小的一种方案。思路:解空间为子集树,用回溯法(dfs)搜索所有方案取最优解//解空间为子集树#include<iostream>#include<cstring>using namesp...原创 2019-04-23 21:21:51 · 5306 阅读 · 1 评论 -
N个数的全排列——回溯法
有一个含N个整数的数组a,所有元素均不相同,求其所有元素的全排列思路:问题的解空间为排列树,一个排列中元素不能重复,故采用交换的方式,对于排列树的第i层,扩展状态是a[i]可以取a[i]到a[n-1]的任何元素,即j=i到n-1循环;将a[i]与a[j]交换,在这种方式下求出排列后需要恢复,即将a[i]与a[j]再次交换,回到之前的状态(回溯),然后继续求其他排列。样例代码为求{1,2,3...原创 2019-04-26 21:26:07 · 4939 阅读 · 0 评论