ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

算法第三章上机实践报告

2021-10-24 16:31:40  阅读:170  来源: 互联网

标签:第三章 1.1 上机 复杂度 填表 问题 算法 序列


目录

1. 实践报告分析

1.1 问题描述

设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列

1.2 算法描述

输入一个序列,将其排序得到一个新的序列,并且是递增的,我们就可以将问题转化为求原序列和新序列的最长公共子序列
运用动态规划的思想,我们将子问题的结果继续在一个二维数组中,再根据这个二维数组中的值得到最长公共子序列

1.3 问题求解

原序列保存在数组b中,排序后的原序列保存在数组a
定义一个二维数组c[][]用于保存子问题的结果

1.1.1 根据最优子结构性质,列出递归方程式

首先给出一个问题表示c[i,j]a[1...i]b[1...j]的最长公共子序列,那么我们就可以明确原始问题为c[n,n]a[1...n]b[1...n]的最长公共子序列
我们要寻找的最长公共子序列就保存在c[n][n]
我们分析序列a和序列b的末尾字符,(这里假设末尾字符为第n位字符),可以分为两种情况:

  1. 末尾字符不相等
  2. 末尾字符相等

针对这两种情况,(细节分析在这里不过多阐述),我们可以得到递推公式:

c[i,j] = {
            max{c[i-1,j],c[i,j-1]} (ai != bj)
            c[i-1,j-1]+1 (ai = bj)
          }

1.1.2 给出填表法中表的维度、填表范围和填表顺序

表的维度:数组c为二维数组
填表范围:n行n列
填表顺序:自左向右,自底向上

1.1.3 分析该算法的时间和空间复杂度

时间复杂度:主要看双重循环填表的那部分,时间复杂度为O(n^2)
空间复杂度:需要填一个n行n列的表,空间复杂度为O(n^2)

1.3 心得体会

这次实践课让我能更熟练地运用动态规划解决问题。这道题在填表的时候卡在了一个细节位置,我按照了以前的习惯写二重循环的时候写了i<n,而不是i<=n,导致填的表少了一行一列,并且找了好久才找出来,这也让我对动态规划填表时的循环条件有了更深刻的印象

2. 对动态规划算法的理解和体会

动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,但是动态规划算法经分解得到的子问题往往不是互相独立的,使用动态规划算法的问题一般具有最优子结构性质和重叠子问题性质,我们就可以借助这个问题的最优子结构性质列出递归式从而求解
动态规划解题四步骤:1.问题结构分析 2.递推关系建立 3.自底向上计算 4.最优方案追踪

标签:第三章,1.1,上机,复杂度,填表,问题,算法,序列
来源: https://www.cnblogs.com/AIpoem/p/15451681.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有