如何存储集,快速找到类似的模式?

时间:2009-01-20 18:48:03

标签: algorithm data-structures pattern-matching puzzle

(这不是功课,也不是工作问题。这只是我的个人兴趣/职业和完全虚构的。但我对一个好的算法或数据结构很感兴趣。)

让我们假设,我会运行约会网站。我的 特色 就是单曲与电影品味相匹配。 (为什么不呢?)

在这种情况下,我需要一种方法来存储每个用户的电影评级。 (到目前为止没有问题。)我需要一个数据结构来找到最合适的用户。两种味道模式之间的距离是两个用户所做的所有评级之间的平均距离。

示例

movies   A B C D E F G H I J K L M ...
user Xm  9 5   1   1   5
user Ym      4 6 1         8
user Zf  9   6 4           7

距离(X,Z)=平均(abs(9-9)+ abs(1-4))= 1.5

距离(Y,Z)=平均(abs(4-6)+ abs(6-4)+ abs(8-7))= 1.666

所以X先生比Y先生更适合Z夫人。

我喜欢撒谎......

  • ...不需要对数据库进行多次操作
  • ...不需要处理大量数据
  • ...快跑
  • ...提供最佳匹配
  • 好吧,也许我会考虑好的近似值。

请注意,这也应该适用于数千种可能的电影,仅限约20-50部电影的用户以及数千名用户。

(因为这是一个心理难题,而不是一个真正的问题,工作周围并没有真正帮助。)

您的搜索算法或数据结构是什么?

3 个答案:

答案 0 :(得分:3)

看起来你正在寻找电影空间中的nearest neighbor。你的距离函数是L1 metric。您可以使用某种spatial index。也许您可以使用collaborative filtering中的技术。

答案 1 :(得分:3)

听起来很像Netflix Prize挑战,更具体地说是最受欢迎的方法的前半部分。您尝试做的事情的可能实现是多种多样的。它们都不是特别有效,并且L1度量对于可靠的相关性来说不是特别好的选择。

答案 2 :(得分:0)

CREATE TABLE data (user INTEGER, movie INTEGER, rate INTEGER);

SELECT  other.user, AVG(ABS(d1.rate - d2.rate)) AS distance
FROM    data me, data other
WHERE   me.user = :user
    AND other.user <> me.user
    AND other.movie = me.movie
GROUP BY
    other.user
ORDER BY
    distance

复杂性将是O(n 1.5 )而不是O(n 2 ),因为n将与sqrt(n)进行比较电影(每对电影的平均电影)。