最近我被问到这个面试问题。
考虑你有一组(K a,K b)和比较(K a,K b)界面。 例如:
set(A,B) means A>B
set(B,C) means B>C
set(B,D) means B>D
Now
compare(A,B) returns '>'
compare(B,A) returns '<'
compare(A,C) returns >
compare(C,D) returns ?
我的回答:我最初认为它代表了一个图表,我可以构建一个图表并执行拓扑排序,但这并没有帮助。
下一步方法: - 使用set方法创建邻接列表。 例如:
A->B
B->C,D
C->E
D->F
这里的逻辑比较(A,B)..do DFS从A开始并检查你是否可以达到目标。例如:使用DFS比较(A,C)A-> B-> C
现在比较(C,D) - 如果无法从C的adjList到达D,请尝试反向比较。检查D是否在D的adjList中,如果是,则D> C,如果你无法从两端达到目标,那么返回?陈述找不到任何关系。这种方法看起来是否正确?有没有更好的方法?
编辑:我们可以使用Floyd Warshall Algo吗? 例如:创建一个额外的布尔矩阵并添加&gt;,&lt; ,=,?基于传递性的符号?答案 0 :(得分:1)
你是对的,给定的集合关系形成一个图形。仔细观察,您会发现这样创建的图形实际上是一个有向无环图(DAG)(正如@RalfKleberhoff在评论中所指出的那样)。这使得检查关系(compare
)变得更加容易。为了保持一致性,我将假设set(A, B) => A > B => B is a child of A
(确切地说是如何生成邻接列表)。
一旦我们有了DAG,我们的compare(X, Y)
算法就如下:
compare(X, Y):
if X is descendant of Y: // i.e. a DFS/BFS starting from Y will successfully find X
return '<'
if Y is descendant of X:
return '>'
else:
return '?'
由于我们构建DAG的方式,对于DAG中的节点,其所有后代(子节点,孙子节点等)都小于(<
)它。同样,节点的所有祖先(父母,祖父母等)都大于(>
)它。