确定对象相似度的算法

时间:2014-05-05 15:45:24

标签: algorithm computer-science

我需要一些帮助来为以下场景提供算法:

我有一个函数,它接收一个对象列表的列表。这些对象的形式为[type,value],其中type是四个选项之一(简单地说,介于0-3之间的数字之间),value可以是任意的。

所以输入可能是这样的:

{{[0,5],[1,8]},{[0,5],[3,88]},{[0,5],[1,25],[3,88] }}

我需要算法做的是,创建一个名为commonList和uncommonList的列表。 commonList将仅包含该对的类型部分,但仅当列表中的每个集合具有该类型的相同值时。 uncommonList将包含每个[type,value]对的类型,它不是列表中每个集合的标识/部分。

所以输入示例:

commonList = {0} uncommonList = {1,3}

commonList包含值0,因为每个集合都有一个类型为0的对,并且每对都具有相同的值。

uncommonList包含值1,因为所有3个集合都不包含相同的[1,value]对。值3的情况相同。

我对这个算法提出了一些困难。我将编辑并发布我现在拥有的一些代码,只需先将其概括一下

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,您希望找到所有集合共有的对[密钥,值]对。

为了有效实现这一目标,您可以做的是:

  • 使用第一组的内容初始化公共对CoP。 CoP的每个元素是原始对加上一个额外的计数整数。在你的例子中,'CoP< - {{[0,5],0},{[1,8],0}}'
  • 对于每一组,请执行以下操作:
    • 重置CoP中每对的关联整数。
    • 每对
      • 如果该对存在于CoP中,则递增关联的计数整数。
    • 扫描CoP中的所有对:
      • 删除一次未访问过的每一对,即每对其关联的整数等于0。
    • 如果CoP为空,请在此处结束
  • commonList是CoP中所有类型元素的集合; uncommonList是所有可能类型集的补充。

如果你可以保证你拥有真实的对象集(不是一组中相同对象的两倍),你可以加快速度:

  • 使用第一组的内容初始化公共对CoP。 CoP的每个元素是原始对加上一个额外的计数整数。在你的例子中,'CoP< - {{[0,5],0},{[1,8],0}}'
  • 对于每一组,请执行以下操作:
      每对
      • 如果该对存在于CoP中,则递增关联的计数整数。
  • 扫描CoP中的所有对:
    • 删除每一组未访问过的每一对,即每对与其关联的整数不等于对象组的数量。
  • commonList是CoP中所有类型元素的集合; uncommonList是所有可能类型集的补充。

您可以使用对象之间的距离(如果距离低于某个值,则可以使用相同的对象)轻松推广。