说我正在解析一句话:“Blake比Mary高,Mary比Sue高,Sam比Mary短,而John比Mary高”
看起来像是:
Sue, Sam
Mary
John, Blake
也许:
Array(
[0] => Array(
[0] => Sue
[1] => Sam
)
[1] => Mary
[2] => Array(
[0] => John
[1] => Blake
)
)
我们不知道Sue和Sam中的哪一个更短/更高,我们不知道John和Blake中哪一个更短/更高,所以他们坐在同一条线上。
但后来我可以给它声明:“布莱克比约翰短”,这会使它看起来像:
Sue, Sam
Mary
Blake
John
思考?我知道如果我只是试着跳进去,我会弄得一团糟,所以我只是想知道代表它的最佳方式。像上面的数组或树数组?
我想稍后给它一个问题,比如“谁更矮,布莱克还是苏?”答案是苏。
答案 0 :(得分:3)
可以用directed graph表示。如果您有关于两个人身高的相关信息,请在他们之间添加一条边,使其指向较高或较矮的人。 (只要你是一致的,这无关紧要。)要看一个人是否比另一个更短或更高,看看他们是否是另一个的祖先或后代。如果形成一个循环,则意味着信息不一致。
在PHP中,你可能有一个Person
类。每个Person
都会有一个Person
的数组,它们比它们更高(更短)。然后,您将拥有一组Person
个对象。要创建链接,您需要将最高(最短)的人添加到最短(最高)的人更高(更短)的数组中。
为了测试A人是否比B人更矮(更高),从A人开始并通过所有直接和传递更高(更短)的人进行递归。如果你到达人B,人A比人B更短(更高)。尝试交换人A和B,看看是否产生结果。如果仍然没有确定的结果,则没有足够的信息来确定A和B人的相对高度。
如果信息不一致,则按上述方式递归将导致无限递归。