![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法设计与分析
文章平均质量分 59
EdmondYoung
这个作者很懒,什么都没留下…
展开
-
迪卡斯特拉算法
求单源最短路径的迪卡斯特拉算法,同样直接上代码了,注意与FLOYD算法的比较package oj;/** * * @author pc *找出从端点0到其他端点的最短路径 */public class DIJKSTRA { public static void dijkstra(int[][] V,int n){ int[] X={0}; int[] Y=new原创 2015-08-09 10:50:29 · 1442 阅读 · 0 评论 -
矩阵链相乘
同样是家喻户晓的一个动态规划问题,题目我就不叙述了,不清楚的朋友可以看算法设计p135页算法7.2package oj;/** * * @author pc *矩阵链乘法,a[n+1]用来表示各个矩阵的规模,其中若t<n,则a[t]表示t+1号矩阵的行数,若t=n,则a[t]表示第n个矩阵的列数 */public class MATCHAIN { public static原创 2015-08-02 09:01:36 · 396 阅读 · 0 评论 -
FLOYD算法
图论中的FLOYD算法,同样是动态规划的简单例子/** * * @author pc * FLOYD算法 ,n*n的矩阵,对有向图中的边(i,j)长度为l[i][j],若不可达则l[i][j]=9999 * */public class FLOYD { public static void floyd(int[][] map,int n){ for(int k=0;k<原创 2015-08-02 09:01:25 · 216 阅读 · 0 评论 -
01背包问题
{0,1}背包问题s[0..n-1],v[0..n-1]表示n个物品的大小与价值,c表示背包的总容量 输出V,V[i][j]表示对于不大于i的物品以及不大于j的背包容量所获得的最大价值,i=0时表示没有任何物品被选中,j=0表示背包容量为0public class KNAPSACK { public static int knapsack(int[] s,int[] v,int原创 2015-08-02 09:02:21 · 281 阅读 · 0 评论 -
两数组中项问题
算法设计技巧与分析p126习题6.27 *设A,B[1...n]是两个已排过序互不相同的整数组成的数组,给出一个有效的算法找出两个数组中2n个元素的中项注意原来题目要求数组中元素各不相同,我们发现其实没有这个条件算法依旧可以运行,代码如下public class MIDDATA { public static Map findMid(int[] a,int[] b,int l原创 2015-08-01 16:16:46 · 578 阅读 · 0 评论 -
两种生成全排列序列的方法
算法设计技巧与分析第五章介绍了两种生成全排列的方法,第一种是固定数组位置(即首位),将不同的数放到这个位置上,第二种是每次选取序列的最后一个数,放到数组的不同位置上,我们的代码给出了这两者算法的实现public class PERMUTATIONS15_7 { static int count=0; public static void perml(int[] a,int m){原创 2015-08-01 16:29:32 · 740 阅读 · 0 评论 -
SPLIT划分算法
算法设计技巧与分析p113算法6.5利用数组的第一个元素对数组进行划分,在快速排序时会用到本算法。public class SPLIT6_5 { public static int split(int[] a,int low,int high){ int i=low; int x=a[low]; for(int j=low+1;j<=high;j++){ if(a[j]<原创 2015-08-01 16:02:50 · 4732 阅读 · 0 评论 -
寻找多数元素
多数元素是指在数组中出现次数大于等于数组数目一半的元素,我们的算法首先得出这样一个候选元素,然后一遍扫描数组,查看是否是多数元素。/** * * @author pc *找出数组中最多的那个元素 *两种方法分为递归版与非递归版 */public class MAJORITY { public static int majority(int a[]){ int count原创 2015-08-01 16:39:10 · 670 阅读 · 0 评论 -
最近点对问题(欧几里得算法)
算法设计技巧与分析p123算法6.7这是一个相当有难度的问题,给出n个点在O(nlogn)的时间复杂度内求出距离最近的两点间的距离,具体分析可以参考书本,用到了分治的思想,另外,注意每个点最多只需要和临近的7个点相比较就能求出最近距离,这是本算法的一个关键之处。/** * * @author yyd * 欧几里得算法得出平面上举例最近的两个点 * */class Point原创 2015-08-01 16:10:14 · 671 阅读 · 0 评论 -
MINMAX问题
算法设计技巧与分析102页算法6.1利用分治的思想从数组中找出最大值与最小值,时间复杂度为O(logn).算法很简单就不多说了,直接上代码吧/** * * @author yyd * 在(n)时间复杂度内求出某个输入数组的最大数与最小数 * */public class MINMAX6_1 { public static Map minmax(int a[],int原创 2015-08-01 15:57:24 · 3354 阅读 · 0 评论 -
整数幂的求值
求解某个数的n次幂,利用归纳的思想,在O(nlogn)时间复杂度内得出答案class POWER5_4 { public static int power(int m,int p){ if(p==0) return 1; else{ int y=power(m,p/2); y=y*y; if(p%2==1){ y=m*y; } retu原创 2015-08-01 16:25:50 · 286 阅读 · 0 评论 -
选择排序
算法设计技巧与分析第五章归纳法,算法5.1选择排序的归纳形式,算法依然很简单,直接上代码/** * * @author yyd * 一个利用尾递归来完成选择排序的程序 * */public class SELECTSORTREC5_1 { public static void selectSort(int[] a,int i){ if(i<a.length-1){原创 2015-08-01 16:21:32 · 247 阅读 · 0 评论 -
递归实现的二分搜索
算法设计技巧与分析p104页算法6.2,思想就不说了,注意一些细节就可以了public class BINARYSEARCH6_2 { public static int search(int a[],int element,int low,int high){ if(high>=low){ int mid=(low+high)/2; if(a[mid]==element原创 2015-08-01 15:59:42 · 265 阅读 · 0 评论 -
PRIM算法
同样是求最小生成树的PRIM算法,废话不多说了,直接上代码吧package oj;class Edge2{ int x1; int x2; int len; public Edge2(int x1, int x2, int len) { this.x1 = x1; this.x2 = x2; this.len = len; } public int getX1(原创 2015-08-09 10:48:18 · 465 阅读 · 0 评论 -
KRUSKAL算法
图的KRUSKAL算法是用以求解最小生成树的一种有效算法,每次从待选的边中选出最短的那一条边,加入到已有的树中,读者可以与PRIM算法相比较他们之间的异同,下面是代码,该代码利用堆排序以求能在较短时间内取出最短的那一条边。package oj;class Edge{ int x1; int x2; int len; public Edge(int x1, int x2, int原创 2015-08-09 10:42:32 · 346 阅读 · 0 评论 -
字符串的最长公共子序列问题
算法设计技巧与分析第七章p131算法7.1这应该是广为人知的一个动态优化的例子了,无论是算法导论还是本书,都曾广泛的提到过这个问题,关键在于理解以下公式L[i,j] =0 i=0或j=0 =L[i-1,j-1] i>0,j>0且a[i]=b[j]原创 2015-08-02 09:03:11 · 288 阅读 · 0 评论