【问题标题】:Algorithm to compare two arrays of element and find most similar pairs efficiently比较两个元素数组并有效找到最相似对的算法
【发布时间】:2020-08-19 04:18:45
【问题描述】:

我有两个长度分别为mn的字符串数组,其中的字符串长度均为x,我想找到包含最多常见字母的最佳匹配对:

在一个简单的情况下,只需考虑这两个字符串

Sm = [AAAA, BBBB]
Sn = [ABBA, AAAA, AAAA, CCCC]

预期结果(匹配 2 对,单独留下 2 个字符串):

第 1 对:AAAA -> AAAA 因为得分 4

第 2 对:BBBB -> ABBA 因为分数 2

Sn 中单独存在的字符串:

  1. AAAA 因为Sm 中的相同字符串已经匹配
  2. CCCC 因为无法匹配任何

分数矩阵:

我目前的方法(慢):

  1. 获取字符串长度x,这是最大分数(所有字母相同的情况)-在这种情况下为4
  2. 蛮力比较mxn次生成上面的分数矩阵-在这种情况下是2*4
  3. x循环到1:(在这种情况下,它从4循环到1
    • 遍历分数矩阵并弹出分数为x的字符串对
  4. 将剩余的未配对字符串或带有0 分数的字符串标记为单独

问题:

在生成分数矩阵时,我当前的方法使用 O(mn) 很慢(x 不会很大,所以我在这里假设为 const)。 有没有比 O(mn) 复杂度表现更好的算法?

【问题讨论】:

  • 我可以知道为什么要投反对票吗?
  • 更新了标题。它实际上更多的是与数组比较而不是字符串比较相关。
  • 字符串 255 中使用了多少个不同的符号/字母? 26? 3?字符串的最大长度? x 有多大?
  • @chux-ReinstateMonica 实际上,我试图比较 2 个 csv 文件,但在这种情况下,我只是将情况简化为单个字母。假设字母只有字母数字,x 最大为 100,那么策略是什么?谢谢

标签: algorithm string-comparison


【解决方案1】:

抱歉,我还没有足够的代表来简单地提供评论,但在我很久以前写的一个项目中,我利用了Levenshtien Distance 算法。具体请参阅this 项目以获得一些有用的见解。

【讨论】:

  • 如果我错了请纠正我@Mk Yung,但是这个问题基本上可以归结为比较两个数组的元素,而不是使用的具体比较算法。因此,虽然 Levenshtien 的距离算法对于计算实际距离非常有用,但它不会使总比较算法的复杂度低于 )(mn)
  • 我同意这个答案并不能解决 O(mn) 复杂度,但是不同的匹配算法可能仍然有帮助。不幸的是,我们没有提供上限。 @MK Yung,n、m 和 x 到底有多大?
  • @joshmeranda 正确 - 也许我给出了一个误导性的标题。让我更新一下。
  • @DavidCross m 和 n 可以达到 100k 而 x 小于 100
【解决方案2】:

据我所知,您正在做最有效的事情。为了彻底彻底,您需要将 Sn 中的每个字符串与 Sn 中的每个字符串进行比较,因此算法充其量是 O(mn)。任何更少的东西都不会将每个元素与每个元素进行比较。

一种优化可能是删除所有重复项,但这在很大程度上会导致性能下降,在几乎所有情况下都可能弊大于利。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多