算法设计与分析第二章作业

这篇具有很好参考价值的文章主要介绍了算法设计与分析第二章作业。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 描述最大字段和的分治算法

题目

算法设计与分析第二章作业,算法,数据结构

思路

判断最大子段和,可以用分治的思想,每次将序列一分为二,选择两个序列的最大子段和。

但是这里还有一种可能,就是子段可以横跨两个子序列,所以我们的最大子段和就是:

MAX(左边序列最大字段和,横跨两序列的最大子段和,右边序列的最大子段和)。

对于左右两边的最大子段和,可以用分治递归的方法来做,临界条件就是序列中只剩一个数了,这时候最大子段和就是这个数,而递归函数就是对左右两边分别求最大子段和(调用自身),而且还得求跨序列的最大子段和,取三者的最大值来返回。

那么怎么求跨序列的最大子段和呢?其实很简单,首先要对原来的大序列添加几个指针,开头的是指针l,最右边的是指针r,因为要分治,所以再设置一个中间的指针mid,此时序列就可以分为两个部分,分别是(l,mid)和(mid+1,r),这时候的跨序列子段,必须包含mid和mid+1这两个地方,当然也可以向左或向右延申,所以,我们只需要求出从mid开始向左延申的最大字段和,还有从mid+1开始向右延申的最大子段和,将两者相加,就能得到跨序列的最大子段和了。

思路很好理解,照着上面的描述画出图来就一目了然了。下面来看看代码实现吧。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5;
int n, a[N];
int maxSum (int left, int right) {
    if (left == right)
        return a[left];
    int mid = left + right >> 1;
    int lmax = maxSum (left, mid);
    int rmax = maxSum (mid + 1, right);
    int sum = a[mid];
    int clmax = a[mid];
    for (int i = mid - 1; i >= left; i--) {
        sum += a[i];
        if (sum > clmax)
            clmax = sum;
    }
    sum = a[mid + 1];
    int crmax = a[mid + 1];
    for (int i = mid + 2; i <= right; i++) {
        sum += a[i];
        if (sum > crmax)
            crmax = sum;
    }
    int cmax = clmax + crmax;
    int maxsum = max (cmax, max (lmax, rmax));
    if (maxsum < 0)
        maxsum = 0;
    return maxsum;
}
int main () {
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> a[i];
    cout << maxSum (0, n - 1);
    return 0;
}

2. 分析该算法的时间复杂度

分解子问题:O(1)

求解子问题:2T(n/2)

合并子问题:O(n)

故时间复杂度为T(n)=2T(n/2)+O(n)=nlogn

3. 对分治法的体会和思考

分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

其中的划分再击破,和递归的分解再解决异曲同工,其实同样用到了递归的思想,只不过分治法先分再治,最后还得合并。

算法设计与分析第二章作业,算法,数据结构文章来源地址https://www.toymoban.com/news/detail-743800.html

到了这里,关于算法设计与分析第二章作业的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【头歌-Python】Python第二章作业(初级)

    任务描述 输入的三角形的三条边a、b、c 的长度,计算并依次输出三角形的周长和面积,结果严格保留2位小数。测试用例的数据保证三角形三边数据可以构成三角形。 三角形面积计算公式: ,其中s=(a+b+c)/2。 输入格式 分三行输入 3 个浮点数,表示三角形的三个边长 输出格式

    2024年03月24日
    浏览(93)
  • 微信小程序开发实战课后习题解答————第二章(作业版)

    一、填空题 1.微信小程序通过   bindtap/catchtap    方式实现单击事件。 2.微信小程序的flex布局中, flex-direction: row   属性来实现子元素的横向排列 3.微信小程序中按钮通过    button   组件来实现 4.微信小程序通过  display: flex 来实现felx布局 5.微信小程序中执行页面数据加载完

    2024年02月15日
    浏览(40)
  • 头歌实践教学平台Python-Python第二章作业(初级)

    第1关:三角形周长及面积 任务描述 输入的三角形的三条边a、b、c 的长度,计算并依次输出三角形的周长和面积,结果严格保留2位小数。测试用例的数据保证三角形三边数据可以构成三角形。 三角形面积计算公式: ,其中s=(a+b+c)/2。  第2关:三角函数计算 根据下面公式 计

    2024年02月08日
    浏览(155)
  • 【数据结构】第二章——线性表(4)

    大家好,很高兴又和大家见面啦!!! 在前面的内容中我们介绍了线性表的第一种存储方式——顺序存储,相信大家经过前面的学习应该已经掌握了对顺序表的一些基本操作了。今天,我们将开始介绍线性表的第二种存储方式——链式存储。 线性表中的数据元素在存储时,

    2024年02月04日
    浏览(49)
  • 【数据结构】第二章——线性表(3)

    大家好,很高兴又和大家见面了!!! 在上一篇中,咱们介绍了顺序表的基本概念,以及通过C语言实现顺序表的创建和对表长的修改。今天咱们将详细介绍一下使用C语言实现顺序表的增删改查。接下来,跟我一起来看看今天的内容吧!!! 我们先来回顾一下上一篇的内容,

    2024年02月04日
    浏览(54)
  • 【数据结构】第二章——线性表(2)

    大家好,很高兴又和各位见面啦!!!在上一个篇章中,我们简单了解了一下线性表的基础知识以及一下重要的术语。在今天的篇章中我们将来开始正式介绍线性表的顺序存储——又称顺序表。我们将会在本章介绍什么是顺序表,对于顺序表的操作我们又应该如何实现。接下

    2024年02月03日
    浏览(50)
  • 【数据结构】第二章——线性表(1)

    大家好,很高兴又和大家见面啦!!!从今天开始,我们将进入线性表的学习。 线性表是算法题命题的重点。这类算法题实现起来比较容易且代码量较少,但是要求具有最优的性能(时间复杂度、空间复杂度),因此,我们应该牢固掌握线性表的各种基本操作(基于两种存储

    2024年02月03日
    浏览(50)
  • 【数据结构】第二章课后练习题——线性结构

    1、线性表是 一个有限序列,可以为空 2、链表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用 单循环链表 存储方式最节省运算时间 3、若某线性表中最常用的操作实在最后一个元素之后插入一个元素和删除第一个元素,则采用 仅有尾结点的

    2024年02月07日
    浏览(59)
  • 数据结构英文习题解析-第二章 链表List

    前言:最近快到FDS考试了,po重刷了一下学校的题目,自己整理了一些解析orz 因为po在自己找解析和学习的过程中非常痛苦,所以在此共享一下我的题目和自己写的解题思路,欢迎各位指出错误~全章节预计会陆续更新,可在专栏查看~ HW2 1. For a sequentially stored linear list of leng

    2024年04月11日
    浏览(53)
  • 第二章-算法

    算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 算法有五个基本特征:输入、输出、有穷性、确定性和可行性。 输入:算法具有零个或者多个输入。 输出:算法至少有一个或多个输出。 有穷性:算法在执行了有

    2024年02月14日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包