需要在快速检查相同性时比较两个字符串数组

时间:2017-07-14 10:55:07

标签: swift algorithm

我正在尝试编写一种能够评估某人预测准确性的算法。该程序的工作原理如下 - 用户从40个名称列表中进行10次选择。然后将他们的选择与来自该40的10个名字的列表进行比较,并且对他们的选择的精确程度进行评分。我怎么能这样做? Levenshtein距离似乎不起作用,因为它没有考虑列表的顺序,只是列表本身中存在字符。有任何想法吗?如果你想要详细说明你的方法,但没有必要的代码,但如果你确实提供了代码,我会在swift中编写这个算法,所以请随意坚持下去。谢谢!

更新:

嘿大家都非常感谢你们的呐喊!发布算法的每个人都有一个很好的解决方案,谢谢。为了给出一些更多的背景 - 40的数组列出了40个在竞争中竞争的名字。每个用户按照他们认为这40名运动员将在排行榜上完成的顺序从列表中选择10个名称,因此他们的实际位置指数非常重要,因为有人以预测结果的相反顺序预测所有10个名称不应该与有人以完美的顺序预测所有10个人。

我想出的算法首先检查每个数组中是否存在匹配名称,如果他们只是预测某人最终会进入前10名,则会将用户得分增加1。然后,如果该用户预测了正确的索引,那么数组中的名称得到另一个点,所以我嵌套了索引的比较。此外,如果用户正确地预测获胜者,第二名或第三名,他们将被分配一个额外的点来处理边缘情况,其中8,9和10正确的人具有与完美登上领奖台的人相同的分数。 / p>

让我知道你对这个人的看法!我错过了任何边缘案例吗?

3 个答案:

答案 0 :(得分:0)

使用Setintersection查看有多少匹配:

var userSelections = ["b", "c", "d", "e", "f", "g", "h", "i", "j", "z"]
var correctResults = ["b", "a", "d", "c", "e", "f", "h", "g", "i", "j"]

let matches = Set(correctResults).intersection(userSelections).count

print("you got \(matches) of \(correctResults.count) right")

var placeMatches = 0
for i in correctResults.indices {
    if userSelections[i] == correctResults[i] {
        placeMatches += 1
    }
}

print("you placed \(placeMatches) correctly")

// Give 3 points for picking winner, 2 for place, and 1 for show
var bonus = 0

for i in 0 ..< 3 {
    if userSelections[i] == correctResults[i] {
        bonus += (3 - i)
    }
}

print("you earned \(bonus) bonus points")

print("total score = \(matches + placeMatches + bonus)")
  你得到10分中的9分你正确地输了3分你获得了4分   奖励积分总分= 16

答案 1 :(得分:-1)

这是我的建议: 让我们调用正确答案数组A和用户数组B

  1. 转到阵列A
  2. 在每个项目上搜索B阵列
  3. 如果没有找到分数将为零否则如果发现分数将是差距(B上的索引 - A上的索引)
  4. 复杂度为o(n ^ 2),但由于输入为10,因此不是问题

    另一个建议:修改排序算法以计算它正在执行的步数,排序数组A并保持分数,排序数组B并比较分数...... 从理论上讲,它将反映“距离”,但可能取决于您将使用哪种排序算法

答案 2 :(得分:-1)

设A是包含用户选择的数组,B是包含正确选择的数组。对于A的每个元素,检查此元素是否在B数组中。如果没有这样的元素,则添加0分。如果存在这样的元素,则添加 100 - D 2 点,其中D是两个元素之间的距离(例如,如果元素位于数组的第5个位置) A,在阵列B的第7位置,则距离为2)。总分是每个元素获得的分数之和。