2013-05-29 73 views
1

說我解析如下語句:「布雷克身高超過瑪麗和瑪麗是身高超過蘇和Sam短於瑪麗和約翰是瑪麗比身高」我應該如何表示這些相對較高/較短的比較?

將目光像:

Sue, Sam 
Mary 
John, Blake 

可能:

Array(
    [0] => Array(
     [0] => Sue 
     [1] => Sam 
    ) 

    [1] => Mary 
    [2] => Array(
     [0] => John 
     [1] => Blake 
    ) 
) 

我們不知道蘇和薩姆是短/高,我們不知道哪個約翰和布雷克是短/高,使他們在同一行坐在一起。

但後來,我可以給它的語句:「布雷克是短於約翰」,這將使它看起來像:

Sue, Sam 
Mary 
Blake 
John 

的思考?我知道如果我只是試圖跳入這裏,我會弄得一團糟,所以我只是想知道代表它的最佳方式。像上面的數組或者可能是樹數組?

我在想以後給它一個像「誰更短,布萊克還是蘇?」的問題。答案是蘇。

回答

3

這可以用directed graph表示。當你有關於兩個人的身高的相關信息時,在他們之間加一條邊,使其指向較高或較矮的人。 (只要你保持一致,哪個並不重要。)爲了看看有人比另一個人短或高,看他們是否是另一個的祖先或後代。如果形成循環,則意味着信息不一致。

在PHP中,您可能有一個Person類。每個Person將有一個Person s的數組,他們比(更短)。然後你會有一個Person對象的數組。要創建鏈接,您需要將最高(最短)人員添加到最短(最高)人員的較高(較短)人員陣列。

爲了測試一個人A是否比人B短(高),從人A開始,並通過所有直接和傳遞較高(較短)的人進行遞歸。如果您到達B人,A人比B人矮(高)。嘗試交換人A和B並查看是否會產生結果。如果仍然沒有確定的結果,那麼沒有足夠的信息來確定人A和B的相對高度。

在信息不一致的情況下,如上所述的遞歸將導致無限遞歸。

+0

請問您是否可以詳細說明PHP實現的外觀? –