news 2026/4/16 10:58:00

1.2 多维数组(markdown版本)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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];}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 3:39:10

为什么说Agentic AI的社会价值是提示工程架构师的「职业护城河」?

从「工具驯化者」到「Agent设计师」:为什么Agentic AI的社会价值是提示工程架构师的「职业护城河」? 引言:当AI从「听话的工具」变成「会思考的伙伴」 早上8点,北京中关村的咖啡店里,产品经理小夏正对着电脑发愁——她要为新上线的环保APP写一篇面向Z世代的推广文案。放…

作者头像 李华
网站建设 2026/4/10 11:44:51

学生党论文降AI率,前五工具够用了

又到毕业季&#xff0c;毕业论文除了查重外&#xff0c;真的别忘记查ai率。 今天就告诉大家高重复率以及高ai率应该如何快速降低&#xff01;实测全网产品&#xff0c;无广&#xff01;&#xff01; 如果这篇整理能帮你少走点弯路&#xff0c;那就值了。 1、嘎嘎降AI 官网&…

作者头像 李华
网站建设 2026/4/15 1:06:37

揭秘CopyOnWriteArraySet:读多写少的并发集合利器

文章目录什么是CopyOnWriteArraySet&#xff1f;核心原理深度剖析底层数据结构写时复制机制详解迭代器的弱一致性与其它容器的性能对比实际应用场景1. 配置信息管理2. 在线用户状态收集器3. 事件监听器管理实战案例&#xff1a;高并发在线用户监测局限性及注意事项总结参考文章…

作者头像 李华
网站建设 2026/4/10 18:14:11

Java毕设项目:基于SpringBoot的汽车配件仓储管理系统设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/12 14:39:27

官网-城乡居民医疗保险报销政策

官网:2023年宿迁市基本医疗保险待遇政策一览表-宿迁市人民政府 一、居民医保门诊报销政策 (一)普通门诊 就诊机构 起付线(元) 报销比例 待遇范围 单日处方限额 年度限额(元) 乡镇一级医院、村居卫生机构 0 55% 合规药费 乡镇一级医院100元;村居卫生机构30元 300 城区…

作者头像 李华