【问题标题】:Algorithm to search for similar lists of integers搜索相似整数列表的算法
【发布时间】:2012-11-15 08:59:20
【问题描述】:

我有一个包含两个表的 SQLite 数据库:

Objects:
  object_id int,
  name varchar(50)

Values:
  key char(12),
  value int,
  object_id int

如您所见,每个对象都包含一个键值对列表。该列表通常包含 10 到 60 个条目。 (key, object_id) 的组合在 values 表中是唯一的。

然后我从用户那里得到一个键值对列表,并想在数据库中搜索最相似的对象。用户提供的对象在大多数情况下不会直接匹配我数据库中的任何对象。

相似性意味着两个对象的键列表几乎相等,并且这些键的值相似(在大多数情况下,值也不相等)。该列表可以是可变长度的。

考虑以下列表:

A = { a: 10, b: 20, c: 30 }
B = { a: 11, c: 80, d: 90 }
C = { c: 70, d: 89, e: 40, f: 100 }
D = { c: 65, d: 80, e: 41 }

A 和 B 都包含键 acbd 只包含在一个中其中。因此,如果我们只看键,相似度将是 0.5。 A 和 D 只有 c 相同,abde 仅包含在一个列表中。所以它们不会很相似。

在下一步中,我必须查找匹配键的值。因此,在 A 和 B 的示例中,必须比较键 ac 的值。 a 非常相似,而 c 不是很好的匹配。

是否可以直接使用 SQLite 进行这样的搜索?如果不是,那么进行搜索的最佳方式/算法是什么?搜索应尽可能快,但不应消耗太多计算能力/内存,因为我在移动设备上执行此操作。

非常感谢有关此主题的任何帮助、链接或资源。

【问题讨论】:

  • 你如何定义similar keysalmost equal objects
  • 密钥本身是否相等。列表可以包含可变数量的键值对,因此一些键在两个列表中,而另一些则不在。如果大多数键都包含在两个列表中,并且只有少数键只在其中一个中,则对象几乎相等。这些键的值应该尽可能相似(总是整数)。
  • 那么similarity的意思是至少K个key是相等的?
  • 好的,你已经定义了similar 等价于almost,现在请定义almost。一些样本接近的数学和接近的不匹配可能是个好主意。
  • 不清楚。应该如何准确地计算相似度?请显示这些对象的所有组合的示例,或者更好地描述如何计算它。你真的有算法吗?

标签: sql algorithm sqlite data-mining cluster-analysis


【解决方案1】:

如果我理解正确,您希望将所有记录与来自用户输入的一组固定记录进行比较(假设它是一个与Values 结构相同的表)=> O(n*m 1*m2) (其中 n=对象数量,n*m1=对象数量值中的记录,m2=用户输入中的键) - 如果 m1, 2 是常数因子,则基本上是 O(n):

select
  v1.object_id,
  count(distinct v1.key) cnt_obj_keys,
  count(distinct v2.key) cnt_usr_keys, --replace with a constant from outside code
  count(case
          when v1.key = v2.key
          then 1
        end) cnt_similar_keys,
  count(case
          when v1.key = v2.key and v1.value = v2.value
          then 1
        end) cnt_similar_values
from values v1
cross join values_from_user v2
group by v1.object_id
;

那么你只需要为每个对象使用一个公式,即O(n),来计算用于对对象进行排序的未指定索引并获取它们中的第一个x - 例如:

order by
  cnt_similar_keys / (cnt_obj_keys + cnt_usr_keys - cnt_similar_keys),
  cnt_similar_values / cnt_similar_keys

【讨论】:

    猜你喜欢
    • 2011-01-09
    • 2010-11-02
    • 2011-03-13
    • 2019-02-11
    • 1970-01-01
    • 2011-03-21
    • 2016-03-08
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多