比较不同的对象

时间:2018-04-19 07:24:53

标签: algorithm graph-algorithm

最近我被问到这个面试问题。

考虑你有一组(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; ,=,?基于传递性的符号?

1 个答案:

答案 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中的节点,其所有后代(子节点,孙子节点等)都小于(<)它。同样,节点的所有祖先(父母,祖父母等)都大于(>)它。