实验报告

课程名称:《算法分析与设计》
实验日期: 2021年 5月 10日 至 2021 年 5 月 16 日
学生姓名: 甘世伟
所在班级: 计科195
学号: 2019212212053
实验名称: LCS算法和背包算法
实验地点: 勤园13-218
同组人员:
——————————————

  1. 问题
    给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence)。
    比如字符串1:BDCABA;字符串2:ABCBDAB则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA。

  2. 解析

LCS:问题



例子推导
(3)
X=<A,C,D,B,D,C,A,B>
Y= <B,D,A,B,C,B,C>
Z=<D,B,C,B>
X.B≠Y.C,Z.B≠Y.C;
=>
X=<A,C,D,B,D,C,A,B>
Y= <B,D,A,B,C,B>
Z=<D,B,C,B>是新X和Y的最长公共子序列
(1)
X=<A,C,D,B,D,C,A,B>
Y= <B,D,A,B,C,B>
Z=<D,B,C,B>
X.B=Y.B,Z.B=Y.B;
=>
X=<A,C,D,B,D,C,A>
Y= <B,D,A,B,C>
Z=<D,B,C>是新X和Y的最长公共子序列
(2)
X=<A,C,D,B,D,C,A>
Y= <B,D,A,B,C>
Z=<D,B,C>
X.A=Y.C,Z.C≠X.A;
=>
X=<A,C,D,B,D,C>
Y= <B,D,A,B,C>
Z=<D,B,C>是新X和Y的最长公共子序列

分析
首先要分清楚:
子串:表示连续的一串字符。
子序列:表示不连续的一串字符。
S1的最后一个元素与s2的最后一个元素相同,这说明该元素一定位于公共子序列中。因此,现在只需要找:
LCS(s1n-1,s2m-1);
如果s1n != s2m,那么产生了两个子问题:
LCS(s1n-1,s2m) 和 LCS(s1n,s2m-1)。
解出上面两个子问题,得到的公共子序列后,比较长短,长的就是 LCS(s1,s2)。
对子问题重复以上步骤,就可以得到答案。
这张图对应了三种情况。C[i,j]记录的是子序列长度。

背包问题:



  1. 设计

LCS:问题

void LCS(char* x, char* y, int m, int n, int a[][MAXLEN], int b[][MAXLEN]) {int i, j;for (i = 0; i <= m; i++) a[i][0] = 0;for (j = 1; j <= n; j++)    b[0][j] = 0;for (i = 1; i <= m; i++) {for (j = 1; j <= n; j++) {if (x[i - 1] == y[j - 1]) {a[i][j] = a[i - 1][j - 1] + 1;b[i][j] = 1;}else if (a[i - 1][j] >= a[i][j - 1]) {a[i][j] = a[i - 1][j];b[i][j] = 3;}else {a[i][j] = a[i][j - 1];b[i][j] = 2;}}}
}void PrintLCS(int b[][MAXLEN], char* x, int i, int j) {if (i == 0 || j == 0)   return;if (b[i][j] == 1) {PrintLCS(b, x, i - 1, j - 1);printf("%c", x[i - 1]);}else if (b[i][j] == 3)PrintLCS(b, x, i - 1, j);elsePrintLCS(b, x, i, j - 1);
}

背包问题:

void Knapsack(int v[], int w[], int c, int n, int m[][10])
{int jMax = min(w[n] - 1, c);for (int j = 0; j <= jMax; j++){m[n][j] = 0;}for (int j = w[n]; j <= c; j++){m[n][j] = v[n];}for (int i = n - 1; i > 1; i--){jMax = min(w[i] - 1, c);for (int j = 0; j <= jMax; j++){m[i][j] = m[i + 1][j];}for (int j = w[i]; j <= c; j++) {m[i][j] = max(m[i + 1][j], m[i + 1][j - w[i]] + v[i]);}}m[1][c] = m[2][c];if (c >= w[1]){m[1][c] = max(m[1][c], m[2][c - w[1]] + v[1]);}
}
void Traceback(int m[][10], int w[], int c, int n, int x[])
{for (int i = 1; i < n; i++){if (m[i][c] == m[i + 1][c]){x[i] = 0;}else{x[i] = 1;c -= w[i];}}x[n] = (m[n][c]) ? 1 : 0;
}
  1. 分析
    在动态规划的方法下,只需要线性的时间:O(mn)的时间复杂度。因为只需要比较mn次,选出最优解。
    背包问题的时间复杂度为O(n^2)

  2. 源码

https://github.com/fxgn123/AlgorithmDesign/blob/fxgn123-patch-lab9/main.cpp
https://github.com/fxgn123/AlgorithmDesign/blob/fxgn123-patch-lab9-1/main.cpp

实验报告(LCS算法和背包算法)相关推荐

  1. 算法作业9 LCS算法和背包算法

    LCS算法和背包算法 1. 问题 描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)] LCS算法和背包算法,特别要求举例时采用不同于讲义的数据进行推导. 最长公共子序列问题( ...

  2. 银行家算法实验报告c语言版,银行家算法实验报告C语言版.doc

    <操作系统>课程综合性实验报告 姓名: 学号: 2016 年 11 月 20 日 实验题目进程调度算法程序设计一.实验目的 通过对安全性算法和银行家算法的模拟,进一步理解资源分配的基本概念 ...

  3. c语言des算法实验报告,C语言实现DES算法实验报告解析.doc

    C语言实现DES算法实验报告解析 xx工程大学 实验报告 (2015-2016学年第一学期) 报告题目: DES加密算法 课程名称: 密码学B 任课教员: 专 业: 学 号: 姓 名: 二O一六年一月 ...

  4. c语言des算法实验报告,c语言实现des算法des加密算法实验报告

    c语言实现des算法des加密算法实验报告 (23页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 xx 工程大学工程大学实验报告实验报告 ...

  5. 实验报告:用协同过滤算法对电影评分,并使用RMSE算出预测误差

    实验报告 一.实验目的 1.学习利用hadoop处理大数据. 2. 通过实验加强mapreduce编程能力. 3. 在掌握协同过滤算法基础上通过mapreduce实现. 二.实验内容 1.使用给定的数 ...

  6. 操作系统实验报告(二)银行家算法

    一. 实验目的 1.了解什么是操作系统安全状态和不安全状态: 2.了解如何避免系统死锁: 3.理解银行家算法是一种最有代表性的避免死锁的算法,掌握其实现原理及实现过程. 二. 实验环境 Windows ...

  7. 背包算法轻松搞定——01背包算法、部分背包算法

    这篇文章过程讲得很详细,一文搞懂(点击看原文) 不懂之前觉得很难理解,觉得很复杂,其实没有必要.因为只要懂动态规划就可以很轻松搞定0-1背包算法(部分背包算法更简单,排序即可).之前看了很多篇文章都觉 ...

  8. 密码学之公钥密码体系(1):背包算法

    密码学之公钥密码体系(1):背包算法 文章目录 1.背包算法 2.超递增背包 3.私人秘钥产生公开秘钥 4.加密过程 5.解密过程 6.实际的实现方案 7.背包的安全性 众所周知,公钥密码,又称非对称 ...

  9. 操作系统-进程调度实验报告

    1.实现四种不同及进程调度算法: 先来先服务.时间片轮转调.优先级调度以及短作业优先调度算法. 2.通过实验理解有关进程控制块,进程队列等的概念. 1.运行素材中的代码,观察其执行结果是否正确?各个调 ...

  10. C++——《算法分析与设计》实验报告——贪心算法与回溯法

    实验名称: 贪心算法与回溯法 实验地点: 实验目的: 1.理解贪心算法与回溯法的概念: 2.掌握贪心算法与回溯法的基本要素: 3.掌握贪心算法与回溯法的解题步骤与算法柜架: 4.通过应用范例学习贪心算 ...

最新文章

  1. U^2-Net跨界肖像画,完美复刻人物细节,GitHub标星2.5K+
  2. 12月中国域名服务商Top20市场份额解析(图)
  3. 码农回忆刚毕业工作的那年
  4. Linux 大文件拷贝失败,linux – Rsync失败,“文件太大”
  5. ActiveMQ消息队列用法
  6. 孙鑫VC学习笔记:第十二讲 (三) 用C++函数读写文件
  7. Docker 之 概念介绍
  8. Mapreduce执行过程分析(基于Hadoop2.4)——(三)
  9. BZOJ1050 旅行comf
  10. 理财项目中宏涌晟五个投资理财基础知识
  11. RN 实现阴影,解决Android阴影问题 react-native-shadow
  12. 队列BlockingQueue
  13. 微信“公众平台测试账号”接口接入指南
  14. Web课程设计之学生成绩管理系统
  15. Vuforia提高识别以及稳定性方法总结
  16. android学习笔记----ListView和各种适配器简介
  17. 聚合支付备案机构为479家,首次出现注销聚合支付备案
  18. Workstation安装中标麒麟操作系统V7
  19. Java的Closeable接口close()方法的意义
  20. (自学分析)操作系统基础

热门文章

  1. 【MM32F5270开发板试用】+RFID门禁
  2. sony电视投屏android,Wow,将苹果Macbook投屏到索尼BRAVIA原来是这样玩…教程分享
  3. c++病毒代码(附源码)
  4. 免费的生成GIF和截屏的PC端小工具
  5. IDEA离线安装插件
  6. 语言缩写c-a,各国语言缩写及语言代码查询
  7. Java技术栈(总图)
  8. thinkpad x250装黑苹果教程_GitHub - siweijianrong/Hackintosh: Hackintosh黑苹果长期维护机型EFI及安装教程整理...
  9. MySQL登录命令详解
  10. 嵌入式程序和FW的区别