Algorithm Have/Want列表匹配算法

Algorithm Have/Want列表匹配算法,algorithm,Algorithm,Have/Want列表匹配算法 我正在一个高流量的网站上实现一个物品交易系统。我有大量的用户,每个用户都维护一个have列表和一个WANT列表,用于一些特定的项目。我正在寻找一种算法,使我能够有效地建议贸易伙伴的基础上,你有和他们匹配的需求。理想情况下,我希望找到具有最高共同交易潜力的合作伙伴(即,我有很多你想要的东西,你有很多我想要的东西)。我不需要找到全局最高电位对(听起来很难),只需要找到给定用户的最高电位对(甚至只是一些高电位对,而不是全局最大值) 例如: User 1 HAS A,C

Have/Want列表匹配算法

我正在一个高流量的网站上实现一个物品交易系统。我有大量的用户,每个用户都维护一个have列表和一个WANT列表,用于一些特定的项目。我正在寻找一种算法,使我能够有效地建议贸易伙伴的基础上,你有和他们匹配的需求。理想情况下,我希望找到具有最高共同交易潜力的合作伙伴(即,我有很多你想要的东西,你有很多我想要的东西)。我不需要找到全局最高电位对(听起来很难),只需要找到给定用户的最高电位对(甚至只是一些高电位对,而不是全局最大值)

例如:

User 1 HAS A,C WANTS B,D User 2 HAS D WANTS A User 3 HAS A,B,D WANTS C User 1 goes to the site and clicks a button that says "Find Trading Partners" and the top-ranked result is User 3, followed by User 2. 用户1有A,C想要B,D 用户2需要一个 用户3有A,B,D想要C 用户1进入该站点并单击一个按钮 “寻找贸易伙伴”,排名第一的结果是 用户3,然后是用户2。 复杂性的另一个来源是,这些项目具有不同的价值,我希望尽可能匹配价值最高的交易,而不是两个交易者之间匹配次数最多的交易。因此,在上面的示例中,如果所有项目都值1,但A和D都值10,那么用户1现在与用户3上方的用户2匹配

一种简单的方法是计算寻找合作伙伴的用户与数据库中所有其他用户之间的最大交易值。我正在考虑使用一些查找表,在正确的事情上,我可能会做得更好。我试过用谷歌搜索,因为这似乎是一个经典问题,但我不知道它的名字


有人能推荐一种解决这个问题的好方法吗?我见过像魔术在线交易联盟这样的网站,它们似乎可以实时解决这个问题。

当然,你可以将系统分为三类;“想要”、“拥有”和“公开报价”。假设User1拥有A项,User2拥有B项和C项,并且正在用A项交易,但User1仍然想要D项,User2想要E项。因此User1(假设他是交易“所有者”)提出请求,或者想要D项和E项,因此报价有效,并进入“公开报价”列表。如果在两天左右的时间内未被接受或编辑,则会自动取消。因此,User3正在查找项目F和项目G,并在“Have list”中搜索项目F和G,这些项目在User1和User2之间分割。他意识到User1和User2的公开报价包括对他拥有的D&E项目的请求。因此,他选择“加入”这项业务,并根据他们的条款接受,在他们之间进行交易和交换


假设User1现在想要项目H。他只是在“Have”列表中搜索该项目,在结果中,他发现User4将用项目H交换项目I,而User1恰好拥有该项目。他们交易,一切都很好。

你可以在
O(n*k^2)
中做到这一点(n是人数,k是他们拥有/想要的项目的平均数量),方法是保留所有拥有和想要给定项目的人的哈希表(或数据库中的索引),然后为拥有当前用户想要的项目的所有人打分,并希望当前用户拥有的项目。显示前10或20个分数


[Edit]这将如何在SQL中实现的示例:

-- Get score for @userid wants
SELECT UserHas.UserID, SUM(Items.Weight) AS Score
FROM UserWants
INNER JOIN UserHas ON UserWants.ItemID = UserHas.ItemID
INNER JOIN Items ON Items.ItemID = UserWants.ItemID
WHERE UserWants.UserID = @userid
GROUP BY UserWants.UserID, UserHas.UserID

这将根据当前用户想要的其他用户的项目,为您提供其他用户及其分数的列表。对当前用户拥有的其他人想要的项目执行相同的操作,然后以某种方式组合它们(添加分数或任何您想要的内容),并获取前10名。

只需将其设置为BC即可。这解决了所有问题。

您可以维护每项列表(作为每用户列表的补充)。然后,项目搜索就可以进行了。现在,您可以通过先检查最有价值的物品,让您的自我暴力搜索最有价值的一对。如果您想要更复杂(可以说更快)的搜索,您可以引入一组经常作为元项组合在一起的项,然后首先查找它们。

我按字母标记项,按数字标记用户

  • m
    -所有拥有/想要列表中的项目数(拥有或想要、不拥有和想要)
  • x
    -用户数
对于每个用户,您都有他想要和拥有的列表。左边一行是“需要列表”,右边一行是“拥有列表”(两者都将被排序,以便我们可以使用二进制搜索)

对于每对用户,您生成两个值并将它们存储在某个位置,您只需生成一次,然后再实现。排序第一个表并生成第二个表是
O(m*x*log(m/x))
+
O(log(m))
,需要
O(x^2)
额外的内存。这些值是:第一个用户将获得多少,另一个用户将获得多少(若需要,可以通过将这些值乘以特定项的值来修改这些值)

您还计算并存储每个用户的最佳交易者。生成这些有用的数据后,您可以快速查询

  • 添加/删除项-
    O(m*log(m/x))
    (您循环浏览用户的have/want列表,对每个其他用户的have/want列表进行二进制搜索,并实现数据)
  • 查找最佳连接-
    O(1)或O(x)
    (取决于缓存中存储的结果是否正确或是否需要更新。您可以循环用户对,并对数据执行任何操作,以返回给用户最佳连接)
通过
m/x
I估计单个用户想要/拥有列表中的项目数

在这个算法中,我假设所有数据都不存储在数据库中(我不知道数据库是否可以进行二进制搜索),并且在列表中插入/删除项是
O(1)

顺便说一句,很抱歉我的英语不好,我希望我已经计算好了,并且它能正常工作,因为我也需要它。

好的,这个怎么样:

基本上有巨大的“池”

每个“池”包含“部分”。每个“池”专用于拥有特定项目的人。每个部分都是为拥有该物品并想要另一个物品的人准备的

我的意思是:

1 - ABBCDE FFFGH
2 - CFGGH BE
3 - AEEGH BBDF
1-2 : 1 - 3 (user 1 gets 1) - (user 2 gets 3)
1-3 : 3 - 2
2-3 : 1 - 1