AlgorithmDesign
算法设计与分析课程算法思想及相关问题实现
tterminator
let the code say
展开
-
减治算法之寻找两个递增序列的中位数
一、问题描述寻找两个递增序列的中位数。本算法中只能解决两个序列长度规模相等的问题,若两个序列长度规模不相等,则可以先做合并后再寻找中位数。二、问题分析分别计算序列A,B的中位数a,b比较中位数a,b,会出现以下三种请款(1)a = b,直接返回结果a(2)a (3)a > b,两个序列的中位数只能出现在[b,a),在序列中A中删除a之后的元素形成新序列A,在原创 2016-03-24 10:26:24 · 3711 阅读 · 1 评论 -
动态规划算法之最长公共子序列问题
一、问题描述求两个字符序列的公共最长子序列。例如字符序列abcbdb和字符序列acbbabdbb的最长公共子序列为acbdb。二、问题分析用L[i][j]表示子序列xi和yj的最长公共子序列的长度,动态规划函数为L[i][j] = L[i - 1][j - 1] + 1, xi等于yj = max(L[i][j - 1], L[i - 1][j]),原创 2016-03-24 16:56:03 · 10323 阅读 · 1 评论 -
减治算法之寻找第K小元素问题
一、问题描述给定一个整数数列,寻找其按递增排序后的第k个位置上的元素。二、问题分析无三、算法代码public static int selectMinK(int [] arr, int low, int high, int k){ int index = pation(arr, low, high); if(index == k){ return arr[inde原创 2016-03-23 21:47:07 · 3137 阅读 · 1 评论 -
动态规划算法之01背包问题
一、问题描述给定n种商品,其中商品i的重量为wi,价值为vi。把这n种商品放入一个容量为c的背包,每种商品可以选择放入,也可以选择不放入。如何选择放入背包的商品,使背包中商品价值最大。二、问题分析考虑该问题的子问题,把该问题的解(x1,x2,......,xn)考虑为一个决策序列,依次决定x1是取1还是取0,其中1表示放入背包,0表示不放入背包。记v(i,j)表示将前i个商原创 2016-03-23 15:55:29 · 1382 阅读 · 0 评论 -
动态规划算法之最长递增子序列问题
一、问题描述在数字序列A中,按下标递增的顺序选出一个子序列B,如果选出的子序列B是严格递增的,则该子序列B称为原数字序列A的递增子序列。最长递增子序列问题就是找到原数字序列A中最长的递增子序列。例如数字序列5,2,8,6,3,6,9,7的一个最长递增子序列为2,3,6,9。二、问题分析动态规划函数为L(i) = 1, i = 1或者不原创 2016-03-22 19:18:11 · 11581 阅读 · 2 评论 -
动态规划算法之数塔问题
一、问题描述从数塔顶层出发,每个结点可以选择向左走或向右走,要求一直走到塔底,使得走过的路径上的数值和最大。如上图所示的数塔,最大路径和为86,经过的路径从塔顶到塔底为13,8,26,15,24。二、问题分析动态规划函数为:resultTower[i][j] = tower[i][j] + Math.max(tower[i + 1][j],tower[i + 1][j原创 2016-03-21 23:12:18 · 17935 阅读 · 0 评论 -
回溯算法之N皇后问题
一、问题描述N皇后问题,就是把N个皇后放到NXN的棋盘上,使她们不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。二、问题分析典型的回溯问题;queens[k]表示皇后k放在queens[k]位置上。三、算法代码算法参数int [] queens可以随意传值,它们的长度即代表queens.length皇后问题,可以解决任意NXN问题。/** *原创 2016-03-14 22:54:06 · 866 阅读 · 0 评论 -
回溯算法之素数环问题
一、问题描述把整数1~n填写到一个环中,要求每个整数只能填写一次,并且相邻两个数的和为素数。素数是只能被1和自身整除的整数。二、问题分析详见注释三、算法代码public static void primeCircle(int [] place){ int n = place.length; for(int i = 0; i <= place.length - 1;原创 2016-03-19 22:12:33 · 6107 阅读 · 0 评论 -
贪心算法之埃及分数问题
一、问题描述把一个真分数表示成最少的埃及分数之和。埃及分数即分子为1的分数。二、问题分析1、贪心算法的思想在本问题中的体现为在每一步的分解中都寻找最大的埃及分数。2、具体步骤如下步骤一假设真分数N/M的分子为N,分母为M,则有下式成立M = K * N + Z,其中Z必小于N两边同时除以分子N后,可知M/N = K + Z/N 所以,必有下式成立原创 2016-03-19 12:26:01 · 13971 阅读 · 3 评论 -
分治算法之最长子段和问题(Java)
一、利用分治法的思想实现的算法如下:public static int maxSegSum(int [] arr, int begin, int end){ int sum = 0; if(begin == end){ if(arr[begin] > 0){ return arr[begin]; }else{ return 0; } }原创 2015-12-15 17:20:55 · 1591 阅读 · 0 评论 -
分治算法之数字旋转方阵问题
一、矩阵形式如下:1 16 15 14 13 2 17 24 23 12 3 18 25 22 11 4 19 20 21 10 5 6 7 8 9 二、利用分治算法的思想,先生成矩阵的如下区域:区域A:1 2 3 4原创 2015-12-14 14:51:14 · 7196 阅读 · 0 评论 -
蛮力法之串匹配问题---kmp算法中真/后缀作用及next数组计算
在源串S中搜索目标串T时,利用串匹配的暴力求解方法,在求解的过程中,我们分析得到简化该问题求解过程的关键步骤,也即kmp算法的核心思想:如何在某趟S[i]和T[j]匹配失败时,下标i不回溯,下标j回溯到某个位置k,从T[k]和S[i]开始比较。一、什么是真前缀和真后缀二、为什么要计算真前缀和真后缀三、next数组计算原创 2015-12-10 00:19:33 · 1402 阅读 · 0 评论