Java 两有序列表内的差异节点的个数

2019-12-31 14:23:15 +08:00
 matepi
已知列表有序、内部节点可重复

AA
AA
差异=0

AA
AB
差异=1

AAA
ACA
差异=1

AA
ACA
差异=1 (一个缺少,但后续的要继续同步比较)

AABBCC
ABDCE
差异=3

这样的定义、尤其是在节点可重复时是否会有结果不确定性?
该用什么样的算法?
在 Java 里面已实现的轮子有吗?
2442 次点击
所在节点    Java
16 条回复
chendy
2019-12-31 14:32:28 +08:00
最…最小编辑距离?
commons-text 里可能有现成的吧
xxdd
2019-12-31 14:46:47 +08:00
先 sort
然后 LCS
matepi
2019-12-31 14:47:22 +08:00
@chendy 恩,应该类似的了。不过问题可能表达的不太好,这里的 A,不是简单的文字 A,而是一个具体对象、或者说具体这个对象的 hash
matepi
2019-12-31 14:47:49 +08:00
@xxdd sort 会损失有序性
xxdd
2019-12-31 15:01:04 +08:00
那就 LCS 就好了 长度减一下
ffbh
2019-12-31 17:28:08 +08:00
差异节点个数是怎么定义的?
比如
ABC
ACB
差异=?
matepi
2019-12-31 17:29:07 +08:00
@ffbh 差异=2,因为有序
ffbh
2019-12-31 17:36:03 +08:00
我还是不明白这个差异个数是怎么计算的,能给出详细的定义么
比如这个
AABBCC
ABDCE
差异=3
为啥是 3
ffbh
2019-12-31 17:40:24 +08:00
综合这么多测试例子,我唯一得出的结论
差异个数=min(删除两个字符串字母的个数使得两个字符串长度相等 + 删除后两个字符串不相同位的数量)
Sunyanzi
2019-12-31 17:41:05 +08:00
@ffbh 关键字 Levenshtein distance ... 我觉得这么常见的算法肯定有现成的轮子 ...
ffbh
2019-12-31 17:44:05 +08:00
@Sunyanzi
是有点像这个,但是楼主也没给出具体的定义呀
matepi
2019-12-31 17:49:39 +08:00
@Sunyanzi
@ffbh
是的,就是 editing distance 或者说 Levenshtein distance,commons-text 有轮子
但问题是是针对文字 character 的,没有对于对象或者 word 适用的轮子
ffbh
2019-12-31 17:51:20 +08:00
@matepi
你把==改成 equals 不可以么
matepi
2019-12-31 17:55:00 +08:00
@ffbh 也可以考虑,但比造轮子更难过的事情,就是改别人的轮子啊
先凑活着放了个不考虑有序性的上去跑着了
BiteTheDust
2020-01-01 12:07:15 +08:00
看你这描述就是求一个最长公共子列 作为两列表的相同部分?
srlp
2020-01-01 13:48:40 +08:00
既然明确明确是 edit distance 了,那么网上搜搜针对 String 的源代码,改为 List<Object> 就可以了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/633904

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX