目录
分治策略算法设计实验 ..................................... 1
单峰序列问题 .......................................... 1
问题描述与要求 ..................................... 1
算法设计及时间复杂度分析: ......................... 1
输入数据的格式 ..................................... 2
编程实现源代码(cpp) ................................ 3
程序调试与测试记录 ................................. 5
寻找第 K 小元素问题 .................................... 6
问题描述与要求 ..................................... 6
算法设计及时间复杂度分析 ........................... 6
输入数据的格式 ..................................... 8
编程实现源代码(cpp) ................................ 9
程序调试与测试记录 ................................ 20
Matlab 编程绘制算法效率图 .......................... 23
动态规划算法设计实验 .................................... 26
数字三角形问题 ....................................... 26
问题描述与要求 .................................... 26
算法设计及时间复杂度分析: ........................ 26
输入数据的格式 .................................... 26
编程实现源代码(cpp) ............................... 27
程序调试与测试记录 ................................ 31
0-1 背包问题 ......................................... 32
问题描述与要求 .................................... 32
算法设计及时间复杂度分析: ........................ 32
编程实现源代码(cpp) ............................... 33
程序调试与测试记录 ................................ 38
字符串相似性 ......................................... 40
问题描述与要求 .................................... 40
算法设计及时间复杂度分析: ........................ 40
编程实现源代码(cpp) ............................... 41
程序调试与测试记录 ................................ 44
回溯策略算法设计实验 .................................... 46
八皇后循环实现问题 ................................... 46
问题描述与要求 .................................... 46
算法设计及时间复杂度分析: ........................ 48
输入数据的格式 .................................... 48
编程实现源代码(cpp) ............................... 49
程序调试与测试记录 ................................ 55
生成集合全排序问题 ................................... 56
问题描述与要求 .................................... 56
算法设计及时间复杂度分析: ........................ 56
编程实现源代码(cpp) ............................... 57
程序调试与测试记录 ................................ 59
生成集合 r 组合问题 ................................... 60
问题描述与要求 .................................... 60
算法设计及时间复杂度分析: ........................ 60
编程实现源代码(cpp) ............................... 60
程序调试与测试记录 ................................ 63
子集和问题 ........................................... 64
问题描述与要求 .................................... 64
算法设计及时间复杂度分析 .......................... 64
编程实现源代码(cpp) ............................... 65
程序调试与测试记录 ................................ 69
单峰序列问题
分治策略算法设计实验
单峰序列问题
问题描述与要求
给 定 含 有 n 个 不 同 元 素 的 数 组 L , 如 果 L 中 存 在 xi 使 得
,则成 L 是单峰序列,称 是 L 的峰顶。完成
下面的任务:
a)设计一个分治算法找到 L 的峰顶,编程调试正确。
b)从理论上分析算法的时间复杂度。
算法设计及时间复杂度分析:
输入任意一个序列,要判定其是否为单峰序列,可根据峰顶元素本身的性质
进行算法设计,一个序列要成为单峰序列,那么其只能有一个峰顶,并且峰顶元
素的特点就是 L[k-1]
L[k+1],那么递归寻找这样的可能成为峰顶的元素,
并返回其下标。利用二分查找算法,中间元素和其相邻的两个元素之间的关系只
有 4 种可能性:
1) num[mid-1]>num[mid]&&num[mid]num[mid+1]
3) num[mid-1]>num[mid]&&num[mid]>num[mid+1]
4) num[mid-1]单峰序列问题
将找出来的元素,利用单峰序列本身的特点就是峰顶元素左边是递增的,右
边是递减的来进一步判定是否是单峰序列。
类似于二分查找算法,原规模问题被分解成两个子问题,则时间复杂度递推式为:
T(N)=T(N/2)+C1
T(1)=C2,其中 C 表示某个常数
可以使用迭代法或者主定理,求解出时间复杂度 T(N)=O(logn)。
输入数据的格式
Maxn=6;
1 2 3 4 5 6
1 2 6 5 4 3
1 2 3 4 6 5
2
单峰序列问题
1 2 3 6 5 4
6 5 4 3 2 1
6 5 3 2 4 1
编程实现源代码(cpp)
#include
using namespace std;
int num[100];
//递归找到峰顶元素的下标
int findtopindex(int num[],int start,int end)
{
if(end-start==2) return start+1;
if(end-start<2) return -1;
int mid=(start+end)/2;
//中点元素就是峰顶元素
if(num[mid-1]num[mid+1]) return mid;
if(num[mid-1]>num[mid]&&num[mid]num[mid]&&num[mid]>num[mid+1])
return
findtopindex(num,start,mid);
//在中点元素右边寻找
if(num[mid-1]