Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离

目录

一、求旋转数组最小值

1、分析问题

2、解决思路

二、求零子数组

1、算法思路

2、要说明的两个问题

三、最长公共子串和最长公共子序列

1、最长公共子串(必须连续)—python实现

2、最长公共子序列(可不连续)—python实现

2、LCS的意义

3、求解

4、LCS的应用—最长递增子序列LIS

5、LIS的动态规化算法

四、LCS与字符串编辑距离


一、求旋转数组最小值

假定一个排序数组以某个未知元素为支点做了旋转,如:原数组0 1 2 4 5 6 7旋转后得到4 5 6 7 0 1 2。请找出旋转后数组的最小值。假定数组中没有重复数字。

1、分析问题

旋转之后的数组实际上可以划分成两个有序的子数组:前面子数组的大小,都大于后面子数组中的元素;4 5 6 7 0 1 2 注意到,实际上最小的元素就是两个子数组的分界线。

2、解决思路

用两个指针low、high分别指向数组的第一个元素和最后一个元素。如果是正常的排序数组(元素间不重复),第一个元素肯定小于最后一个元素。
       计算中间位置mid = (low+high)/2。
(1)、先考察A[mid]、A[low]关系
       若:A[mid]>A[low],则A[low,low+1….mid-1,mid]是递增序列,最小元素位于子数组A[mid+1,mid+2,…high]中。因此,做赋值low=mid+1。
       若:A[mid]<A[low] ,则A[low,low+1….mid-1,mid]不是递增序列,即:中间元素该子数组中,做赋值high=mid。
(2)、再考察A[mid]、A[high]关系
       对偶地,若考察A[mid]与A[high]的关系,能够得到相似的结论。

二、求零子数组

求对于长度为N的数组A,求子数组的和接近0的子数组,要求时间复杂度O(NlogN)。

1、算法思路

申请同样长度的空间sum[0…N-1],sum[i]是A的前i项和。
Trick:定义sum[-1] = 0
显然有:
算法:对sum[0…N-1]排序,然后计算sum相邻元素的差,最小值记为min1。
       min1:在A中任意取两个集合,各自元素的和求差的最小值
       因为sum[-1]=0,sum[0…N-1]的绝对值最小值记为min2。
       min2:A的前k个元素的和的绝对值的最小值
       min1和min2的更小者,即为所求。

2、要说明的两个问题

sum本身的计算和相邻元素差的计算,都是O(N),sum的排序是O(NlogN),因此,总时
间复杂度:O(NlogN)
强调:除了计算sum相邻元素的差的最小值,别忘了sum自身的最小值。一个对应A[i…j],一个对应A[0…j]

三、最长公共子串和最长公共子序列

1、最长公共子串(必须连续)—python实现

Longest Common Substring最长公共子串。

def LCS_find_Substring(s1, s2): #求两个字符串最长公共子串'''用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1的序列,其对应的位置就是最长匹配子串的位置。'''matrix_2D=[  [0 for i in range(len(s2)+1)] for j in range(len(s1)+1)]    #定义全0矩阵,为方便后续计算,比字符串长度多了一列
#     print('生成(i+1)行、(j+1)列全0矩阵:',matrix_2D)length_max=0      #最长匹配的长度p_end=0           #最长匹配对应在s1中的最后一位for i in range(len(s1)):for j in range(len(s2)):if s1[i]==s2[j]:                   #第一个if判断,两字符串内元素对应相等时,矩阵内,再次相等元素处的索引累计+1matrix_2D[i+1][j+1]=matrix_2D[i][j]+1if matrix_2D[i+1][j+1]>length_max: #第二个if判断,将当前相等元素的个数,赋值给length_maxlength_max=matrix_2D[i+1][j+1]p_end=i+1                              #记录s1中连续相等情况下,最后的索引位置print(matrix_2D)print(p_end,length_max)return s1[p_end-length_max:p_end],length_max  #返回最长子串及其长度s1=str(input())
s2=str(input())
res=LCS_find_Substring(s1, s2)
print(res)

2、最长公共子序列(可不连续)—python实现

Longest Common Subsequence,LCS 一个序列S任意删除若干个字符得到新序列T,则T叫做S的子序列;两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y的最长公共子序列。
      比如:字符串"helloworld"和"loop"的最长公共子序列为loo;字符串acdfg与adfc的最长公共子序列为adf
注意:区别最长公共子串,最长公共字串要求连续,而序列可以不连续。

def LCSubsequence(string1,string2):len1 = len(string1)len2 = len(string2)res = [[0 for i in range(len1+1)] for j in range(len2+1)]for i in range(1,len2+1):for j in range(1,len1+1):if string2[i-1] == string1[j-1]:res[i][j] = res[i-1][j-1]+1else:res[i][j] = max(res[i-1][j],res[i][j-1])return res,res[-1][-1]
print(LCS("helloworld","loop"))

2、LCS的意义

(1)、求两个序列中最长的公共子序列算法,广泛的应用在图形相似处理、媒体流的相似比较、计算生物学方面。生物学家常常利用该算法进行基因序列比对,由此推测序列的结构、功能和演化过程。
(2)、LCS可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。另一方面,对一段文字进行修改之后,计算改动前后文字的最长公共子序列,将除此子序列外的部分提取出来,这种方法判断修改的部分,往往十分准确。简而言之,百度知道、百度百科都用得上。

3、求解

(1)、计算LCS长度

(2)、根据b提供的方向,构造最长公共子序列

(3)、最大公共子序列的多解性:求所有的LCS

4、LCS的应用—最长递增子序列LIS

T1、使用LCS解LIS问题
T2、使用动态规划来求解

5、LIS的动态规化算法

四、LCS与字符串编辑距离

1、字符串“ALGORITHM”是如何变成字符串“ALTRUISTIC”的?

参考文献
余祥宣等,计算机算法基础[M],华中科技大学出版社,2001
刘佳梅.求最长公共子序列问题的一种快速算法.中国科技论文在线[J].2010,11
李欣,舒风迪.最长公共子序列问题的改进快速算法.计算机应用研究[J].2000
郑翠玲.最长公共子序列算法的分析与实现.武夷学院学报[J],2010,29 卷(2):44~48
https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/02.04.md(最大子数组)
https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/05.02.md(字符串编辑距离)

Algorithm:C++/python语言实现之求旋转数组最小值、求零子数组、求最长公共子序列和最长公共子串、求LCS与字符串编辑距离相关推荐

  1. 用Python计算最长公共子序列和最长公共子串

    如何用Python计算最长公共子序列和最长公共子串 1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公 ...

  2. 最长公共子序列暴力法C语言,利用C++实现最长公共子序列与最长公共子串

    一.问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与母 ...

  3. java实现最长连续子序列_最长公共子序列/最长公共子串 Python/Java实现

    关注我的微信公众号:后端技术漫谈 不定期推送关于后端开发.爬虫.算法题.数据结构方面的原创技术文章,以及生活中的逸闻趣事. 我目前是一名后端开发工程师.主要关注后端开发,数据安全,网络爬虫,物联网,边 ...

  4. 动态规划:求最长公共子序列和最长公共子串

    最长公共子序列(LCS): 这同样是一道经典题目,定义就不说了. 为了方便说明,我们用Xi代表{x1,x2,‥xi},用Yj代表{y1,y2,‥yj}.那么,求长度分别为m,n的两个序列X,Y的LCS ...

  5. c语言最长递增子序列nlogn,最长递增子序列

    问题定义: 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱).例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6, ...

  6. 两个字符串的最长公共子序列长度_求2个字符串的最长公共子序列和最长公共子字符串...

    一. 最长公共子序列 定义: 一个数列S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列. 例如:输入两个字符串BDCABA和 ABCBDA ...

  7. c语言求n个数中最大值和最小值,C语言:从键盘输入n个数,求最大值和最小值(用数组)...

    满意答案 zxyev 2020.07.01 采纳率:51%    等级:7 已帮助:608人 #include #include #define ARR_LEN 255 /*数组长度上限*/ #def ...

  8. 求最长公共子序列python_用Python计算最长公共子序列和最长公共子串

    1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公共子序列(Longest-Common-Subseq ...

  9. python实现编辑距离,最长公共子序列,最长公共子串

    python实现编辑距离 python实现最大公共子序列 python实现最长公共子串

最新文章

  1. Intellij IDEA 将工程转换成maven工程 详解
  2. winform打开cad图纸_CAD打开图纸的方法汇总
  3. WINDOWS XP常用的快捷键组合?
  4. 数学建模第六节2020.5.15-17补
  5. Linux内核分析 - 网络
  6. halcon通过点拟合圆形,鼠标选点
  7. 【英语学习】【WOTD】cap-a-pie 释义/词源/示例
  8. python requests 下载教程_《python下载requests库教程》 如何在python中安装requests
  9. 消息中间件MQ与RabbitMQ
  10. 计算机设计贺卡教案,《运用Word制作电子贺卡》教学设计
  11. win10如何共享打印机_局域网内,办公室USB接口打印机如何共享
  12. 统计笔记3:statistical inference
  13. win10浏览器加载很慢_解决Win10 Edge浏览器打开网页慢的问题
  14. 打开cmd命令提示不能输入命令
  15. [案例4-4]学生和老师
  16. 如何看到laravel的版本号
  17. shor 量子算法,合数分解
  18. 区域经济发展的扬州创新:融合工业化与信息化
  19. python3豆瓣电影排行榜爬取
  20. 泛微协同OA 园区管理新动力

热门文章

  1. protobuf中 repeated[Ptr]Field的序列化
  2. Mybatis中的jdbcType的作用
  3. C#请求Post接口
  4. 检查本地服务器是否配置成功
  5. Service Mesh 和 API Gateway 关系深度探讨
  6. 瞬间几千次的重复提交,我用 Spring Boot + Redis 扛住了!
  7. 计算机网络基础知识,仅此一篇足矣
  8. 为什么RESTful很糟糕?
  9. 10张Gif动图让你弄懂递归等概念
  10. 一篇文章带你详解 TCP/IP 协议(上)