Dairesel eşleştirme.

4 Cevap php

Merhaba ben php aşağıdaki senaryoda bazı yardıma ihtiyacım var. Ben her kullanıcının kimlik, have_card ve want_card olan kullanıcılar ile bir db var. Ben doğrudan maç (bir kullanıcı başka bir kullanıcı ile esnaf) yapmak için biliyorum. Orada doğrudan maç ama Ama eğer böyle bir dairesel takas vardır:

Kullanıcı # 1 kart bir kart B istiyor vardır

Kullanıcı # 2 kart Yatak kartı C istediğinde

User # 3 kartı C kart A istiyor vardır

Bu senaryoda iki kullanıcı arasında doğrudan bir maç yoktur. Ama eğer:

Kullanıcı # 1 User # 3 için kartını verdi

User # 3 User # 2 için kartını verdi

User # 2 User # 1 için kartını verdi

Her olanları mutlu.

Ben ile başlamak zorunda tüm bilgileri nasıl User # 2 ve User # 3 buluyorsunuz Kullanıcı # 1?

Cevaplar için herkese teşekkürler.

4 Cevap

Bu zor bir senaryodur. Ben bir süre geri ve beyaz tahta kullanarak ben daha kolay görsel başardı ve sorunu çözmek bir kitap takas uygulama için bu inşa etmek zorunda kaldı.

Ne yaptım sadece farklı bir ad kullanarak, sorgu birden çok kez içinde aynı tablo kullanmak oldu.

Benim senaryoda, ihtiyaç duyulan kitaplar kullanıcıların vardı kitaplardan ayrı bir tablo vardı. Umarım bu sorguda mantığını görmek mümkün olacak:

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

İlginçtir, ben BoardGameGeek Maths Trade ile buna benzer bir şey geldi. Temelde, herkes ya bir oyun istiyorsanız ya da bir oyun ve algoritma dairesel bağımlılıkları dahil olmak üzere esnaf maksimize olduğunu belirtir.

Bu istediğiniz tam olarak budur.

İşte bir explanation of how TradeMaximizer works olduğunu. Bu Dijkstra's algorithm kullanır ve skew heaps minimal uyan çözümleri (yani daha küçük bir daire daha büyük bir daire için tercih edilir) bulmak için.

Verilen bu Java oluşturulan ama bunu neden yaptığını ve neler olduğunu anlamak, özellikle bir kez algoritmaları evrensel ve gerektiği gibi yeniden oluşturabilirsiniz edilir.

This is how I would do it: Create a recursive algorithm like this:

Bir kullanıcıyı 1, ne istediğini görmek

Tek istediği, kullanıcının sahip başka bir kullanıcı bulmak 2

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

Ne kullanıcı iki istek var başka bir kullanıcı bulmak 3

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

... Ve böylece, ama gereken bir sonsuz arama önlemek için özyinelemeli seviyeleri için sınırı vardır.

Belki de bu:

Olası ilk maçlarını bulma (kart kullanıcı 1. istiyor sahip kullanıcılar)

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

Bu maçlarda yineleme ve eksik bağlantıyı bulma deneyin:

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