没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
实验一 减治、分治和变治策略的算法设计、实现与分析
1.1 实验目的
(1) 掌握分治法、减治法和变治法的设计思想;
(2) 掌握分治法的求解步骤;
(3) 掌握分治法解题的算法框架。
1.2 实验设备和编程环境
(1) 硬件环境:1 台 DELL 笔记本
(a) 处理器:Intel(R) Core(TM) i5-9300H CPU @ 2.40GHz
(b) 内存:海力士 HMA81GS6DJR8N-VK @ 2666MHz
(2) 软件环境
(a) 操作系统:Windows 10 LTCS
(b) IDE:Visual Studio 2019
(c) 编程语言:C++(有使用 STL)
1.3 格雷码构造问题
1.3.1 问题描述
Gray 玛是一个长度为 2
n
的序列。序列无相同元素,每个元素都是长度
为 n 的串,相邻元素恰好只有一位不同。试设计一个算法对任意 n 构造相应
的 Gray 码。(分治、减治、变治皆可)
格雷码是反射码,例子可以参见表 1–1。我们可以利用递归的如下规则来
构造:
n 位的格雷码可以由 n − 1 位的格雷码得到,将每一个 n − 1 位的格雷码
左侧加一位
′
0
′
,便可以得到前 2
n−1
个 n 位的格雷码。
之后将 n − 1 位的格雷码的排列顺序逆序,将每一个 n − 1 位的格雷码左
侧加一位
′
1
′
,便可得到后 2
n−1
个 n 位的格雷码,由此全部的 n 位的格雷码
已求出。
递归边界为 1 位的格雷码只有
′
0
′
,
′
1
′
,直接返回即可。
1.3.2 问题的形式化
n 位格雷码 [i] =’0’+n − 1 位格雷码 [i]
n 位格雷码 [2
n
− i − 1] =’1’+n − 1 位格雷码 [i]
1
2 实验一:减治、分治和变治策略的算法设计、实现与分析
表 1–1 格雷码示例
2 位格雷码 3 位格雷码 4 位格雷码 4 位自然二进制码
0000 0000
0001 0001
0011 0010
0010 0011
000 0110 0100
001 0111 0101
00 011 0101 0110
01 010 0100 0111
11 110 1100 1000
10 111 1101 1001
101 1111 1010
100 1110 1011
1010 1100
1011 1101
1001 1110
1000 1111
1.4 算法设计
1.4.1 算法的伪代码描述
[算法] Algorithm 1 求解格雷码问题的分治算法
输入: graycode 数组,待求格雷码的长度 n
输出: 格雷码
1: function getGray(n)
2: if n = 0 then
3: return
4: end if
5: if n = 1 then
6: graycode[0] ← 0
7: graycode[1] ← 1
8: else
9: getGray(n − 1)
10: len ← graycode.size
11: for i = 0 → len do
12: graycode[i] ← 0 + graycode[i]
13: end for
14: for i = len − 1 → 0 do
15: graycode[i] ← 1 + graycode[i]
16: end for
17: end if
18: end function
1.5 编码实现 3
1.4.2 时间复杂度分析
T (n) = T (n − 1) + n = T (n − 2) + T (n − 1) + n...
T (n) = T (0) + 1 + 2 + 3 + ... + (n − 2) + (n − 1) + n
T (n) =
1
2
n(n + 1) = O(n
2
)
1.5 编码实现
1 #include<iostream>
2 #include<vector>
3 #include<string>
4 #include<cmath>
5
6 using namespace std;
7
8 vector<string> graycode;
9
10 void getGray(int n) {
11 if (n == 0)//不合法输入
12 return;
13 if (n == 1) {//递归边界
14 graycode.push_back(”0”);
15 graycode.push_back(”1”);
16 }
17 else {
18 getGray(n - 1);//递归:求n位Gray码,应先知道n-1位Gray码(减治)
19 int len = graycode.size();//n-1位Gray码序列长度
20 for (int i = 0; i < len; i++) {
21 graycode.push_back(”0” + graycode[i]);//n-1位Gray码顺序书写,加前缀0
22 }
23 for (int i = len - 1; i >= 0; i--) {
24 graycode.push_back(”1” + graycode[i]);//n-1位Gray码逆序书写,加前缀1
25 }
26 graycode.erase(graycode.begin(), graycode.begin() + len);//删除n-1位Gray码序列
27 }
28 }
29
30 int main() {
31 cout << ”输入Gray码长度:”;
32 int n;
33 cin >> n;
34 getGray(n);
35 cout << n << ”位Gray码:” << endl;
36 int index1 = 0, index2 = graycode.size()/2;
37 while (index1 < graycode.size()/2)
38 {
39 cout << graycode[index1] << ” ” << graycode[index2] << endl;
40 index1++;
41 index2++;
42 }
43 cout << ”共” << pow(2, n) << ”个。” << endl;
44 return 0;
45 }
4 实验一:减治、分治和变治策略的算法设计、实现与分析
1.6 程序调试与结果展示
样例结果图如图 1–1所示
(a) 算法实例 1 (b) 算法实例 2
(c) 算法实例 3
图 1–1 算法实例的结果
1.7 实验总结
递归和分治往往一同出现。
递归算法是一种通过将重复问题分解为同类的子问题的方法,其思想很
简单,但是计算量大,计算效率低。
分治算法则是将一个规模为 N 的问题分解为 k 个子问题,这些子问题相
互独立且原问题性质相同,求出问题的解,就可以得到原问题的解了。
剩余18页未读,继续阅读
资源评论
Mymel_晗
- 粉丝: 2941
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功