循环匹配。 PHP / MySql

您好,我需要一些帮助在php下面的情况。 我有一个数据库与用户每个用户有一个ID,have_card和want_card。 我知道如何进行直接匹配(一位用户与另一位用户进行交易)。 但是如果没有直接的匹配,但是有一个像下面这样的循环交换:

用户#1有卡A想要卡B.

用户#2有卡B想要卡C.

用户#3有卡C想要卡A.

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

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

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

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

每个人都开心。

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

感谢大家的答案。


这是一个具有挑战性的场景 我不得不为这本书交换应用程序,并且使用白板,我可以更轻松地查看和解决问题。

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

在我的情景中,所需的书籍与用户拥有的书籍不同。 希望你能看到这个查询中的逻辑:

$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'";

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

这正是你想要的。

以下是TradeMaximizer如何工作的解释。 它使用Dijkstra算法和倾斜堆寻找最小匹配解决方案(即较小的圆圈比较大的圆圈更可取)。

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


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

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 ...

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

链接地址: http://www.djcxy.com/p/42247.html

上一篇: Circular matching. PHP / MySql

下一篇: channel sound input in Java