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

合集下载

算法实验报告

算法实验报告

算法实验报告算法实验报告引言:算法是计算机科学的核心内容之一,它是解决问题的方法和步骤的描述。

算法的设计和分析是计算机科学与工程中的重要研究方向之一。

本实验旨在通过对算法的实际应用和实验验证,深入理解算法的性能和效果。

实验一:排序算法的比较在本实验中,我们将比较三种常见的排序算法:冒泡排序、插入排序和快速排序。

我们将通过对不同规模的随机数组进行排序,并记录每种算法所需的时间和比较次数,以评估它们的性能。

实验结果显示,快速排序是最快的排序算法,其时间复杂度为O(nlogn),比较次数也相对较少。

插入排序的时间复杂度为O(n^2),比较次数较多,但对于小规模的数组排序效果较好。

而冒泡排序的时间复杂度也为O(n^2),但比较次数更多,效率相对较低。

实验二:图的最短路径算法在图的最短路径问题中,我们将比较Dijkstra算法和Floyd-Warshall算法的效率和准确性。

我们将使用一个带权有向图,并计算从一个顶点到其他所有顶点的最短路径。

实验结果表明,Dijkstra算法适用于单源最短路径问题,其时间复杂度为O(V^2),其中V为顶点数。

而Floyd-Warshall算法适用于多源最短路径问题,其时间复杂度为O(V^3)。

两种算法在准确性上没有明显差异,但在处理大规模图时,Floyd-Warshall算法的效率较低。

实验三:动态规划算法动态规划是一种通过将问题分解成子问题并记录子问题的解来解决复杂问题的方法。

在本实验中,我们将比较两种动态规划算法:0-1背包问题和最长公共子序列问题。

实验结果显示,0-1背包问题的动态规划算法可以有效地找到最优解,其时间复杂度为O(nW),其中n为物品个数,W为背包容量。

最长公共子序列问题的动态规划算法可以找到两个序列的最长公共子序列,其时间复杂度为O(mn),其中m和n分别为两个序列的长度。

结论:通过本次实验,我们对不同算法的性能和效果有了更深入的了解。

排序算法中,快速排序是最快且效率最高的;在图的最短路径问题中,Dijkstra算法和Floyd-Warshall算法分别适用于不同的场景;动态规划算法可以解决复杂的问题,并找到最优解。

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

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

《算法设计与分析》实验报告实验一递归与分治策略应用基础学号:**************姓名:*************班级:*************日期: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. 理解算法分析的基本概念和方法。

2. 掌握时间复杂度和空间复杂度的计算方法。

3. 比较不同算法的效率,分析算法的适用场景。

4. 提高编程能力,培养算法思维。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm三、实验内容本次实验主要分析了以下几种算法:1. 冒泡排序2. 选择排序3. 插入排序4. 快速排序5. 归并排序四、实验步骤1. 编写各种排序算法的Python实现代码。

2. 分别对长度为10、100、1000、10000的随机数组进行排序。

3. 记录每种排序算法的运行时间。

4. 分析算法的时间复杂度和空间复杂度。

5. 比较不同算法的效率。

五、实验结果与分析1. 冒泡排序```pythondef bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]```时间复杂度:O(n^2)空间复杂度:O(1)冒泡排序是一种简单的排序算法,其时间复杂度较高,适用于小规模数据排序。

2. 选择排序```pythondef selection_sort(arr):n = len(arr)for i in range(n):min_idx = ifor j in range(i+1, n):if arr[min_idx] > arr[j]:min_idx = jarr[i], arr[min_idx] = arr[min_idx], arr[i]```时间复杂度:O(n^2)空间复杂度:O(1)选择排序也是一种简单的排序算法,其时间复杂度与冒泡排序相同,同样适用于小规模数据排序。

3. 插入排序```pythondef insertion_sort(arr):for i in range(1, len(arr)):key = arr[i]j = i-1while j >=0 and key < arr[j]:arr[j+1] = arr[j]j -= 1arr[j+1] = key```时间复杂度:O(n^2)空间复杂度:O(1)插入排序是一种稳定的排序算法,其时间复杂度与冒泡排序和选择排序相同,适用于小规模数据排序。

算法课设实验报告(3篇)

算法课设实验报告(3篇)

第1篇一、实验背景与目的随着计算机技术的飞速发展,算法在计算机科学中扮演着至关重要的角色。

为了加深对算法设计与分析的理解,提高实际应用能力,本实验课程设计旨在通过实际操作,让学生掌握算法设计与分析的基本方法,学会运用所学知识解决实际问题。

二、实验内容与步骤本次实验共分为三个部分,分别为排序算法、贪心算法和动态规划算法的设计与实现。

1. 排序算法(1)实验目的:熟悉常见的排序算法,理解其原理,比较其优缺点,并实现至少三种排序算法。

(2)实验内容:- 实现冒泡排序、快速排序和归并排序三种算法。

- 对每种算法进行时间复杂度和空间复杂度的分析。

- 编写测试程序,对算法进行性能测试,比较不同算法的优劣。

(3)实验步骤:- 分析冒泡排序、快速排序和归并排序的原理。

- 编写三种排序算法的代码。

- 分析代码的时间复杂度和空间复杂度。

- 编写测试程序,生成随机测试数据,测试三种算法的性能。

- 比较三种算法的运行时间和内存占用。

2. 贪心算法(1)实验目的:理解贪心算法的基本思想,掌握贪心算法的解题步骤,并实现一个贪心算法问题。

(2)实验内容:- 实现一个贪心算法问题,如活动选择问题。

- 分析贪心算法的正确性,并证明其最优性。

(3)实验步骤:- 分析活动选择问题的贪心策略。

- 编写贪心算法的代码。

- 分析贪心算法的正确性,并证明其最优性。

- 编写测试程序,验证贪心算法的正确性。

3. 动态规划算法(1)实验目的:理解动态规划算法的基本思想,掌握动态规划算法的解题步骤,并实现一个动态规划算法问题。

(2)实验内容:- 实现一个动态规划算法问题,如背包问题。

- 分析动态规划算法的正确性,并证明其最优性。

(3)实验步骤:- 分析背包问题的动态规划策略。

- 编写动态规划算法的代码。

- 分析动态规划算法的正确性,并证明其最优性。

- 编写测试程序,验证动态规划算法的正确性。

三、实验结果与分析1. 排序算法实验结果:- 冒泡排序:时间复杂度O(n^2),空间复杂度O(1)。

算法分析与设计实验报告合并排序快速排序

算法分析与设计实验报告合并排序快速排序

算法分析与设计实验报告:合并排序与快速排序一、引言算法是计算机科学中非常重要的一部分,它涉及到解决问题的方法和步骤。

合并排序和快速排序是两种经典而常用的排序算法。

本文将对这两种排序算法进行分析和设计实验,通过对比它们的性能和效率,以期得出最优算法。

二、合并排序合并排序是一种分治算法,它将原始数组不断分解为更小的数组,直到最后细分为单个元素。

然后,再将这些单个元素两两合并,形成一个有序数组。

合并排序的核心操作是合并两个有序的数组。

1. 算法步骤(1)将原始数组分解为更小的子数组,直到每个子数组只有一个元素;(2)两两合并相邻的子数组,同时进行排序,生成新的有序数组;(3)重复步骤(2),直到生成最终的有序数组。

2. 算法性能合并排序的最优时间复杂度为O(nlogn),其中n为待排序数组的长度。

无论最好情况还是最坏情况,合并排序的复杂度都相同。

合并排序需要额外的存储空间来存储临时数组,所以空间复杂度为O(n)。

三、快速排序快速排序也是一种分治算法,它将原始数组根据一个主元(pivot)分成两个子数组,一个子数组的元素都小于主元,另一个子数组的元素都大于主元。

然后,递归地对这两个子数组进行排序,最后得到有序数组。

快速排序的核心操作是划分。

1. 算法步骤(1)选择一个主元(pivot),可以是随机选择或者固定选择第一个元素;(2)将原始数组根据主元划分为两个子数组,一个子数组的元素都小于主元,另一个子数组的元素都大于主元;(3)递归地对这两个子数组进行快速排序;(4)重复步骤(2)和(3),直到每个子数组只有一个元素,即得到最终的有序数组。

2. 算法性能快速排序的平均时间复杂度为O(nlogn),其中n为待排序数组的长度。

最坏情况下,当每次选择的主元都是最小或最大元素时,时间复杂度为O(n^2)。

快速排序是原地排序,不需要额外的存储空间,所以空间复杂度为O(1)。

四、实验设计为了验证合并排序和快速排序的性能和效率,我们设计以下实验:1. 实验目的:比较合并排序和快速排序的时间复杂度和空间复杂度。

算法分析与设计实验报告

算法分析与设计实验报告

算法分析与设计实验报告算法分析与设计实验报告一、引言算法是计算机科学的核心,它们是解决问题的有效工具。

算法分析与设计是计算机科学中的重要课题,通过对算法的分析与设计,我们可以优化计算机程序的效率,提高计算机系统的性能。

本实验报告旨在介绍算法分析与设计的基本概念和方法,并通过实验验证这些方法的有效性。

二、算法分析算法分析是评估算法性能的过程。

在实际应用中,我们常常需要比较不同算法的效率和资源消耗,以选择最适合的算法。

常用的算法分析方法包括时间复杂度和空间复杂度。

1. 时间复杂度时间复杂度衡量了算法执行所需的时间。

通常用大O表示法表示时间复杂度,表示算法的最坏情况下的运行时间。

常见的时间复杂度有O(1)、O(log n)、O(n)、O(n log n)和O(n^2)等。

其中,O(1)表示常数时间复杂度,O(log n)表示对数时间复杂度,O(n)表示线性时间复杂度,O(n log n)表示线性对数时间复杂度,O(n^2)表示平方时间复杂度。

2. 空间复杂度空间复杂度衡量了算法执行所需的存储空间。

通常用大O表示法表示空间复杂度,表示算法所需的额外存储空间。

常见的空间复杂度有O(1)、O(n)和O(n^2)等。

其中,O(1)表示常数空间复杂度,O(n)表示线性空间复杂度,O(n^2)表示平方空间复杂度。

三、算法设计算法设计是构思和实现算法的过程。

好的算法设计能够提高算法的效率和可靠性。

常用的算法设计方法包括贪心算法、动态规划、分治法和回溯法等。

1. 贪心算法贪心算法是一种简单而高效的算法设计方法。

它通过每一步选择局部最优解,最终得到全局最优解。

贪心算法的时间复杂度通常较低,但不能保证得到最优解。

2. 动态规划动态规划是一种将问题分解为子问题并以自底向上的方式求解的算法设计方法。

它通过保存子问题的解,避免重复计算,提高算法的效率。

动态规划适用于具有重叠子问题和最优子结构的问题。

3. 分治法分治法是一种将问题分解为更小规模的子问题并以递归的方式求解的算法设计方法。

算法与分析实验报告

算法与分析实验报告

算法与分析实验报告一、引言算法是现代计算机科学中的核心概念,通过合理设计的算法可以解决复杂的问题,并提高计算机程序的执行效率。

本次实验旨在通过实际操作和数据统计,对比分析不同算法的执行效率,探究不同算法对于解决特定问题的适用性和优劣之处。

二、实验内容本次实验涉及两个经典的算法问题:排序和搜索。

具体实验内容如下:1. 排序算法- 冒泡排序- 插入排序- 快速排序2. 搜索算法- 顺序搜索- 二分搜索为了对比不同算法的执行效率,我们需要设计合适的测试用例并记录程序执行时间进行比较。

实验中,我们将使用随机生成的整数数组作为排序和搜索的测试数据,并统计执行时间。

三、实验步骤1. 算法实现与优化- 实现冒泡排序、插入排序和快速排序算法,并对算法进行优化,提高执行效率。

- 实现顺序搜索和二分搜索算法。

2. 数据生成- 设计随机整数数组生成函数,生成不同大小的测试数据。

3. 实验设计- 设计实验方案,包括测试数据的规模、重复次数等。

4. 实验执行与数据收集- 使用不同算法对随机整数数组进行排序和搜索操作,记录执行时间。

- 多次重复同样的操作,取平均值以减小误差。

5. 数据分析与结果展示- 将实验收集到的数据进行分析,并展示在数据表格或图表中。

四、实验结果根据实验数据的收集与分析,我们得到以下结果:1. 排序算法的比较- 冒泡排序:平均执行时间较长,不适用于大规模数据排序。

- 插入排序:执行效率一般,在中等规模数据排序中表现良好。

- 快速排序:执行效率最高,适用于大规模数据排序。

2. 搜索算法的比较- 顺序搜索:执行时间与数据规模成线性关系,适用于小规模数据搜索。

- 二分搜索:执行时间与数据规模呈对数关系,适用于大规模有序数据搜索。

实验结果表明,不同算法适用于不同规模和类型的问题。

正确选择和使用算法可以显著提高程序的执行效率和性能。

五、实验总结通过本次实验,我们深入了解了不同算法的原理和特点,并通过实际操作和数据分析对算法进行了比较和评估。

算法设计与分析实验报告

算法设计与分析实验报告

算法设计与分析实验报告实验一全排列、快速排序【实验目的】1. 掌握全排列的递归算法。

2. 了解快速排序的分治算法思想。

【实验原理】一、全排列全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。

任何n个字符集的排列都可以与1~n的n个数字的排列一一对应,因此在此就以n 个数字的排列为例说明排列的生成法。

n个字符的全体排列之间存在一个确定的线性顺序关系。

所有的排列中除最后一个排列外,都有一个后继;除第一个排列外,都有一个前驱。

每个排列的后继都可以从它的前驱经过最少的变化而得到,全排列的生成算法就是从第一个排列开始逐个生成所有的排列的方法。

二、快速排序快速排序(Quicksort)是对冒泡排序的一种改进。

它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

【实验内容】1.全排列递归算法的实现。

2.快速排序分治算法的实现。

【实验结果】1. 全排列:2. 快速排序:实验二最长公共子序列、活动安排问题【实验目的】1. 了解动态规划算法设计思想,运用动态规划算法实现最长公共子序列问题。

2. 了解贪心算法思想,运用贪心算法设计思想实现活动安排问题。

【实验原理】一、动态规划法解最长公共子序列设序列X=和Y=的一个最长公共子序列Z=,则:i. 若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列;ii. 若xm≠yn且zk≠xm ,则Z是Xm-1和Y的最长公共子序列;iii. 若xm≠yn且z k≠yn ,则Z是X和Yn-1的最长公共子序列。

其中Xm-1=,Yn-1=,Zk-1=。

最长公共子序列问题具有最优子结构性质。

由最长公共子序列问题的最优子结构性质可知,要找出X=和Y=的最长公共子序列,可按以下方式递归地进行:当xm=yn时,找出Xm-1和Yn-1的最长公共子序列,然后在其尾部加上xm(=yn)即可得X和Y的一个最长公共子序列。

《算法设计与分析》课程实验报告 (贪心算法(一))

《算法设计与分析》课程实验报告 (贪心算法(一))

《算法设计与分析》课程实验报告实验序号:07实验项目名称:实验8 贪心算法(一)一、实验题目1.删数问题问题描述:键盘输入一个高精度的正整数N(不超过250 位),去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的非负整数。

编程对给定的N 和k,寻找一种方案使得剩下的数字组成的新数最小。

若输出前有0则舍去2.区间覆盖问题问题描述:设x1,x2,...xn是实轴上的n个点。

用固定长度为k的闭区间覆盖n个点,至少需要多少个这样的固定长度的闭区间?请你设计一个有效的算法解决此问题。

3.会场安排问题问题描述:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。

设计一个有效的贪心算法进行安排。

(这个问题实际上是著名的图着色问题。

若将每一个活动作为图的一个顶点,不相容活动间用边相连。

使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。

)4.导弹拦截问题问题描述:某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。

但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。

某天,雷达捕捉到敌国的导弹来袭。

由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

给定导弹依次飞来的高度(雷达给出的高度数据是≤50000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

二、实验目的(1)通过实现算法,进一步体会具体问题中的贪心选择性质,从而加强对贪心算法找最优解步骤的理解。

(2)掌握通过迭代求最优的程序实现技巧。

(3)体会将具体问题的原始数据预处理后(特别是以某种次序排序后),常能用贪心求最优解的解决问题方法。

三、实验要求(1)写出题1的最优子结构性质、贪心选择性质及相应的子问题。

(2)给出题1的贪心选择性质的证明。

(3)(选做题):写出你的算法的贪心选择性质及相应的子问题,并描述算法思想。

算法设计与分析实验报告

算法设计与分析实验报告

实验一找最大和最小元素与归并分类算法实现(用分治法)一、实验目的1.掌握能用分治法求解的问题应满足的条件;2.加深对分治法算法设计方法的理解与应用;3.锻炼学生对程序跟踪调试能力;4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力。

二、实验内容1、找最大和最小元素输入n 个数,找出最大和最小数的问题。

2、归并分类将一个含有n个元素的集合,按非降的次序分类(排序)。

三、实验要求(1)用分治法求解问题(2)上机实现所设计的算法;四、实验过程设计(算法设计过程)1、找最大和最小元素采用分治法,将数组不断划分,进行递归。

递归结束的条件为划分到最后若为一个元素则max和min都是这个元素,若为两个取大值赋给max,小值给min。

否则就继续进行划分,找到两个子问题的最大和最小值后,比较这两个最大值和最小值找到解。

2、归并分类使用分治的策略来将一个待排序的数组分成两个子数组,然后递归地对子数组进行排序,最后将排序好的子数组合并成一个有序的数组。

在合并过程中,比较两个子数组的首个元素,将较小的元素放入辅助数组,并指针向后移动,直到将所有元素都合并到辅助数组中。

五、源代码1、找最大和最小元素#include<iostream>using namespace std;void MAXMIN(int num[], int left, int right, int& fmax, int& fmin); int main() {int n;int left=0, right;int fmax, fmin;int num[100];cout<<"请输入数字个数:";cin >> n;right = n-1;cout << "输入数字:";for (int i = 0; i < n; i++) {cin >> num[i];}MAXMIN(num, left, right, fmax, fmin);cout << "最大值为:";cout << fmax << endl;cout << "最小值为:";cout << fmin << endl;return 0;}void MAXMIN(int num[], int left, int right, int& fmax, int& fmin) { int mid;int lmax, lmin;int rmax, rmin;if (left == right) {fmax = num[left];fmin = num[left];}else if (right - left == 1) {if (num[right] > num[left]) {fmax = num[right];fmin = num[left];}else {fmax = num[left];fmin = num[right];}}else {mid = left + (right - left) / 2;MAXMIN(num, left, mid, lmax, lmin);MAXMIN(num, mid+1, right, rmax, rmin);fmax = max(lmax, rmax);fmin = min(lmin, rmin);}}2、归并分类#include<iostream>using namespace std;int num[100];int n;void merge(int left, int mid, int right) { int a[100];int i, j,k,m;i = left;j = mid+1;k = left;while (i <= mid && j <= right) {if (num[i] < num[j]) {a[k] = num[i++];}else {a[k] = num[j++];}k++;}if (i <= mid) {for (m = i; m <= mid; m++) {a[k++] = num[i++];}}else {for (m = j; m <= right; m++) {a[k++] = num[j++];}}for (i = left; i <= right; i++) { num[i] = a[i];}}void mergesort(int left, int right) { int mid;if (left < right) {mid = left + (right - left) / 2;mergesort(left, mid);mergesort(mid + 1, right);merge(left, mid, right);}}int main() {int left=0,right;int i;cout << "请输入数字个数:";cin >> n;right = n - 1;cout << "输入数字:";for (i = 0; i < n; i++) {cin >> num[i];}mergesort(left,right);for (i = 0; i < n; i++) {cout<< num[i];}return 0;}六、运行结果和算法复杂度分析1、找最大和最小元素图1-1 找最大和最小元素结果算法复杂度为O(logn)2、归并分类图1-2 归并分类结果算法复杂度为O(nlogn)实验二背包问题和最小生成树算法实现(用贪心法)一、实验目的1.掌握能用贪心法求解的问题应满足的条件;2.加深对贪心法算法设计方法的理解与应用;3.锻炼学生对程序跟踪调试能力;4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力。

关于算法的实验报告(3篇)

关于算法的实验报告(3篇)

第1篇一、实验目的1. 理解快速排序算法的基本原理和实现方法。

2. 掌握快速排序算法的时间复杂度和空间复杂度分析。

3. 通过实验验证快速排序算法的效率。

4. 提高编程能力和算法设计能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019三、实验原理快速排序算法是一种分而治之的排序算法,其基本思想是:选取一个基准元素,将待排序序列分为两个子序列,其中一个子序列的所有元素均小于基准元素,另一个子序列的所有元素均大于基准元素,然后递归地对这两个子序列进行快速排序。

快速排序算法的时间复杂度主要取决于基准元素的选取和划分过程。

在平均情况下,快速排序的时间复杂度为O(nlogn),但在最坏情况下,时间复杂度会退化到O(n^2)。

四、实验内容1. 快速排序算法的代码实现2. 快速排序算法的时间复杂度分析3. 快速排序算法的效率验证五、实验步骤1. 设计快速排序算法的C++代码实现,包括以下功能:- 选取基准元素- 划分序列- 递归排序2. 编写主函数,用于生成随机数组和测试快速排序算法。

3. 分析快速排序算法的时间复杂度。

4. 对不同规模的数据集进行测试,验证快速排序算法的效率。

六、实验结果与分析1. 快速排序算法的代码实现```cppinclude <iostream>include <vector>include <cstdlib>include <ctime>using namespace std;// 生成随机数组void generateRandomArray(vector<int>& arr, int n) {srand((unsigned)time(0));for (int i = 0; i < n; ++i) {arr.push_back(rand() % 1000);}}// 快速排序void quickSort(vector<int>& arr, int left, int right) { if (left >= right) {return;}int i = left;int j = right;int pivot = arr[(left + right) / 2]; // 选取中间元素作为基准 while (i <= j) {while (arr[i] < pivot) {i++;}while (arr[j] > pivot) {j--;}if (i <= j) {swap(arr[i], arr[j]);i++;j--;}}quickSort(arr, left, j);quickSort(arr, i, right);}int main() {int n = 10000; // 测试数据规模vector<int> arr;generateRandomArray(arr, n);clock_t start = clock();quickSort(arr, 0, n - 1);clock_t end = clock();cout << "排序用时:" << double(end - start) / CLOCKS_PER_SEC << "秒" << endl;return 0;}```2. 快速排序算法的时间复杂度分析根据实验结果,快速排序算法在平均情况下的时间复杂度为O(nlogn),在最坏情况下的时间复杂度为O(n^2)。

算法设计与分析实验报告

算法设计与分析实验报告

算法设计与分析报告学生姓名学号专业班级指导教师完成时间目录一、课程内容 (3)二、算法分析 (3)1、分治法 (3)(1)分治法核心思想 (3)(2)MaxMin算法分析 (3)2、动态规划 (4)(1)动态规划核心思想 (4)(2)矩阵连乘算法分析 (5)3、贪心法 (5)(1)贪心法核心思想 (5)(2)背包问题算法分析 (6)(3)装载问题算法分析 (7)4、回溯法 (7)(1)回溯法核心思想 (7)(2)N皇后问题非递归算法分析 (7)(3)N皇后问题递归算法分析 (8)三、例子说明 (9)1、MaxMin问题 (9)2、矩阵连乘 (10)3、背包问题 (10)4、最优装载 (10)5、N皇后问题(非递归) (11)6、N皇后问题(递归) (11)四、心得体会 (12)五、算法对应的例子代码 (12)1、求最大值最小值 (12)2、矩阵连乘问题 (13)3、背包问题 (15)4、装载问题 (17)5、N皇后问题(非递归) (19)6、N皇后问题(递归) (20)一、课程内容1、分治法,求最大值最小值,maxmin算法;2、动态规划,矩阵连乘,求最少连乘次数;3、贪心法,1)背包问题,2)装载问题;4、回溯法,N皇后问题的循环结构算法和递归结构算法。

二、算法分析1、分治法(1)分治法核心思想当要求解一个输入规模为n,且n的取值相当大的问题时,直接求解往往是非常困难的。

如果问题可以将n个输入分成k个不同子集合,得到k个不同的可独立求解的子问题,其中1<k≤n, 而且子问题与原问题性质相同,原问题的解可由这些子问题的解合并得出。

那末,这类问题可以用分治法求解。

分治法的核心技术1)子问题的划分技术.2)递归技术。

反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生出不用进一步细分就可求解的子问题。

3)合并技术.(2)MaxMin算法分析问题:在含有n个不同元素的集合中同时找出它的最大和最小元素。

算法分析与设计实验报告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的斐波那契数列元素

算法设计与分析实验报告-背包问题

算法设计与分析实验报告-背包问题

算法设计与分析实验报告一、实验内容:给定n 种物品和一背包。

物品i 的重量是w i ,其价值为v i ,背包的容量为C 。

问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?二、算法思想与设计描述:(一)基本算法:1、使用动态规划算法计算最优值,递归式如下,m(i ,j)是背包容量为j ,可选择物品为i ,i+1,…,n 时0-1背包问题的最优值具体代码:for(i=1; i<=num; i++)for(j=1; j<=C; j++){int temp = value[i -1][j -goods[i].weight]+goods[i].value;if(j>=goods[i].weight && temp > value[i -1][j])value[i][j] = temp;elsevalue[i][j] = value[i -1][j];}2、逆推得出装入背包的物品:j = C;for(i=num; i>=1; i --){if(value[i][j] > value[i -1][j]){judge[i] = 1;j -= goods[i].weight;}}(二)改进算法:1、求最大价值:i i i i w j w j j i m v w j i m j i m j i m <≤≥⎩⎨⎧+-=0),1-(}),1-(),,1-(max{),(具体代码:for(i=0; i<MAXNUM; i++){for(j=0; j<MAXNUM; j++){p[i][j].weight = 0;p[i][j].value = 0;q[i][j].weight = 0;q[i][j].value = 0;}}for(i=0; i<=num-1; i++){j = 0;//计算q集合的值while(j == 0 || (j>0 && p[i][j].weight!=0)){q[i][j].weight = p[i][j].weight + goods[i+1].weight;q[i][j].value = p[i][j].value + goods[i+1].value;j++;}m = 1; k = 0; j = 1;//复制i层的p、q到i+1层的p中并按重量由小到大排序while(p[i][j].weight!=0 && q[i][k].weight!=0){if(p[i][j].weight <= q[i][k].weight){p[i+1][m] = p[i][j];j++;}else{p[i+1][m] = q[i][k];k++;}m++;}while(p[i][j].weight != 0)//i层的p还没有复制结束{p[i+1][m] = p[i][j];j++;m++;}while(q[i][k].weight != 0)//i层的p还没有复制结束{p[i+1][m] = q[i][k];k++;m++;}k = 1;while(p[i+1][k].weight)//删除集合A、集合B中的元素{if((p[i+1][k].value<p[i+1][k-1].value) || (p[i+1][k].weight > C)){j = k;while(p[i+1][j].weight){p[i+1][j] = p[i+1][j+1];j++;}}elsek++;}}max_value=p[i][k-1].value;2、逆推得出最优装法:•初设i=n•比较p[i](j1,v1)与p[i-1](j2,v2)的最后一个元素,如果不同,则第i个一定被选了,且下一次i为(j1-wi,v1-vi)第一次出现的位置;如果相同则i——;•循环执行上述步骤直到i=0为止//逆推得到最优装法i = num;while(i){j = 1; k = 1;while(p[i][j].weight)j++;while(p[i-1][k].weight)k++;j--; k--;if(p[i][j].value != p[i-1][k].value){judge[i] = 1;//第i个被选中了if(i == 1)i--;int last_weight = p[i][j].weight-goods[i].weight;int last_value = p[i][j].value - goods[i].value;m = 1;while(i>1 && m<=num)//找到下一个i{j = 1;while(p[m][j].weight){if(p[m][j].weight == last_weight && p[m][j].value == last_value){i = m;break;}else{j++;}}if(i == m)break;m++;}}elsei--;}三、测试说明:1、基本算法算法复杂度:O(nC)2、改进算法:算法复杂度:O(min{nC, 2^n})四、实验总结:动态规划算法可以避免普通递归算法在某些问题上的重复计算,是一种聪明的递归。

算法分析与设计实验报告

算法分析与设计实验报告

算法分析与设计实验报告1. 引言算法是计算机科学中的核心概念之一,它为解决问题提供了一种清晰、有效的方法。

本实验报告旨在通过分析与设计一个特定算法的实验过程,来加深对算法的理解和应用。

2. 实验背景在现代社会中,算法的应用无处不在。

无论是搜索引擎的排序算法,还是社交媒体的推荐算法,都离不开算法的支持。

因此,学习算法的分析与设计,对于计算机科学相关领域的学生来说具有重要的意义。

3. 实验目的本实验的主要目的是通过分析与设计一个特定算法,加深对算法的理解和应用。

通过实际操作,学生将能够熟悉算法的设计过程,并能够分析算法的效率和复杂性。

4. 实验步骤4.1 确定算法目标在开始实验之前,我们需要明确算法的目标。

在本实验中,我们将设计一个排序算法,用于对一组数字进行排序。

4.2 了解算法原理在设计算法之前,我们需要对目标算法的原理进行深入了解。

在本实验中,我们将选择经典的冒泡排序算法作为实现对象。

冒泡排序算法的基本思想是通过比较相邻的元素,并根据需要交换位置,使得每一轮循环都能使最大(或最小)的元素“冒泡”到数组的末尾。

通过多次迭代,最终实现整个数组的排序。

4.3 实现算法在了解算法原理后,我们将根据算法的步骤逐步实现。

具体步骤如下:1.遍历待排序数组,从第一个元素开始。

2.比较当前元素与下一个元素的大小。

3.如果当前元素大于下一个元素,则交换它们的位置。

4.继续比较下一个元素,直到遍历完整个数组。

5.重复上述步骤,直到没有需要交换的元素。

4.4 测试算法在实现算法之后,我们需要对其进行测试,以验证其正确性和效率。

我们可以准备一组随机的数字作为输入,并对算法进行测试。

通过比较输入和输出结果,我们可以判断算法是否正确。

同时,我们还可以通过计算算法的时间复杂性和空间复杂性来评估其效率。

在本实验中,我们将使用时间复杂性分析来评估算法的效率。

4.5 分析与总结通过测试和分析,我们将得出算法的执行时间和空间复杂性。

《算法设计与分析》课程实验报告 (算法问题求解基础1)

《算法设计与分析》课程实验报告 (算法问题求解基础1)
s1[i] = s1[i-1] * 10 + pow(10,i-1);
}
int s2[10] = {0,9,189,2889,38889,488889,5888889,68888889,788888889};
int a;
scanf("%d",&a);
int count;
count = 0;
while(a > 0){
题目二:最大间隙
源码:
#include<iostream>
#include<cstdio>
using namespace std;
double a[10000] = {0};
int main(){
int n;
cin>>n;
for(int i = 0 ; i < n ; i++){
cin>>a[i];
样例输出:
3.2
二、实验目的
(1)理解算法的概念
(2)理解函数渐近态的概念和表示方法
(3)初步掌握算法时间复杂度的计算方法
三、实验要求
(1)对于每个题目提交实验代码。
(2)根据程序设计测试数据,并记录测试结果,要求边界情况必须测试
(3)使用我们学过的分析方法分析你的算法的时间效率,如果可能,请进行算法的优化,尽量减小算法的时间效率或空间效率。
《算法设计与分析》课程实验报告
实验序号:1 实验项目名称:算法问题求解基础
一、实验题目
题目一:统计数字问题
题目描述
一本书的页码从自然数1开始顺序编码直到自然数n。输的页码按照通常的习惯编排,每个页码都不含有多余的前导数字0.例如,第6页用数字6表示,而不是06或者006等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2...8,9。

算法分析与设计实验报告 完整版

算法分析与设计实验报告 完整版

《算法分析与设计》课程实验实验报告专业:计算机科学与技术班级:姓名:学号:完成时间:2009年6月15日实验一算法实现一一、实验目的与要求熟悉C/C++语言的集成开发环境;通过本实验加深对分治法、贪心算法的理解。

二、实验内容:掌握分治法、贪心算法的概念和基本思想,并结合具体的问题学习如何用相应策略进行求解的方法。

三、实验题1. 【伪造硬币问题】给你一个装有n个硬币的袋子。

n个硬币中有一个是伪造的。

你的任务是找出这个伪造的硬币。

为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。

试用分治法的思想写出解决问题的算法,并计算其时间复杂度。

2.【找零钱问题】一个小孩买了价值为33美分的糖,并将1美元的钱交给售货员。

售货员希望用数目最少的硬币找给小孩。

假设提供了数目有限的面值为25美分、10美分、5美分、及1美分的硬币。

给出一种找零钱的贪心算法。

四、实验步骤理解算法思想和问题要求;编程实现题目要求;上机输入和调试自己所编的程序;验证分析实验结果;整理出实验报告。

五、实验程序1.伪造硬币问题源程序://c语言实现#include<stdio.h>#include<stdlib.h>#include<math.h>#define N 100#define N1 12//只能判断是否相等的天平void solve(int coin[],int count,int first,int last) {if (count==2) {printf("无法判断\n");return;}if (first==last) {//只有一个硬币时候printf("假币的序号为%d, 假币的重量为%d\n", first, coin[first]);}else if(last-first==1){ //如果只剩下两个硬币(此时count不为)if (first > 0) { //不是最开始的硬币if (coin[first] == coin[0]) //如果第first和第个相等,说明first 位置不是伪币solve(coin,count,first+1,last);else//否则,说明first位置是伪币solve(coin,count,first,last-1);}else if(last<count-1){ //不是最后的硬币if (coin[first]==coin[count-1]) //如果第first和最后一个相等,说明last位置不是伪币solve(coin,count,first+1,last);else//否则,说明first位置是伪币solve(coin,count,first,last-1);}}else if (first<last){int temp=(last-first+1)/3; //将硬币分为三组int sum1=0, sum2=0;for(int i=0;i<temp;i++){sum1+=coin[first+i];sum2+=coin[last-i];}if (sum1==sum2){ //两边的总重相等,在中间,递归solve(coin,count,first+temp,last-temp);}else {//在两边,不在中间if (sum1==coin[first+temp]*temp){ //左边的和中间的相等,在右边,递归solve(coin,count,last-temp+1,last);}else {solve(coin,count,first,first+temp-1); //右边的和中间的相等,在左边,递归}}}}void main() {int i;int coin[N]; //定义数组coin用来存放硬币重量for(i=0;i<N;i++) //初始化数组coin[i]=0; //所用硬币初始值为coin[N1]=1; //第N1个设置为,即伪币int cnt = N;printf("硬币个数:%d\n",cnt);solve(coin,cnt,0,cnt-1);}2找零钱问题(1)零钱个数无限制的时候:源程序://c语言实现#include<stdio.h>main(){int T[]={25,10,5,1};int a[5];int money,i,j;printf("输入钱数:\n");scanf("%d",&money);for(i=0;i<4;i++){a[i]=money/T[i];money=money%T[i];}printf("找钱结果:\n硬币:\t");for(i=0;i<=3;i++){printf("%d\t|\t",T[i]);}printf("\n个数:\t");for(i=0;i<=3;i++){printf("%d\t|\t",a[i]);}printf("\n");return(0);}(2)当零钱个数有个数限制的时候:源程序://c语言实现#include<stdio.h>main(){int T[]={25,10,5,1}; //硬币的面值int a[5]; //用来记录找钱的个数int count[]={1,2,10,1000}; //各个面值硬币的个数int money,i;printf("输入钱数:\n");scanf("%d",&money);for(i=0;i<4;i++){if(money>T[i]*count[i]){ //当剩余钱数大于当前硬币总值a[i]=count[i]; //当前硬币个数取现有的最大值money=money-T[i]*count[i];}else{a[i]=money/T[i];money=money%T[i];}}printf("找钱结果:\n硬币:\t");for(i=0;i<=3;i++){printf("%d\t|\t",T[i]);}printf("\n\n个数:\t");for(i=0;i<=3;i++){printf("%d\t|\t",a[i]);}printf("\n");return(0);}六、实验结果1伪造硬币问题运行结果:硬币个数:100假币的序号为12, 假币的重量为1截图:2找零钱问题(1、硬币个数无限制)运行结果:输入钱数:67找钱结果:硬币: 25 | 10 | 5 | 1 |个数: 2 | 1 | 1 | 2 |截图:3找零钱问题(2、硬币个数有限制,其中硬币个数限制分别为1,2,10和1000。

算法分析与设计实验报告

算法分析与设计实验报告

算法分析与设计实验报告算法分析与设计实验报告⼀.实验⽬的1掌握回溯法解题的基本思想以及算法设计⽅法;2.掌握动态规则法和分⽀限界法的基本思想和算法设计⽅法;3掌握深度优先遍历法的基本思想及运⽤;4.进⼀步的对N皇后问题,⼦集和数问题,0-1背包问题做深⼊的了解。

⼆.实验内容1.实现求n 皇后问题和⼦集和数问题的回溯算法。

2.⽤动态规划的⽅法实现0/1背包问题。

3.⽤分⽀限界法实现0/1背包问题。

4.⽤深度优化的⽅法遍历⼀个图,并判断图中是否有回路存在,如果有,请输出回路。

三.实验设计1. N 皇后问题:我是采取了尊循 top-down design 的顺序来设计整个算法和程序。

采⽤ OOP 的思想,先假设存在⼀个 · 表⽰棋盘格局的类 queens ,则定义回溯函数 solve_from(queens configuration),configuration 表⽰当前棋盘格局,算法不断扩展棋盘的当前格局(找到下⼀个⾮冲突位置),当找到⼀个解决⽅案时打印该⽅案。

该递归函数采⽤回溯法求出所有解。

main 函数调⽤ solve_from 时传递的实参是⼀个空棋盘。

对于模拟棋盘的 queens 类,我们可以定义三个数据成员: 1.size :棋盘的边长,即⼤⼩ .2. count :已放置的互不冲突的皇后数 3.array[][]:布尔矩阵,true 表⽰当前格有皇后这⾥需要稍加思考以便稍后可以简化程序:因为每⾏只能放⼀个皇后,从上到下,从左到右放,那么 count 个皇后占⽤的⾏为 0——count -1。

所以count 还表⽰下⼀个皇后应该添加在哪⼀⾏。

这样,和 remove 操作的⼊⼝参数就只需要提供列号就⾏了, add 降低了耦合度:)下⾯是程序运⾏结果:2.⼦集和数问题:本设计利⽤⼤⼩固定的元组来研究回溯算法,在此情况下,解向量的元素X (i )取1或0值,它表⽰是否包含了权数W (i ).⽣成图中任⼀结点的⼉⼦是很容易的。

贪心算法实现背包问题算法设计与分析实验报告

贪心算法实现背包问题算法设计与分析实验报告

算法设计与分析实验报告实验名称 贪心算法实现背包问题 评分 实验日期 年 月 日 指导教师 姓名 专业班级 学号一.实验要求1. 优化问题有n个输入,而它的解就由这n个输入满足某些事先给定的约束条件的某个子集组 成,而把满足约束条件的子集称为该问题的可行解。

可行解一般来说是不唯一的。

那些使目标函数取极值(极大或极小)的可行解,称为最优解。

2.贪心法求优化问题算法思想:在贪心算法中采用逐步构造最优解的方法。

在每个阶段,都作出一个看上去最优的决策(在一定的标准下)。

决策一旦作出,就不可再更改。

作出贪心决策的依据称为贪心准则(greedy criterion)。

3.一般方法1)根据题意,选取一种量度标准。

2)按这种量度标准对这n个输入排序3)依次选择输入量加入部分解中。

如果当前这个输入量的加入,不满足约束条件,则不把此输入加到这部分解中。

procedure GREEDY(A,n) /*贪心法一般控制流程*///A(1:n)包含n个输入//solutions←φ //将解向量solution初始化为空/for i←1 to n dox←SELECT(A)if FEASIBLE(solution,x)then solutions←UNION(solution,x)endifrepeatreturn(solution)end GREEDY4. 实现典型的贪心算法的编程与上机实验,验证算法的时间复杂性函数。

二.实验内容1. 编程实现背包问题贪心算法。

通过具体算法理解如何通过局部最优实现全局最优,并验证算法的时间复杂性。

2.输入5个的图的邻接矩阵,程序加入统计prim算法访问图的节点数和边数的语句。

3.将统计数与复杂性函数所计算比较次数比较,用表格列出比较结果,给出文字分析。

三.程序算法1. 背包问题的贪心算法procedure KNAPSACK(P,W,M,X,n)//P(1:n)和W(1;n)分别含有按P(i)/W(i)≥P(i+1)/W(i+1)排序的n件物品的效益值和重量。

算法设计与分析 实验报告

算法设计与分析 实验报告

算法设计与分析实验报告算法设计与分析实验报告一、引言在计算机科学领域,算法设计与分析是非常重要的研究方向。

本次实验旨在通过实际案例,探讨算法设计与分析的方法和技巧,并验证其在实际问题中的应用效果。

二、问题描述本次实验的问题是求解一个整数序列中的最大子序列和。

给定一个长度为n的整数序列,我们需要找到一个连续的子序列,使得其和最大。

三、算法设计为了解决这个问题,我们设计了两种算法:暴力法和动态规划法。

1. 暴力法暴力法是一种朴素的解决方法。

它通过枚举所有可能的子序列,并计算它们的和,最终找到最大的子序列和。

然而,由于需要枚举所有子序列,该算法的时间复杂度为O(n^3),在处理大规模数据时效率较低。

2. 动态规划法动态规划法是一种高效的解决方法。

它通过定义一个状态转移方程,利用已计算的结果来计算当前状态的值。

对于本问题,我们定义一个一维数组dp,其中dp[i]表示以第i个元素结尾的最大子序列和。

通过遍历整个序列,我们可以利用状态转移方程dp[i] = max(dp[i-1]+nums[i], nums[i])来计算dp数组的值。

最后,我们返回dp数组中的最大值即为所求的最大子序列和。

该算法的时间复杂度为O(n),效率较高。

四、实验结果与分析我们使用Python编程语言实现了以上两种算法,并在相同的测试数据集上进行了实验。

1. 实验设置我们随机生成了1000个整数作为测试数据集,其中包含正数、负数和零。

为了验证算法的正确性,我们手动计算了测试数据集中的最大子序列和。

2. 实验结果通过对比实验结果,我们发现两种算法得到的最大子序列和是一致的,验证了算法的正确性。

同时,我们还对两种算法的运行时间进行了比较。

结果显示,暴力法的运行时间明显长于动态规划法,进一步证明了动态规划法的高效性。

五、实验总结通过本次实验,我们深入了解了算法设计与分析的方法和技巧,并通过实际案例验证了其在解决实际问题中的应用效果。

我们发现,合理选择算法设计方法可以提高算法的效率,从而更好地解决实际问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

华中科技大学算法分析与设计实验报告学生姓名:庞亮系别:软件学院专业与班号:软件工程0805学号:U200818042实验时间:第二周,星期三,晚上实验房间号:软件学院五楼机房[实验名称]Strassen’s 矩阵乘法和最近点对算法[实验目的]1、理解“分治法”算法设计思想及其实现步骤2、掌握分治算法效率递归分析方法3、掌握主方式求解递归式方法[实验条件]硬件:计算机软件:计算机程序语言开发平台,如C、C++、Java、Matlab。

学生:至少掌握一门计算机程序设计语言,如C、C++、Java、Matlab。

[实验内容及要求]1、利用计算机程序设计语言,实现教材第28.2 章介绍的“Strassen’s 矩阵乘法算法”,自主生成两个8×8 的矩阵,检验算法的正确性并输出算法结果。

2、比较 Strassen’s 矩阵乘法算法和数学定义的矩阵乘法算法效率之间的区别,并用直观的表达方式把两种不同矩阵乘法的效率随矩阵维数的变化趋势。

3、利用计算机程序设计语言,实现教材第33.4 章介绍的“最近点对算法”,在拟定的二维空间点集上检验算法的正确性并输出算法结果。

[实验原理]1.Strassen’s矩阵乘法简介Strassen’s算法是将矩阵分成了如图所示的均等的四块。

分后的每一块儿任然还是方阵。

所以可以由大问题分解成若干子问题进行解决。

为了能使子问题能够返回到原始问题。

Strassen‘s算法提出了如下的计算公式,可以用矩阵的子矩阵计算出S1-S7,然后又由S1-S7合成原始矩阵。

而S1-S7的计算又是方阵的乘法。

由此使用分治算法便可以解决问题。

2.最近点对问题(Closest Pair Problems)算法简介首先这个问题也是采用了分治的思想,将空间内的距离分成三类,分界线左边的点之间的距离,分界线右边的点之间的距离,还有分界线两边距离为D 的区域内的两点间距离。

[算法具体代码]1.矩阵相乘问题// Strassen.cpp : 定义控制台应用程序的入口点。

////********************************************************************************#include"stdafx.h"#include"stdlib.h"#define AM Copy(A,0,0,A.v/2)#define BM Copy(A,A.v/2,0,A.v/2)#define CM Copy(A,0,A.v/2,A.v/2)#define DM Copy(A,A.v/2,A.v/2,A.v/2)#define EM Copy(B,0,0,B.v/2)#define FM Copy(B,B.v/2,0,B.v/2)#define GM Copy(B,0,B.v/2,B.v/2)#define HM Copy(B,B.v/2,B.v/2,B.v/2)#define V 2//********************************************************************************//矩阵结构typedef struct matrix{int v;int x[16][16];}Matrix;//******************************************************************************** //输入输出文件FILE *fout;FILE *fin;//******************************************************************************** //矩阵打印(文件)void fPrint(Matrix A){for(int j=0;j<A.v;j++){for(int i=0;i<A.v;i++){fprintf(fout,"%d ",A.x[i][j]);}fprintf(fout,"\n");}}//******************************************************************************** //矩阵打印(屏幕)void Print(Matrix A){for(int j=0;j<A.v;j++){for(int i=0;i<A.v;i++){printf("%d ",A.x[i][j]);}printf("\n");}}//******************************************************************************** //矩阵截取Matrix Copy(Matrix X,int x,int y,int v){Matrix temp;temp.v=v;for(int i=x;i<x+v;i++){for(int j=y;j<y+v;j++){temp.x[i-x][j-y]=X.x[i][j];}}return temp;}//******************************************************************************** //矩阵相减Matrix Minus(Matrix A,Matrix B){Matrix temp;temp.v=A.v;for(int j=0;j<A.v;j++){for(int i=0;i<A.v;i++){temp.x[i][j]=A.x[i][j]-B.x[i][j];}}return temp;}//******************************************************************************** //矩阵相加Matrix Plus(Matrix A,Matrix B){Matrix temp;temp.v=A.v;for(int j=0;j<A.v;j++){for(int i=0;i<A.v;i++){temp.x[i][j]=A.x[i][j]+B.x[i][j];}}return temp;}//A: Copy(A,0,0,A.v/2)//B: Copy(A,A.v/2,0,A.v/2)//C: Copy(A,0,A.v/2,A.v/2)//D: Copy(A,A.v/2,A.v/2,A.v/2);//E: Copy(B,0,0,B.v/2)//F: Copy(B,B.v/2,0,B.v/2)//G: Copy(B,0,B.v/2,B.v/2)//H: Copy(B,B.v/2,B.v/2,B.v/2);//******************************************************************************** //矩阵合并Matrix Merge4(Matrix A,Matrix B,Matrix C,Matrix D){Matrix temp;temp.v=A.v*2;for(int i=0;i<A.v;i++){for(int j=0;j<A.v;j++){temp.x[i][j]=A.x[i][j];}}for(int i=0;i<B.v;i++){for(int j=0;j<B.v;j++){temp.x[i+B.v][j]=B.x[i][j];}}for(int i=0;i<C.v;i++){for(int j=0;j<C.v;j++){temp.x[i][j+C.v]=C.x[i][j];}}for(int i=0;i<D.v;i++){for(int j=0;j<D.v;j++){temp.x[i+D.v][j+D.v]=D.x[i][j];}}return temp;}//******************************************************************************** //矩阵相乘Matrix Mutiply(Matrix A,Matrix B){if(A.v==1 && B.v==1){A.x[0][0]=A.x[0][0]*B.x[0][0];return A;}Matrix s1,s2,s3,s4,s5,s6,s7;s1=Mutiply(AM,Minus(FM,HM));s2=Mutiply(Plus(AM,BM),HM);s3=Mutiply(Plus(CM,DM),EM);s4=Mutiply(DM,Minus(GM,EM));s5=Mutiply(Plus(AM,DM),Plus(EM,HM));s6=Mutiply(Minus(BM,DM),Plus(GM,HM));s7=Mutiply(Minus(AM,CM),Plus(EM,FM));fPrint(Plus(Plus(s5,s6),Minus(s4,s2)));fPrint(Plus(s1,s2));fPrint(Plus(s3,s4));fPrint(Minus(Minus(s1,s7),Minus(s3,s5)));returnMerge4(Plus(Plus(s5,s6),Minus(s4,s2)),Plus(s1,s2),Plus(s3,s4),Minus(Minus(s1,s7),Minus(s3,s5 )));}//********************************************************************************//数据输入Matrix RnMatrix(int v){Matrix temp;temp.v=v;for(int j=0;j<V;j++){for(int i=0;i<V;i++){fscanf(fin,"%d",&temp.x[i][j]);//1;//rand()%10;}}return temp;}//********************************************************************************//入口函数int _tmain(int argc, _TCHAR* argv[])fout=fopen("out.txt","w");fin=fopen("in.txt","r");Matrix A,B;A.v=V;B.v=V;A=RnMatrix(V);B=RnMatrix(V);fclose(fin);Print(Mutiply(A,B));getchar();return 0;}2.最近点问题// Closest_Pair_Problems.cpp : 定义控制台应用程序的入口点。

相关文档
最新文档