算法分析与设计——分治法实验报告


   算法导论  课程设计


题    目:  算法导论课程设计实验报告

学院班级:        1613013        

学    号:      16130130216      

姓    名:        库 妍          

主讲教师        张立勇         

日    期:       2019.6.3        

分治法

一、Implement exercise 2.3-7........................................4

二、Implement priority queue........................................6

三、Quicksort.......................................................8

四、找出第k大的元素...............................................10

动态规划法

一、Matrix-chain product...........................................13

二、Longest Common Subsequence (LCS)................................15

三、Longest Common Substring.......................................16

四、Max Sum........................................................18

五、Shortest path in multistage graphs.............................19

贪心法

一、Knapsack Problem...............................................22

二、scheduling problem.............................................23

三、Single-source shortest paths...................................24

四、All-pairs shortest paths.......................................26

回溯法

一、0/1 Knapsack Problem...........................................29

二、8-Queen problem................................................30


   算法导论  课程设计


题    目:    分 治 法

学院班级:        1613013        

学    号:      16130130216      

姓    名:        库 妍          

主讲教师        张立勇         

日    期:       2019.3.21        

一、Implement exercise 2.3-7

1、实验题目

描述一个运行时间为O(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素。

2、使用的算法

(1)运用归并排序算法,先对集合中的整数进行排序。

(2)归并排序后,运用二分查找两个数和为x的元素。 

3、算法分析与设计

(1)首先将S进行排序,然后再通过查找算法进行查找。插入排序算法复杂度最差O(n^2),归并排序最差为O(nlgn),堆排序为最差为O(nlgn),快速排序最差为O(n^2),这里直接使用归并排序。归并排序运用的是分治思想,时间复杂度为 O(nlgn),能够满足题目要求的运行时间。

①分解(devide):归并排序将n个元素分成各含n/2g个元素的子序列,对已经分解的两个部分再进行分解直到将数组分解成单个元素为止。

②解决(conquer):用合并排序法递归求解排序子序列。

③合并(combine):合并部分是将已经排序的两个子序列进行合并得到结果。

(2)二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少。折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(lg n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右 半部继续搜索x。

1、项目测试(功能与性能)

时间复杂度为O(nlgn)

1、实验总结

遇到的问题及解决:

MERGE过程中,子数组A[p..q]和A[q+1..r],待合并个数n1 = q - p + 1,n2 = r - q,计算时容易出错。

另外,进行二分查找时right = A.length - 1,数组最后一个元素的下标是数组A的长度减1。

二、Implement priority queue

1、实验题目

实现优先级队列,即需要支持以下操作:INSERT(S,x):把元素x插入到集合S中;MAXMUM(S):返回S中具有最大key的元素;EXTRACT-MAX(S):去掉并返回S中的具有最大key的元素; INCREASE-KEY(S,x,k):将元素x的关键字值增到k。

2、使用的算法

运用堆排序,来实现优先队列。

3、算法分析与设计

(1)堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。堆排序算法分为3个过程,MAX-HEAPIEY:调整堆以满足小顶堆性质,其时间复杂度为O(lgn);BUILD-MAXHEAP:从无序的输入数据数组中构造小顶堆,其时间复杂度为线性时间;HEAP-SORT:对数组进行原址排序,其时间复杂度为O(nlgn)。

(2)在堆的基础上实现优先队列INSERT、MAXMUM、EXTRACT-MAX、INCREASE-KEY,时间复杂度为O(lgn)。

4、项目测试(功能与性能)

1、实验总结

编写HEAP-EXTRACT-MAX函数的时候,当去掉第一个元素后,程序要调用MAX-HEAPIFY进行调整堆,否则最后序列是无序状态。另外,开始没有理解BUILD-MAX-HEAP的过程,当对某结点调用BUILD-MAX-HEAP时,该结点的两棵子树都已是最大堆。

三、Quicksort

1、实验题目

实现quick_sort算法,并且回答以下两个问题:

(1)待排数组中的元素值都相同的情况下,运用quick_sort需要进行多少次比较?

(2)对于n个元素的数组,运用quick_sort举出需要进行比较次数的上限和下限是多少?

2、使用的算法

使用了快速排序算法。

3、算法分析与设计

快速排序采用分治策略,时间复杂度为O(nlgn),但是最坏情况下为O(n2),并且快速排序算法属于原地排序,并不需要开辟空间。快速排序复杂的步骤为其分解的步骤。

①分解(divide):数组A[p..r]被划分为两个子数组A[p..q-1]和A[q+1..r], 使得A[p..q-1]中的每个元素都小于等于A[q],而且,小于等于A[q+1..r] 中的每个元素。下标q也在这个划分过程中进行计算。

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

③合并(combine):因为两个子数组是就地排序的,将它们的合并不需要操 作,整个数组A[p..r]已排序。

4、项目测试(功能与性能)

5、实验总结

问题回答:

(1)当选择第一个或最后一个参考点时,当n个元素相同时为最坏情况,比较的数目是n *(n-1)/ 2。

(2)快速排序比较的最小数目是nlgn,最大的比较数是n^2。

四、找出第k大的元素

1、实验题目

运用分治的策略将两个已经排好序的序列中,找出第k大的元素,且要求时间复杂度为O(lgm + lgn),其中m和n分别为两个序列的长度。

2、使用的算法

使用分治策略

3、算法分析与设计

解法一:

(1)分解:因为已经是两个独立的的序列,所以不用进行分解。 

(2)解决:因为两个序列为已经排好的序列,因此不用分开进行排序。 

(3)利用归并排序中的merge函数,将这两个序列分别看成是L[]和R[]两个数组,通过开辟一个新的数组,将两个数组合并成一个新的排好序的序列,在根据要求的k值,对新的数组进行取值。

解法二:题目只要求第k大的数,没必要花力气将数组全部再排序,可以定义两个游标分别指向两个有序数组,按序移动,并用count计数,当count等于k时,返回两个游标指向的数中最小的那一个。

4、项目测试(功能与性能)

时间复杂度为O(lgm + lgn)。

5、实验总结

理解分治策略的三个步骤:分解、解决和合并在具体问题上的应用,根据时间复杂度与所学的算法进行结合。为了解决一个问题,算法要一次或多次地调用其自身来解决相关的子问题,这些算法常采用分治策略。分治法将原问题划分成n个规模较小而结构与原问题相似的子问题,递归地解决这些子问题,然后合并其结果,得到子问题的解。

原文地址:https://www.cnblogs.com/ku1274755259/p/11108470.html

时间: 2024-08-04 21:54:34

算法分析与设计——分治法实验报告的相关文章

算法分析与设计——贪心法实验报告

   算法导论  课程设计 成 绩 题    目:    贪心法 学院班级:        1613013         学    号:      16130130216       姓    名:        库 妍           主讲教师:        张立勇          日    期:       2019.5.9         一.Knapsack Problem 1.实验题目 下面有5个具有值和权重列表的项目,背包最多可以包含100磅.解决了分数背包和0/1背包问题

嵌入式软件设计第十次实验报告

学号:140201112          姓名:孙佳文 组别:第3组                  实验地点:D19 一.实验目的: 1.了解GSM模块SIM900A的使用方法. 2.掌握使用串口发送AT命令驱动SIM900A的 方法. 二.实验内容: 1.使用AT命令进行模块测试,拨打固定电话. 2.编写程序利用触摸屏完成任意电话的呼叫. 三.实验过程描述及结果展示: 实验器材:STM32F407开发板.LCD显示屏 1.实验原理 SIM900A跳线帽连接方式: 长按PWR_KEY键后网

嵌入式软件设计第12实验报告-140201133-李宇昕

学号:140201133                   姓名:李宇昕 组别:第3组           实验地点:D19 一.实验目的: 1.掌握通过GSM短信远程与嵌入式设备进行交互的方法. 二.实验内容: 1.编写程序把嵌入式开发板采集到的温度信息通过GSM短信传送给指定号码.(每10秒发送1次) 2.编写程序,使手机可以通过短信指令的方式控制嵌入式开发板的蜂鸣器和LED灯.(比如手机编辑"BEEP_ON"和"BEEP_OFF"控制嵌入式开发板的蜂鸣器)

20172304 实验二 《Java面向对象程序设计》 实验报告

20172304 实验二 <Java面向对象程序设计> 实验报告 - 课程名称:<程序设计与数据结构> - 学生班级:1723班 - 学生姓名:段志轩 - 学生学号:20172304 - 实验时间:2018年4月18日 - 实验名称:<Java面向对象程序设计> - 指导老师:王志强老师 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 完成蓝墨云上 (1)-(5)实验. 实验要

面向对象实验报告二

面向对象分析与设计第二次实验报告   一.类的不同类型的方法,属性的可见性 可见/访问性 在同一类中 同一包中 不同包中 同一包子类中 不同包子类中 public yes yes yes yes yes protected yes yes no yes yes package yes yes no yes no private yes no no no no public  class Student { public String home; protected int age; privat

算法分析与设计——动态规划法实验报告

   算法导论  课程设计 成 绩 题    目:    动态规划法 学院班级:        1613013         学    号:      16130130216       姓    名:        库 妍           主讲教师:        张立勇          日    期:       2019.4.11         (1)描述最优子结构:如果最优的加括号的方式将其分解为Ai..k与Ak+1..j的乘积,则分别对Ai..k与Ak+1..j加括号的方式也

算法实验:分治法合并排序(C++)

这篇文章分两部分来写,第一部分写代码的实现过程,第二部分把实验报告从头到尾呈现出来. 我习惯调试使用的编译器是DEV C++,不是vs系列的,可能头文件上有点区别.但是下面的报告是我放到vs里面测试过的,可以直接用,不影响. 第一部分:(解析) 题目:随机产生一个整型数组,然后用合并排序将该数组做升序排列,要求输出排序前和排序后的数组. 题目分析: 需要随机产生一个整数数组: 采用的算法是合并排序,也就是用归并排序: 输出排序后的数组. 随机产生一个整数数组:这个问题首先想到的是用rand()函

南邮算法分析与设计实验2 动态规划法

动态规划法 实验目的: 加深对动态规划法的算法原理及实现过程的理解,学习用动态规划法解决实际应用中的最长公共子序列问题. 实验内容: 用动态规划法实现求两序列的最长公共子序列,其比较结果可用于基因比较.文章比较等多个领域. 实验要求: 掌握动态规划法的思想,及动态规划法在实际中的应用:分析最长公共子序列的问题特征,选择算法策略并设计具体算法,编程实现两输入序列的比较,并输出它们的最长公共子序列. 实验原理及内容(包括操作过程.结果分析等) 1.最长公共子序列(LCS)问题是:给定两个字符序列X=

2109春第一次课程设计实验报告

2019春第一次课程设计实验报告 一.实验项目名称: 飞机游戏的编写 二.实验项目功能描述: 这个实验主要是实现游戏的正常运行,实现控制飞机的移动功能,增加其实用度, 同时还实现发射子弹和出现敌机的操作,通过发射子弹,击败静止的或者移动的 敌机,最终实现通关或者死亡: 三.项目模块结构介绍: 第一步:代码重构,实现控制飞机移动的功能. 第二步:新式子弹,初始化子弹在飞机的正上方,子弹发射后自动向上移动: 第三步:静止的敌机,增加静止的敌机: 第四步:敌机移动,让敌机自动向下移动: 第五步:击中敌