递归与分治法(算法设计与分析王晓东版)
文章平均质量分 73
Bolt_Swallow
曾经的不驯于桀骜,只为梦想中的腾云九霄(这是小号哈,大号是项目交流)
展开
-
递归分治法实现有重复元素的排列问题
书上例题:1.问题描述 设集合R={r1,r2,...,rn}是要进行排列的n个元素,其中r1,r2,...,rn可能相同。 试着设计一个算法,列出R的所有不同排列。 即,给定n以及待排的n个可能重复的元素。计算输出n个元素的所有不同排列。2.算法设计 给定n及待排列的n个元素,计算出这n个元素的所有不同排列。3.数据输入 第1原创 2018-01-14 16:21:34 · 5203 阅读 · 0 评论 -
标准二表问题(Catalan实现)
问题描述:设n 是一个正整数。2xn的标准2维表是由正整数1,2,…,2n 组成的2xn 数组,该数组的每行从左到右递增,每列从上到下递增。2xn的标准2维表全体记为Tab(n)。算法:直接利用Catalan原理:令h(0)=1,h(1)=1,catalan数满足递推式:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-原创 2018-01-15 20:34:19 · 593 阅读 · 0 评论 -
双色汉诺塔
题目:设A、B、C是3 个塔座。开始时,在塔座A 上有一叠共n 个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,……,n,奇数号圆盘着蓝色,偶数号圆盘着红色,如图所示。现要求将塔座A 上的这一叠圆盘移到塔座B 上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则:规则(1):每次只能移动1 个圆盘;规则(2):任何时刻都不允许将较大的圆盘压在较小的圆盘之原创 2018-01-15 19:17:08 · 1021 阅读 · 0 评论 -
集合划分问题(2)
题目:n个元素的集合{1,2,..., n }可以划分为若干个非空子集。例如,当n=4 时,集合{1,2,3,4}可以划分为15 个不同的非空子集如下:{{1},{2},{3},{4}},{{1,2},{3},{4}},{{1,3},{2},{4}},{{1,4},{2},{3}},{{2,3},{1},{4}},{{2,4},{1},{3}},{{3,4},{原创 2018-01-15 16:52:46 · 1358 阅读 · 0 评论 -
集合划分(1)递归实现
题目:n个元素的集合{1,2,.,n }可以划分为若干个非空子集。例如,当n=4 时,集合{1,2,3,4}可以划分为15个不同的非空子集如下: {1},{2},{3},{4}}, {{1,2},{3},{4}}, {{1,3},{2},{4}}, {{1,4},{2},{3}}, {{2,3},{1},{4}}, {{2,4},{1},{3}}, {{3,4},{1},{2}原创 2018-01-15 16:12:39 · 614 阅读 · 1 评论 -
排列的字典序问题
问题描述:n个元素{1,2,,......,n}有n!个不同的排列。将这n!个排列按字典序排列,并编号为0,1,......,n!-1。每个排列的编号为其字典序值。例如,当n=3时,6个不同的排列的字典序值如下:例如:输入:82 6 4 5 8 1 7 3输出:82272 6 4 5 8 3 1 7代码我已经给出了详细的注释,注释就是思路了,所以在这里我原创 2018-01-14 22:46:44 · 515 阅读 · 0 评论 -
四叉树通常用来以紧凑的形式对数字图像进行编码(1.根据叶子节点构造四叉树 2.根据四叉树结构对加密图像进行解码 3.输出解码后的图像信息 )
#include <iostream>#include<iomanip>#include <memory.h>#include<string>#include<stdio.h>using namespace std;int tree[400][4];///四叉树的数组int leaf[350];///存储叶子节点int image[16][16];///图像的矩阵int m;///叶原创 2017-10-05 21:34:16 · 1554 阅读 · 0 评论 -
输油管道的实现
问题描述:某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。如果给定n口油井的位置,即它们的x坐标(东西向)和y坐标(南北向),应如何确定主管道的最优位置,即使各油井到主管道之间的输油管道长度总和最小的位置?证明可在线性时间内确定主管道的最优位置。«编程任务:给定n口油井的位置,编程计算原创 2017-10-05 21:38:42 · 1070 阅读 · 0 评论 -
棋盘覆盖的详细算法如下(分治法)
分析数组board[M][M]表示棋盘该数组的所有元素 的初值都为0。 ①chessBoard(0,0,0 ,1 ,4) t=1,(tile=2,tile的初值1赋给t,而后tile自增1变为2) s=2; 经判断特殊方格在棋盘的左上角。 ②chessBoard(0,0,0 ,1 ,2) t=2,(tile=3) s=1; 左上角无特殊方格 bo原创 2017-10-05 22:51:03 · 5150 阅读 · 1 评论 -
书上算法排列问题
思想:排列问题最主要是Perm()函数,例如一个很简单的例子如下:数列是:1 2 3当n=1时,则递归出口,换种说法就是当n=m时,也就是数列中只剩下一个数的时候,则表示交换已经结束,此时需要把这一排打印出来。当n<m时,说明没有交换结束,则继续交换下去,但是需要注意的是,当每次我交换完之后,也是就递归结束时,我需要把数列还原为原来的数列,不然,在进行交换输出后会得不到全部,而且还会有原创 2018-01-05 16:42:57 · 646 阅读 · 0 评论 -
整数划分(递归法),这个程序是实现输出整数的划分有多少种方法,接下来第二篇会实现级能输出划分整数的因子和输出划分的种个数方法
#include#include#includeusing namespace std;///5.种情况/*@1.当n=1时,q(1,m)=1@2.当m=1时,q(n,1)=1@3.当m=n时,q(n,m)=1+q(n,n-1);@4.当m<n时,q(n,m)=q(n,m-1)+q(n-m,m);@5.当m>n时,q(n,m)=q(n,n)*/int原创 2018-01-10 16:20:09 · 348 阅读 · 0 评论 -
利用二分收索查找该数在该数组所在的位置,前提是要保证改数组是有序的
//2d3 二分搜索技术#include #includeusing namespace std;templateint BinarySearch(Type a[],const Type& x,int n){ int left = 0;///最左边,也就是最开始的时候 int right = n-1;///最右边的界限 while(left原创 2018-01-10 19:06:38 · 257 阅读 · 0 评论 -
利用分治算法实现合并排序的详细思路
//@1--将数组a先一分为2//@2--将数组两两进行判断并在数组a比较之后的最小元素放进d数组中//@3--当两组比较完后,进行条件判断//@4--当剩下的是左边时,则说明是右边的开始界限已经超出了范围,则进行循环将剩下的数组直接copy到d数组//@5--当剩下的是右边时,则说明是左边的开始界限已经超出了范围,则进行循环将剩下的数组直接copy到d数组上面是解释了Merg原创 2018-01-11 19:12:47 · 1328 阅读 · 0 评论 -
分治法实现循环日程
设有n=2^k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能参赛一次; (3)循环赛在n-1天内结束。以书上例题为例:下面给出解决思路 (1)for(int i=1;i(2)将第一部分根据第一行来填充第二行 (3)将第二部分根据第一行和原创 2018-01-12 19:24:34 · 351 阅读 · 0 评论 -
分治法实现众数问题--例如:S={1,2,2,2,3,5},则多重集S的众数是2,其重数为3。对于给定的由m个自然数组成的多重集S,计算出S的众数及其重数。
题目的描述:例如:S={1,2,2,2,3,5},则多重集S的众数是2,其重数为3。对于给定的由m个自然数组成的多重集S,计算出S的众数及其重数。众数------一组元素中出现的次数是最多的重数-------这个数出现的总次数算法的分析:1.采用分治法:(1)先找到这一组的中位数,然后找到该数的左界限和右界限(2)上面那一原创 2018-01-13 14:23:04 · 3353 阅读 · 0 评论 -
半数集问题
定义: 给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下:(1) 在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;(2)按此规则进行处理,直到不能再添加自然数为止。例题:以6为例,set(6)={6,16,26,36,126,136}.同法可得8的半数集set(8)={8,18,28,38,48,128,138,148,248,1248原创 2018-01-13 19:08:02 · 290 阅读 · 0 评论 -
分治法实现半数单集问题
问题描述:给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下: (1)set(n)中包含n; (2)在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半; (3)按此规则进行处理,直至不能添加自然数为止。 例如,set(6)={6,16,26,126,36,136}。 编程任务:对于给定的自然数n,编程计算半数集set(n原创 2018-01-13 19:59:13 · 1707 阅读 · 0 评论 -
整数因子分解
题目:大于1的正整数 n 都可以分解为 n = x1 * x2 * ... * xm例如:当n=12时,共有8种不同的分解式:12 = 1212 = 6*212 = 4*312 = 3*412 = 3*2*212 = 2*612 = 2*3*212 = 2*2*3对于给定正整数n,计算n共有多少种不同的分解式。#include using namespace原创 2018-01-15 23:15:19 · 279 阅读 · 0 评论