【问题标题】:How do I compare multiple arrays and identify the closest match?如何比较多个数组并确定最接近的匹配项?
【发布时间】:2015-02-11 13:24:36
【问题描述】:

我有一个包含主数据的数组,例如:

[1, 3, 7, 11]

和一个数据库,其中包含一个包含各种数字的数组的表,例如:

1) [1, 5, 7, 11]
2) [2, 3, 4, 8, 10]
3) [1, 3, 7, 11, 15]
...

我正在寻找一种简单的方法来计算哪些数组最接近主数据并相应地对其进行排名。结果是

  1. 没有 3 - 100% 匹配
  2. 没有 1 - 75%
  3. 没有 2 - 25%

这可能不是很困难,但由于某种原因,我无法理解它。 ruby 中的函数或 rails 中的 gem 可以帮助解决这个问题吗?

提前致谢!

【问题讨论】:

  • [11, 3, 7, 1, 15] à 100% 匹配吗?
  • 您能描述一下您的算法吗?是什么让 1 号匹配 75%,2 号匹配 25%,3 号匹配 100%?
  • @CarySwoveland 你说得对,它实际上不是 100% 匹配 - 它包含主数组中 100% 的数字,但只有 80% 匹配。如果我能同时强调两者就太好了。不知道这有多难……
  • @Stefan 我会尝试 :) 主数组包含 4 个值,因此每个匹配的值代表 25% 的增长。如果主数组有 5 个值,每个值代表 20%
  • 您需要进行编辑以精确定义相似性度量的定义方式。不要试图在 cmets 中解释。

标签: ruby-on-rails ruby arrays sorting comparison


【解决方案1】:

您可以做的是获取主阵列并获取每个阵列。在 master 和每个数组之间做一个交集。取结果的大小,这将为您提供匹配元素的数量。然后,如果您需要找到百分比,您可以轻松地做到这一点。一个例子:

 master = [1, 3, 7, 11]
 arrays = [[1,2,3,4,5], [1,3,11,0], [1,2,3,7,11]]
 arrays.each{|a| puts ((master & a).size.to_f/master.size.to_f) * 100 }

这将给出匹配的百分比。您需要使用数据库中的数据而不是数组。希望这会有所帮助。

编辑:

上述方法仅在数组具有唯一元素时有效。如果数组具有相同的元素并且顺序不重要,则可以在两侧使用uniq。但这将是部分正确的,因为您可以阅读下面的 cmets。正如@Cary Swoveland 提到的那样,可能出了什么问题。

【讨论】:

  • 假设master和array都是[1,1]?
  • 感谢您指出错误。我已经更正了我的答案,但不确定它是否会在所有情况下都成功。如果答案仍然错误,请纠正我。
  • uniq 不起作用。假设 master 是 [1,1] 和数组 [1]。我认为这将是 50% 的匹配,但我们无法确定,因为问题不清楚。
  • 我已经更新了答案,这只是一个部分解决方案。感谢您指出问题。
【解决方案2】:

假设顺序不重要:

m = [1, 3, 7, 11]
a = [2, 3, 4, 8, 10].dup

m.reduce(0) do |t,i| 
  idx = a.index(i)
  if idx
    a.delete_at(idx)
    t+1
  else
    t
  end
end * 100 / a.size
  #=> 25

【讨论】:

    【解决方案3】:

    db_arrays 是存储的数组,array 是您想要找到最佳匹配的数组。我会做的

    ordered = db_arrays.sort_by{|db_array| (db_array & array).size}.reverse
    

    这将按照它们的匹配程度(根据您的标准)为您提供 db_arrays,最好是优先。

    编辑:如果您有大量的 db_array,那么最好尝试使用 sql 查询来执行此操作,而不是全部加载并使用 ruby​​ 测试它们。

    【讨论】:

    • array 有重复项时会出现问题,因为在应用& 时该信息会丢失。
    • 嗯,没错。我想知道,根据提问者的要求,[1,2,3]是否被认为更接近[1,1,2][1,2]
    猜你喜欢
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2023-03-07
    • 2017-06-12
    • 1970-01-01
    相关资源
    最近更新 更多