算法分析实验报告--分治策略

合集下载

算法设计与分析的实验报告

算法设计与分析的实验报告

实验一递归与分治策略一、实验目的1.加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识解决实际问题的能力。

二、实验内容1、①设a[0:n-1]是已排好序的数组。

请写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。

当搜索元素在数组中时,i和j相同,均为x在数组中的位置。

②写出三分搜索法的程序。

三、实验要求(1)用分治法求解上面两个问题;(2)再选择自己熟悉的其它方法求解本问题;(3)上机实现所设计的所有算法;四、实验过程设计(算法设计过程)1、已知a[0:n-1]是一个已排好序的数组,可以采用折半查找(二分查找)算法。

如果搜索元素在数组中,则直接返回下表即可;否则比较搜索元素x与通过二分查找所得最终元素的大小,注意边界条件,从而计算出小于x的最大元素的位置i和大于x的最小元素位置j。

2、将n个元素分成大致相同的三部分,取在数组a的左三分之一部分中继续搜索x。

如果x>a[2(n-1)/3],则只需在数组a的右三分之一部分中继续搜索x。

上述两种情况不成立时,则在数组中间的三分之一部分中继续搜索x。

五、实验结果分析二分搜索法:三分搜索法:时间复杂性:二分搜索每次把搜索区域砍掉一半,很明显时间复杂度为O(log n)。

(n代表集合中元素的个数)三分搜索法:O(3log3n)空间复杂度:O(1)。

六、实验体会本次试验解决了二分查找和三分查找的问题,加深了对分治法的理解,收获很大,同时我也理解到学习算法是一个渐进的过程,算法可能一开始不是很好理解,但是只要多看几遍,只看是不够的还要动手分析一下,这样才能学好算法。

七、附录:(源代码)二分搜索法:#include<iostream.h>#include<stdio.h>int binarySearch(int a[],int x,int n){int left=0;int right=n-1;int i,j;while(left<=right){int middle=(left+right)/2;if(x==a[middle]){i=j=middle;return 1;}if(x>a[middle])left=middle+1;else right=middle-1;}i=right;j=left;return 0;}int main(){ int a[10]={0,1,2,3,4,5,6,7,8,9};int n=10;int x=9;if(binarySearch(a,x,n))cout<<"找到"<<endl;elsecout<<"找不到"<<endl;return 0;}实验二动态规划——求解最优问题一、实验目的1.加深学生对动态规划算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识解决实际问题的能力。

《算法设计与分析》实验报告实验一...

《算法设计与分析》实验报告实验一...

《算法设计与分析》实验报告实验一递归与分治策略应用基础学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期第九周一、实验目的1、理解递归的概念和分治法的基本思想2、了解适用递归与分治策略的问题类型,并能设计相应的分治策略算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:以下题目要求应用递归与分治策略设计解决方案,本次实验成绩按百分制计,完成各小题的得分如下,每小题要求算法描述准确且程序运行正确。

1、求n个元素的全排。

(30分)2、解决一个2k*2k的特殊棋牌上的L型骨牌覆盖问题。

(30分)3、设有n=2k个运动员要进行网球循环赛。

设计一个满足要求的比赛日程表。

(40分)提交结果:算法设计分析思路、源代码及其分析说明和测试运行报告。

三、设计分析四、算法描述及程序五、测试与分析六、实验总结与体会#include "iostream"using namespace std;#define N 100void Perm(int* list, int k, int m){if (k == m){for (int i=0; i<m; i++)cout << list[i] << " ";cout << endl;return;}else{for (int i=m; i<k; i++){swap(list[m], list[i]);Perm(list, k, m+1);swap(list[m], list[i]);}}}void swap(int a,int b){int temp;temp=a;a=b;b=temp;}int main(){int i,n;int a[N];cout<<"请输入排列数据总个数:";cin>>n;cout<<"请输入数据:";for(i=0;i<n;i++){cin>>a[i];}cout<<"该数据的全排列:"<<endl;Perm(a,n,0);return 0;}《算法设计与分析》实验报告实验二递归与分治策略应用提高学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期一、实验目的1、深入理解递归的概念和分治法的基本思想2、正确使用递归与分治策略设计相应的问题的算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:从以下题目中任选一题完成,要求应用递归与分治策略设计解决方案。

《算法设计与分析》实验报告:实验一(分治策略)

《算法设计与分析》实验报告:实验一(分治策略)

实验一我保证没有抄袭别人作业!1.实验题目必做:n 用分治思想设计实现二分搜索、合并排序,并且用不同数据量进行实验对比分析。

选做:阶乘(递归与分治)。

2.实验目的掌握设计算法的分治策略,通过实验学习分治策略设计技巧, 理解递归的概念验证二分搜索的时间复杂度。

掌握算法效率的分析和实验验证方法。

3.算法设计3.1 分治法基本思想将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。

然后递归的解这些子问题,然后将这些子问题的解合并得到原问题的解。

3.2二分搜索技术分解(devide):将n个元素分成个数大致相同的两半。

此时,原问题a[n]->子问题a[1,n/2]与a[2/n,n] 解决(conquer):取a[n/2]与欲查找的x作比较。

如果x=a[n/2],则找到x,算法终止。

如果x<a[n/2],则我们只要在数组a的左半部继续搜索x。

如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。

合并(combine):此结果无需合并。

3.3合并排序分解(devide):将n个元素分成个数大致相同的两半。

此时,原问题a[n]->子问题a[1,n/2]与a[2/n,n] 解决(conquer):递归解n/2规模的子问题合并(combine):合并已排好序的两部分进行合并。

3.4快速排序分解(devide):找到基准元素,将数组分为三部分,两段。

此时,原问题a[p,r]->子问题a[p,q-1]、a[q]、a[q+1,r]。

解决(conquer):通过递归调用快速排序,对数组a[p,q-1]与a[q+1,r]进行排序。

合并(combine):此结果无需合并,因为子数组都是原址排序得,所以不需要合并操作。

3.5阶乘分解(devide):将n!分成n*(n-1)!,每次使其规模减少一。

解决(conquer):如果n=0,则输出结果1。

如果n=1,则输出结果1。

2013实验报告2-分治策略

2013实验报告2-分治策略
《算法设计与应用》课程实验报告
实验名称
分治策略(2)
实验序号
2
实验日期
10.8
姓名
温源院系计算机源自院班级12104111
学号
1210400631
专业
计算机科学与技术
指导教师
姜丽
成绩
教师评语
一、实验目的和要求
1.掌握分治策略的基本思想
2.理解分治策略的3个步骤
3.熟悉典型的分治策略案例
二、实验预习内容
分治法的基本思想以及分治法的求解步骤。
三、实验项目摘要
1.分治法进行二分搜索
2.分治法进行快速排序
3.选做:(1)分治法解决棋盘覆盖问题
(2)分治法进行归并排序
4.提高部分:分治法解决大整数相乘问题
四、实验结果与分析
1.成功
2.成功
3.成功
注:空间不够,可以增加页码。

分治政策实验报告总结

分治政策实验报告总结

一、实验背景分治策略是一种常用的算法设计思想,它将一个复杂的问题分解成若干个相互独立、规模较小的子问题,分别解决这些子问题,再将子问题的解合并,从而得到原问题的解。

本实验旨在通过具体案例,深入理解分治策略的基本思想,掌握其应用方法,并分析其实际效果。

二、实验目的1. 理解分治策略的基本思想;2. 掌握分治策略的应用方法;3. 分析分治策略在解决实际问题中的效果;4. 提高算法设计与分析能力。

三、实验内容1. 分治策略案例分析实验中,我们选择了以下案例进行分析:(1)归并排序归并排序是一种典型的分治策略应用。

它将待排序的序列分为两半,分别对这两半进行归并排序,然后将两个有序序列合并为一个有序序列。

(2)二分查找二分查找也是一种分治策略应用。

它将待查找的序列分为两半,根据查找目标值与中间值的大小关系,确定目标值所在的一半,然后在该半序列中继续查找。

2. 分治策略实现(1)归并排序实现```cvoid mergeSort(int arr[], int left, int right) {if (left < right) {int mid = (left + right) / 2;mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);merge(arr, left, mid, right);}}void merge(int arr[], int left, int mid, int right) { int n1 = mid - left + 1;int n2 = right - mid;int L[n1], R[n2];for (int i = 0; i < n1; i++)L[i] = arr[left + i];for (int j = 0; j < n2; j++)R[j] = arr[mid + 1 + j];int i = 0, j = 0, k = left;while (i < n1 && j < n2) {if (L[i] <= R[j]) {arr[k] = L[i];i++;} else {arr[k] = R[j];j++;}k++;}while (i < n1) {arr[k] = L[i];i++;k++;}while (j < n2) {arr[k] = R[j];j++;k++;}}```(2)二分查找实现```cint binarySearch(int arr[], int left, int right, int target) { while (left <= right) {int mid = (left + right) / 2;if (arr[mid] == target)return mid;else if (arr[mid] < target)left = mid + 1;elseright = mid - 1;}return -1;}```3. 分治策略效果分析(1)归并排序归并排序的平均时间复杂度为O(nlogn),空间复杂度为O(n)。

分治策略算法实验报告

分治策略算法实验报告

分治策略算法实验报告引言分治策略是一种经典的算法设计策略,也是算法设计中最重要的思想之一。

其基本思想是将大问题划分成小的、相互独立的子问题,再将子问题合并求解,最终得到原问题的解。

本实验将通过实际例子,验证分治策略算法的有效性。

实验内容本实验选择两个经典的算法问题进行实现和验证,分别是二分查找和快速排序。

这两个问题在算法领域都有重要的应用价值,也是实践分治算法的好例子。

问题1:二分查找二分查找是一种在有序数组中查找特定元素的算法,其基本思想是将数组分为两部分,然后判断目标值在哪一部分,并且逐步缩小问题的规模。

具体实现如下:pythondef binary_search(arr, target):low = 0high = len(arr) - 1while low <= high:mid = (low + high) 2if arr[mid] == target:return midelif arr[mid] < target:low = mid + 1else:high = mid - 1return -1问题2:快速排序快速排序是一种高效的排序算法,其基本思想是通过一趟划分将待排序序列分割成两个独立的子序列,然后递归地对子序列进行排序,最终得到有序序列。

具体实现如下:pythondef quicksort(arr):if len(arr) <= 1:return arrpivot = arr[len(arr) 2]left = [x for x in arr if x < pivot]middle = [x for x in arr if x == pivot]right = [x for x in arr if x > pivot]return quicksort(left) + middle + quicksort(right)实验结果为了验证分治策略算法的有效性,我们分别对上述两个问题进行了测试。

分治算法探讨分治策略与应用场景

分治算法探讨分治策略与应用场景

分治算法探讨分治策略与应用场景随着计算机科学的快速发展,算法成为了解决问题的重要工具。

其中,分治算法在很多场景下展现出强大的能力,被广泛应用于各个领域。

本文将探讨分治策略的原理和常见应用场景。

一、分治策略的基本原理分治策略是一种将大问题划分为细分的子问题,并通过解决子问题来解决原始问题的思想。

其基本思路可以概括为以下三个步骤:1. 分解:将原始问题划分为若干规模较小的子问题。

2. 解决:递归地解决各个子问题。

3. 合并:将各个子问题的解合并为原始问题的解。

通过将大问题递归地划分为越来越小的子问题,最终解决各个子问题,再将子问题的解合并为原始问题的解,分治策略能够高效地解决很多复杂的问题。

二、分治策略的应用场景1. 排序算法排序是计算机科学中一个重要的问题,各种排序算法都可以使用分治策略来实现。

例如,快速排序和归并排序就是使用分治策略的经典排序算法。

在快速排序中,通过选择一个基准元素将问题划分为两个子问题,然后递归地排序子问题。

最后,再将排序好的子数组合并为原始数组的有序序列。

在归并排序中,通过将问题划分为两个子问题,递归地排序子数组。

最后,再将排序好的子数组合并为原始数组的有序序列。

归并排序的特点是稳定性好,适用于大规模数据的排序。

2. 查找问题分治策略也可以应用于查找问题。

例如,在有序数组中查找某个元素可以使用二分查找算法,该算法也采用了分治思想。

二分查找算法通过将问题划分为两个子问题,然后根据子问题的规模逐步缩小查找范围,最终找到目标元素。

这种分治思想使得二分查找具有高效性。

3. 矩阵乘法矩阵乘法是一个常见的数学运算问题。

通过分治策略,可以将矩阵乘法划分为多个小问题,并递归地解决这些小问题。

然后,再将这些小问题的解进行合并,得到原始问题的解。

分治法用于矩阵乘法算法的优化,可以减少运算量,提高计算效率。

4. 搜索问题分治策略也可以应用于搜索问题。

例如,在搜索引擎中,分治策略可以用于并行搜索,从而加快搜索速度。

算法分析与设计实验报告1: 斐波那契数列(分治策略)

算法分析与设计实验报告1: 斐波那契数列(分治策略)
double a = 1;
double b = 1;
double result = 0;
if (n <= 0)
{
return 0;
}
else if (n <= 2)
{
return 1;
}
else
{
for (i = 3; i <= n; i++)
{
result = a + b;
a = b;
b = result;
天津商业大学学生实验报告
开课实验室:开课时间2019年4月26日实验报告2019年4月26日
学院名称
信息工程学院
年级、专业、班
软件1803班
学号
20180822
姓名
丁智颖
同组姓名

课程名称
算法分析与设计
实验项目名称
实验一斐波那契数列(分治策略)指教师宋建材实验类型
验证□√综合□设计□创新□
成绩
教师评语:
}
return result;
}
}
///
//分治方法求解
///
double fib2(int n)
{
if (n <= 0)
{
return 0;
}
else if (n <= 2)
{
return 1; //递归终止条件
}
else
{
return fib2(n - 1) + fib2(n - 2); //递归
四、实验代码
#include <stdio.h>
double fib1(int n); //非递归生成下标为n的斐波那契数列元素
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。
(2)编写一段程序,实现快速排序。
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
for(int i = 0; i < MAX; i++) {
number[i] = rand() % 100;
printf("%d ", number[i]);
cout<<endl;
}
quicksort(number,0,9);
printf("排序后:");
for(int j = 0; j < MAX; j++) {
#include<iostream>
#include<time.h>
#define MAX 10
using namespace std;
void merge(int array[],int p,int q,int r)
{
int i,k;
int begin1,end1,begin2,end2;
int* temp = new int[r-p+1];
{
int i,j,s;
if(left < right)
{
s = number[(left + right)/2];
i = left - 1;
j = right + 1;
while(1)
{
while(number[++i] < s);
while(number[--j] > s);
if(i>=j)
break;
}
else
{
temp[k] = array[begin2];
begin2++;
}
k++;
}
while(begin1 <= end1)
{
temp[k++] = array[begin1++];
}
while(begin2 <= end2)
{
temp[k++] = array[begin2++];
}
for(i = 0;i < (r-p+1);i++)
{
array[p+i] = temp[i];
}
delete[](temp);
}
void merge_sort(int data[],int left,int right)
{
if(left < right)
{
int mid = (left + right)/2;
merge_sort(data,left,mid);
begin1 = p;
end1 = q;
begin2 = q+1;
end2 = r;
k = 0;
while((begin1 <= end1)&&(begin2 <= end2))
{
if(array[begin1] < array[begin2])
{
temp[k] = array[begin1];
begin1++;
SWAP(number[i],number[j]);
}
quicksort(number,left,i-1);
quicksort(number,j+1,right);
}
}
void main()
{
int number[MAX] = {0};
srand(time(NULL));
printf("排序前:");
《算法设计与分析》实验报告
分治策略
姓 名:
XXX
专 业 班 级:
XXX
学 号:
XXX
指导教师:
XXX
完成日期:
XXX
一、试验名称:分治策略
(1)写出源程序,并编译运行
(2)详细记录程序调试及运行结果
二、实验目的
(1)了解分治策略算法思想
(2)掌握快速排序、归并排序算法
(3)了解其他分治问题典型算法
三、实验内容
{ int i, j;
for (i=0; i<n; i++)
{ for (j=0; j<n; j++)a[tox + i][toy + j] = a[fromx + i][fromy + j];
printf("%d ", number[j]);
}
}
(3)编写程序实现循环赛日程表。
#define MAXN 64
/*日程表数组*/
#include <stdio.h>
#include <stdlib.h>
#define MAX 32
int a[MAX][MAX];
void Copy(int tox, int toy, int fromx, int fromy, int n)
}
}
(2)编写一段程序,实现快速排序。
#include<iostream>
#include<time.h>
#define MAX 10
#define SWAP(x,y) {int t; t = x; x = y; y = t;}
using namespace std;
void quicksort(int number[],int left,int right)
merge_sort(data,mid + 1,right);
merge(data,left,mid,right);
}
}
void main()
{
int number[MAX] = {0};
srand(time(NULL));
printf("排序前:");
for(int i = 0; i < MAX; i++) {
(1)编写一个简单的程序,实现归并排序。
(2)编写一段程序,实现快速排序。
(3)编写程序实现循环赛日程表。设有n=2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:(1)每个选手必须与其它n-1个选手各赛一次(2)每个选手一天只能赛一场(3)循环赛进行n-1天
四、算法思想分析
(1)编写一个简单的程序,实现归并排序。
(3)编写程序实现循环日赛表。
按分治策略,将所有的选手分为两组,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定。递归地用对选手进行分割,直到只剩下2个选手时,比赛日程表的制定就变得很简单。这时只要让这2个选手进行比赛就可以了。
五、算法源代码及用户程序
(1)编写一个简单的程序,实现归并排序。
number[i] = rand() % 100;
printf("%d ", number[i]);
}
cout<&r,0,9);
printf("排序后:");
for(int j = 0; j < MAX; j++) {
printf("%d ", number[j]);
相关文档
最新文档