算法分析与设计实验报告-最大字段和问题

实验报告

课程名称 算法分析与设计 实验项目名称 最大字段和问题 班级与班级代码 实验室名称(或课室) 实验楼802 专 业: 计算机科学与技术 任课教师: 李绍华 学 号: 姓 名: 实验日期: 2016年11月25日

广东财经大学教务处 制

姓名 实验报告成绩

评语:

指导教师(签名) 年 月 日

说明:指导教师评分后,实验报告交院(系)办公室保存。

一、实验目的

(1)能够熟悉最大字段和问题这个算法

(2)分别使用三种不同算法:暴力算法、分治算法、动态规划算法,体会其算法思想并比较时间复杂度。

二、实验设备

硬件: P4 2.0G 1G内存60G 硬盘以上电脑 软件: C 、C++编程环境,Java 编程环境,windows7

三、问题与算法描述

1、问题描述

给定由n 个整数(可能为负整数)组成的序列a1、a2、……a n ,求该序列形如∑a k 的字段和的最大值。当所有整数均为负整数时定义其最大字

k =i j

段和为0。依次定义,所求的最优值为max{0,2、算法描述 BF 算法

1

a k }。 max ∑k =i

j

对于起点 i,遍历所有长度为1,2, …,n-i+1的子区间和,遍历所有的字 段,找出最大字段和。 分治算法

求子区间及最大和,从结构上是非常适合分治法的,因为所有子区间 [start, end]只可能有以下三种可能性: 1.在[1, n/2]这个区域内 2. 在[n/2+1, n]这个区域内

3. 起点位于[1,n/2],终点位于[n/2+1,n]内

以上三种情形的最大者,即为所求. 前两种情形符合子问题递归特性,所 以递归可以求出. 对于第三种情形,则必然包括了n/2和n/2+1两个位置, 这样就可以利用第二种穷举的思路分别向左右扩张求出。 动态规划

扩展到二维空间令b[j]表示以位置 j 为终点的所有子区间中和最大的一 个子问题:如j 为终点的最大子区间包含了位置j-1, 则以j-1为终点的最 大子区间必然包括在其中,如果b[j-1] >0, 那么显然b[j] = b[j-1] + a[j],用之前最大的一个加上a[j]即可,因为a[j]必须包含;如果 b[j-1]

3、算法时间复杂性分析

BF 算法:经过两次嵌套循环时间复杂度:O(n2)

分治算法:每递归一次需logn ,全部需要n 次运算量,时间复杂度:O(nlogn)动态规划算法:只经历了一次循环,时间复杂度:O(n)

四、实验调试过程中出现的问题

实验过程中,主要遇到了两个问题,随机函数和时间计算函数不知如何进行,虽然之前在以前的课程中学习过,但是由于时间长已经忘记,通过查阅和同学帮助最终解决。 五、实验结果

1. 源代码

package 算法实验2;

import java.util.Random;

public class Maxfield { static int a [] =new int [1001];

public static void main(String[] args ) { // TODO Auto-generated method stub Random ran =new Random(); for (int i =1;i

System. out .print("" );

}

long starttime = System.nanoTime (); int sum1= maxSum1();

long endtime = System.nanoTime (); long starttime1 = System.nanoTime (); int sum2=maxSum2(1,a . length -1); long endtime1 = System.nanoTime (); long starttime2 = System.nanoTime (); int sum3=maxSum3();

long endtime2 = System.nanoTime ();

System. out .println(" BF算法所求最大字段和为: "+sum1+" BF" +(endtime -starttime )); System. out .println(" 分治算法所求最大字段和为 :" +sum2+" " +(endtime1-starttime1)); System. out .println(" 动态规划所求最大字段和为: "+sum3+" " +(endtime2-starttime2));

}

public static int maxSum1(){ long = System.currentTimeMillis (); int n =a . length -1; int sum =0;

int =0;int =0; for (int i =1;i

for (int j =i ; j sum ){ sum =thissum ; besti =i ;

bestj = j ;

算法所用时间: 分治算法所用时间 :动态规划所用时间:

}

}

long = System.currentTimeMillis (); return sum ;

}//BF算法

public static int maxSum2(int left , int right ){

int sum =0;

if (left ==right ) sum =a [left ]>0?a [left ]:0; else { }

return sum ;

int center =(left +right )/2; int leftsum =maxSum2(left , center ); int rightsum =maxSum2(center +1,right ); int s1=0; int lefts =0;

for (int i =center ; i >=left ; i --){ }

int s2=0; int rights =0;

for (int i =center +1;i

sum =s1+s2;

if (sum

rights +=a [i ];

if (rights >s2) s2=rights ; lefts +=a [i ];

if (lefts >s1) s1=lefts ;

}//分治算法

public static int maxSum3(){

int n =a . length -1; int sum =0; int b =0;

for (int i =1;i

if (b >0)b +=a [i ]; else b =a [i ]; if (b >sum ) sum =b ;

}

}

return sum ; //动态规划

2. 结果截图

时间单位:ns

(1)10个数据

(2)50个数据

(3)100个数据

(4)500个数据

(5)1000个数据

(6)5000个数据

(7)10000个数据

(8)100000个数据

通过时间复杂度的分析和实验结果可以看出各算法的好坏依次是动态规划算法、分治算法,BF 算法,当数据较小时各算法之间的差距并不大,甚至有时BF 算法还优于分治,而且数据越大,BF 算法的缺点越明显,与动态规划的差距越大。

实验报告

课程名称 算法分析与设计 实验项目名称 最大字段和问题 班级与班级代码 实验室名称(或课室) 实验楼802 专 业: 计算机科学与技术 任课教师: 李绍华 学 号: 姓 名: 实验日期: 2016年11月25日

广东财经大学教务处 制

姓名 实验报告成绩

评语:

指导教师(签名) 年 月 日

说明:指导教师评分后,实验报告交院(系)办公室保存。

一、实验目的

(1)能够熟悉最大字段和问题这个算法

(2)分别使用三种不同算法:暴力算法、分治算法、动态规划算法,体会其算法思想并比较时间复杂度。

二、实验设备

硬件: P4 2.0G 1G内存60G 硬盘以上电脑 软件: C 、C++编程环境,Java 编程环境,windows7

三、问题与算法描述

1、问题描述

给定由n 个整数(可能为负整数)组成的序列a1、a2、……a n ,求该序列形如∑a k 的字段和的最大值。当所有整数均为负整数时定义其最大字

k =i j

段和为0。依次定义,所求的最优值为max{0,2、算法描述 BF 算法

1

a k }。 max ∑k =i

j

对于起点 i,遍历所有长度为1,2, …,n-i+1的子区间和,遍历所有的字 段,找出最大字段和。 分治算法

求子区间及最大和,从结构上是非常适合分治法的,因为所有子区间 [start, end]只可能有以下三种可能性: 1.在[1, n/2]这个区域内 2. 在[n/2+1, n]这个区域内

3. 起点位于[1,n/2],终点位于[n/2+1,n]内

以上三种情形的最大者,即为所求. 前两种情形符合子问题递归特性,所 以递归可以求出. 对于第三种情形,则必然包括了n/2和n/2+1两个位置, 这样就可以利用第二种穷举的思路分别向左右扩张求出。 动态规划

扩展到二维空间令b[j]表示以位置 j 为终点的所有子区间中和最大的一 个子问题:如j 为终点的最大子区间包含了位置j-1, 则以j-1为终点的最 大子区间必然包括在其中,如果b[j-1] >0, 那么显然b[j] = b[j-1] + a[j],用之前最大的一个加上a[j]即可,因为a[j]必须包含;如果 b[j-1]

3、算法时间复杂性分析

BF 算法:经过两次嵌套循环时间复杂度:O(n2)

分治算法:每递归一次需logn ,全部需要n 次运算量,时间复杂度:O(nlogn)动态规划算法:只经历了一次循环,时间复杂度:O(n)

四、实验调试过程中出现的问题

实验过程中,主要遇到了两个问题,随机函数和时间计算函数不知如何进行,虽然之前在以前的课程中学习过,但是由于时间长已经忘记,通过查阅和同学帮助最终解决。 五、实验结果

1. 源代码

package 算法实验2;

import java.util.Random;

public class Maxfield { static int a [] =new int [1001];

public static void main(String[] args ) { // TODO Auto-generated method stub Random ran =new Random(); for (int i =1;i

System. out .print("" );

}

long starttime = System.nanoTime (); int sum1= maxSum1();

long endtime = System.nanoTime (); long starttime1 = System.nanoTime (); int sum2=maxSum2(1,a . length -1); long endtime1 = System.nanoTime (); long starttime2 = System.nanoTime (); int sum3=maxSum3();

long endtime2 = System.nanoTime ();

System. out .println(" BF算法所求最大字段和为: "+sum1+" BF" +(endtime -starttime )); System. out .println(" 分治算法所求最大字段和为 :" +sum2+" " +(endtime1-starttime1)); System. out .println(" 动态规划所求最大字段和为: "+sum3+" " +(endtime2-starttime2));

}

public static int maxSum1(){ long = System.currentTimeMillis (); int n =a . length -1; int sum =0;

int =0;int =0; for (int i =1;i

for (int j =i ; j sum ){ sum =thissum ; besti =i ;

bestj = j ;

算法所用时间: 分治算法所用时间 :动态规划所用时间:

}

}

long = System.currentTimeMillis (); return sum ;

}//BF算法

public static int maxSum2(int left , int right ){

int sum =0;

if (left ==right ) sum =a [left ]>0?a [left ]:0; else { }

return sum ;

int center =(left +right )/2; int leftsum =maxSum2(left , center ); int rightsum =maxSum2(center +1,right ); int s1=0; int lefts =0;

for (int i =center ; i >=left ; i --){ }

int s2=0; int rights =0;

for (int i =center +1;i

sum =s1+s2;

if (sum

rights +=a [i ];

if (rights >s2) s2=rights ; lefts +=a [i ];

if (lefts >s1) s1=lefts ;

}//分治算法

public static int maxSum3(){

int n =a . length -1; int sum =0; int b =0;

for (int i =1;i

if (b >0)b +=a [i ]; else b =a [i ]; if (b >sum ) sum =b ;

}

}

return sum ; //动态规划

2. 结果截图

时间单位:ns

(1)10个数据

(2)50个数据

(3)100个数据

(4)500个数据

(5)1000个数据

(6)5000个数据

(7)10000个数据

(8)100000个数据

通过时间复杂度的分析和实验结果可以看出各算法的好坏依次是动态规划算法、分治算法,BF 算法,当数据较小时各算法之间的差距并不大,甚至有时BF 算法还优于分治,而且数据越大,BF 算法的缺点越明显,与动态规划的差距越大。


相关内容

  • 计算机实验室排课系统的设计与实现毕业论文
  • 忻 州 师 范 学 院 计算机系本科毕业(设计)论文 课题名称 计 算 机 实 验 室 排 课 系 统 的 设 计 与 实 现 专 业 计 算 机 科 学 与 技 术 姓 名 杨 岩 学 号 2 0 1 1 0 8 1 1 2 0 4 3 指导教师 郑 志 荣 二零一三年六月 目 录 1 引 言 . ...

  • 编译原理实验指导书(2015)
  • LIAOCHENG UNIVERSITY 编译原理 实验指导书 聊城大学计算机学院 2011年3月 目 录 <编译原理>课程实验教学大纲 ............................. 1 实验一 词法分析器的设计 .............................. ...

  • 动态规划法实验报告
  • 数学与计算机学院实验报告 一.实验项目信息 项目名称: 动态规划法实验实验时间: 2016/04/27 实验学时: 03 学时 实验地点: 工科楼二.实验目的及要求 理解动态规划法的设计思想. 掌握动态规划法的求解步骤. 掌握用动态规划法解题的算法框架. 三.实验环境 计算机Windows 7 My ...

  • 存储器管理实验报告
  • 操作系统实验报告 2012 年 12 月 24 日 学 专 号 业 1008114124 姓 名 L 刘凯利 班 级 时 间 12 月 27 日 计科二班 计算机科学与技术 实验题目: 存储器管理 实验目的: 1.通过模拟实现最佳页面置换的算法,熟悉存储器管理方式: 2.掌握虚拟存储请求页式存储管理 ...

  • 数据挖掘实验指导书
  • <数据挖掘>实验指导书 2011年3月1日 长沙学院信息与计算科学系 前言 随着数据库技术的发展,特别是数据仓库以及Web 等新型数据源的日益普及,形成了数据丰富,知识缺乏的严重局面.针对如何有效地利用这些海量的数据信息的挑战,数据挖掘技术应运而生,并显示出强大的生命力.数据挖掘技术使数 ...

  • 计算机网络实验报告
  • <计算机网络实验> 指导书(V1) 设计:林亚平 廖鑫 编写:廖鑫.吕方等 湖南大学信息科学与工程学院 2015年3月 目 录 一. 实验教学目标 ...................................................................... ...

  • 工资管理系统实验报告
  • 目录 第一部分 工资管理系统背景介绍 „„„„„„„„„„„„„„„„„„„„„(1) 第二部分 工资管理系统可行性研究 „ „„„„„„„„„„„„„„„„„„„(1) 一. 二. 系统可行性分析 „„„„„„„„„„„„„„„„„„„„„„„(1) 技术可行性分析 „„„„„„„„„„„„„„„ ...

  • 检索报告书写样例
  • 文献检索综合报告 题目:玻璃纤维用聚酯乳液的研制及应用 姓名 罗元彬 学院 班级 学号 教师 1.课题分析(技术要点介绍) 玻璃纤维新品种的开发,其关键在于浸润剂技术.浸润剂中重要组份是成膜剂.除对纤维起保护作用外,它对玻璃纤维硬挺性集束性.短切性.分散性,浸透性 等起着关键的作用.因此,研制出所希 ...

  • 数据挖掘算法详解
  • 数据预处理:数据挖掘技术是面向大型数据集的,而且源数据库中的数据是动态变化的,数据存在噪声.不确定性.信息丢失.信息冗余.数据分布稀疏等问题这就要求我们必须对原始数据进行清洗,尽可能的保证数据的质量.另外,由于挖掘的实际需要,往往需要对原始数据进行一系列的转换和处理,从而得到我们真正需要的数据.此外 ...