当前位置: 首页 > news >正文

1.2 多维数组(markdown版本)

多维数组这种数据结构,运用特别频繁。二维数组用于线性代数,三维数组用于Floyd-Warshall算法。当然还有别的用途。
这里按照套路,以一个需求开始。我选择了面试经常问的,经典的LCS问题,LCS是Longest Common Subsequence的缩写,也就是求最长共同子字符串的长度。
举个例子,两个字符串分别为:
ABCBDAB
BDCABC
最长的子字符串是BCAB(例子中加粗的部分)或BDAB。
对于这个问题,我们需要认真分析需求,需求是求子字符串,可以是不连续的,比如上例中的BCAB,在第一个字符串中就夹杂了BD两个字符。依旧使用高中数学的分类归纳法:

  1. 第一种场景,两个字符串尾部字母相同:
    如ABCBDABBDCAB
    那么LCS就是ABCBDABDCA的LCS加上字母B
  2. 第二种场景,两个字符串尾部字母不同:
    但是这种场景又分两种子场景:
  • 如ABCBDABBDCABC,这个场景那么LCS可能等于ABCBDABBDCAB的LCS(结果为BCAB);
  • 也可能等于ABCBDABDCABC的LCS(结果为ABC)。

两种我们肯定取更长的,所以取BCAB。定义两个字符串为X和Y。这种场景的LCS,需要计算X去掉尾部,Y不变的LCS和X不变,Y去掉尾部的LCS,然后取两个LCS之中的最长者。
所以可以定义一个二元函数d(x,y),x代表字符串X的索引,y代表字符串Y的索引。d(x,y)就是X从索引0到索引x的子串和Y从索引0到索引y的子串的LCS。
所以这个和二叉树数量的问题一样,也是递归问题。那么最合适的数据结构是什么?肯定是二维数组啊。二维数组有两个索引,一个索引表示X的子字符串长度,一个索引用来表示Y的子字符串长度。数组内存储两个子字符串的LCS。X去掉尾部就是行索引-1,Y去掉尾部就是列索引-1。
用公式描述就是:
d(x,y)={d(x−1,y−1)+1X[x]=Y[y]max(d(x−1,y),d(x,y−1))X[x]!=Y[y] d(x,y)=\begin{cases} d(x-1,y-1)+1 & X[x]=Y[y]\\ max(d(x-1,y),d(x,y-1)) & X[x]!=Y[y]\\ \end{cases}d(x,y)={d(x1,y1)+1max(d(x1,y),d(x,y1))X[x]=Y[y]X[x]!=Y[y]
上述字符串ABCBDABBDCABC产生的LCS长度二维数组是这样的:


代码实现


理清楚了需求,代码就比较容易写了,以下是python代码:

deflcs_len(x,y):len_x=len(x)len_y=len(y)array=[[0for_inrange(len_y+1)]for_inrange(len_x+1)]foriinrange(1,len_x+1):forjinrange(1,len_y+1):ifx[i-1]==y[j-1]:array[i][j]=array[i-1][j-1]+1else:a=array[i-1][j]b=array[i][j-1]array[i][j]=aifa>belsebforeinarray:print(e)returnarray[len_x][len_y]

因为python并没有真正的数组,所以这里补上java代码:

publicstaticintlcsLength(Stringx,Stringy){intlenX=x.length();intlenY=y.length();int[][]array=newint[lenX+1][lenY+1];for(inti=0;i<=lenX;i++){array[i][0]=0;}for(inti=0;i<=lenY;i++){array[0][i]=0;}for(inti=1;i<=lenX;i++){for(intj=1;j<=lenY;j++){if(x.charAt(i-1)==y.charAt(j-1)){array[i][j]=array[i-1][j-1]+1;}else{inta=array[i-1][j];intb=array[i][j-1];array[i][j]=a>b?a:b;}}}returnarray[lenX][lenY];}
http://www.jsqmd.com/news/167727/

相关文章:

  • 【Linux C++】采用回调链设计实现 signal 的全局处理实现 多个中断信号回调
  • 计算机Java毕设实战-基于SpringBoot+Vue的二手数码产品交易平台的开发与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Spring Cloud Gateway
  • 挠弹记录
  • UDP-酮半乳糖二钠盐——赋能前沿糖基化研究的核心工具分子
  • 特斯拉为何死磕纯视觉?成本、数据与安全冗余的自动驾驶路线之争
  • 把织物上的“轻微脏污”抓出来:客户下单50台
  • UDP-2-F-D-葡萄糖胺二钠盐—糖生物学研究与药物开发的关键工具分子
  • 论文AI率超标自救:五佳降AI工具合集
  • 【毕业设计】基于SpringBoot社区住户信息管理系统(源码+文档+远程调试,全bao定制等)
  • 摸鱼没翻车,全靠这套 Chrome 快捷键组合
  • DaBai Max Pro 与 DaBai DCW2-DW2 深度相机坐标系解析
  • Java毕设项目:基于SpringBoot+Vue的二手数码产品交易平台的开发与实现(源码+文档,讲解、调试运行,定制等)
  • 102301338郭砚康的软件工程课程总结 - Nicholas
  • Java计算机毕设之基于SpringBoot+Vue的二手数码产品交易平台的开发与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 通信原理篇---误码率
  • 高达一亿港币人工智能创投基金,亚洲人工智能初创大赛上海站招募丨社区伙伴活动推荐
  • 论文被判AI生成?五佳降AI工具避坑分享
  • 【课程设计/毕业设计】基于SpringBoot+Vue的二手电子产品交易平台二手数码产品交易平台的开发与实现【附源码、数据库、万字文档】
  • 重复率过了AI率却超?这五佳降AI工具能用
  • 通信原理篇---可靠性和有效性
  • Amaze File Manager:一款基于 Material Design 的开源安卓文件管理器
  • LLM解析脑电波,中风康复预测提前1月
  • 综合实践
  • 2025专科生必看!9大AI论文平台测评,写毕业论文还能这么快?
  • AI率怎么都降不下去?前五降AI工具真实体验
  • 靠谱的康有利到家理疗小程序公司
  • 【记录】2025 年终总结
  • Java毕设选题推荐:基于SpringBoot+Vue的具有推荐功能的二手交易基于SpringBoot+Vue的二手数码产品交易平台的开发与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于SpringBoot社区住户信息管理系统基于web的社区居民信息管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】