【问题标题】:Find best match for each word without double matching在没有双重匹配的情况下找到每个单词的最佳匹配
【发布时间】:2018-07-14 19:53:16
【问题描述】:

我有两个字符串数组,我想将第一个数组的每个字符串与第二个数组的每个字符串匹配并显示平均分数。

Kotlin 中的简单实现是:

fun main(args: Array<String>) {
    val jw = JaroWinklerDistance()
    val a = arrayOf("FRITZ", "FRUITS")
    val b = arrayOf("FRITZ", "MARTIN", "FOOBAR")

    var score = 0.0
    a.forEach { x ->
        var current = 0.0
        b.forEach { y ->
            current = max(current, jw.apply(x, y))
        }
        score += current
    }
    score /= a.size

    println("Average score $score")
}

打印出来:

Average score 0.9288888888888889

但这不是我需要的。 FRITZ 这个词已经在两个数组中完全匹配。所以它应该匹配剩余的FRUITSMARTINFOOBAR。所以平均分应该计算为:

FRITZ  - FRITZ  : 1
FRUITS - MARTIN : 0.5555555555555555
FRUITS - FOOBAR : 0.4444444444444444

FRITZ  = 1
FRUITS = max (0.5555555555555555, 0.4444444444444444)
       = 0.5555555555555555

Average score = (1 + 0.5555555555555555) / 2
              = 0.7777777777777778

此问题是否与任何现有问题相似?我只是在寻找算法,而不是代码。

我尝试了不同的方法,但没有运气。有人可以帮忙吗?

【问题讨论】:

    标签: arrays algorithm kotlin string-matching


    【解决方案1】:

    问题是找到一个最佳匹配。 这称为Assignment Problem

    【讨论】:

    • 如果我的要求是找到最佳总数而不是最佳分配,是否有更有效的算法呢?我可以使用福特富尔克森吗?匈牙利语对我来说太慢了。这个问题看起来很简单。
    • @GurV 我很确定找到最佳总数的最佳方法是找到最佳分配,然后将其相加。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2011-08-29
    相关资源
    最近更新 更多