循环匹配。 PHP / MySql

时间:2008-12-21 22:12:26

标签: php mysql

嗨,我需要一些帮助,在PHP中的以下场景。我有一个db用户,每个用户都有ID,have_card和want_card。我知道如何进行直接匹配(一个用户与另一个用户进行交易)。但如果没有直接匹配,但有一个循环交换,如:

用户#1有卡A想要卡B

用户#2有卡B要卡C

用户#3有卡C要卡A

在这种情况下,两个用户之间没有直接匹配。但是如果:

用户#1将他的卡片给用户#3

用户#3将他的卡片给用户#2

用户#2将他的卡片给用户#1

每个人都很开心。

我必须开始的所有信息是用户#1如何找到用户#2和用户#3?

感谢大家的回答。

4 个答案:

答案 0 :(得分:3)

有趣的是,我在BoardGameGeek Maths Trade时遇到过类似的事情。基本上,每个人都指定他们要么想要游戏要么有游戏,算法最大化交易,包括循环依赖。

这正是你想要的。

这是explanation of how TradeMaximizer works。它使用Dijkstra's algorithmskew heaps来查找最小匹配解决方案(即较小的圆圈优于较大的圆圈)。

当然这是用Java创建的,但算法是通用的,您可以根据需要重新创建它,特别是一旦您了解它正在做什么以及为什么这样做。

答案 1 :(得分:1)

我就是这样做的: 创建一个这样的递归算法:

1带一个用户,看看他想要什么

2找到另一个拥有用户想要的用户

- if user two wants, what user one has, everything is fine an we're done
- if not, continue

3找到另一个用户2想要的用户

- if user three wants, what user one has, everything is fine and we're done
- if not, continue ...

......等等,但你应该限制递归级别以防止无休止的搜索。

答案 2 :(得分:0)

也许这个:

找到可能的第一场比赛(卡用户#1想要的用户)

select name from user where has in (select wants from user where name = '1');

迭代这些匹配并尝试找到缺失的链接:

select name from user where name in (select name from user where has in (select wants from user where name = <match>));

答案 3 :(得分:0)

这是一个具有挑战性的场景。我不得不为一本书交换应用程序而构建它,并且使用白板我能够更容易地直观地解决问题。

我所做的是在查询中多次使用同一个表,只是使用不同的名称。

在我的场景中,所需的书籍与用户拥有的书籍分开。希望您能够在此查询中看到逻辑:

$query = "SELECT 
        A.Owner_ID as Owner_1, C.Owner_ID as Owner_2, E.Owner_ID as Owner_3 
    FROM
        E_User_Books_Have as A, E_User_Books_Have as C, E_User_Books_Have as E,
        E_User_Books_Needed as B, E_User_Books_Needed as D,E_User_Books_Needed as F

    WHERE 
        A.Book_ID=D.Book_ID AND
        C.Book_ID=F.Book_ID AND
        E.Book_ID=B.Book_ID AND 
        A.Owner_ID='$ME' AND B.Owner_ID='$ME' AND A.ID='$ID'AND 
        C.Owner_ID=D.Owner_ID AND  
        E.Owner_ID=F.Owner_ID AND
        C.Owner_ID!='$ME' AND
        E.Owner_ID!='$ME'";