Algorithm 比较不同的对象

Algorithm 比较不同的对象,algorithm,graph-algorithm,Algorithm,Graph Algorithm,最近有人问我这个面试问题 假设您有一个set(ka,kb)和compare(ka,kb)接口。 例如: 这里的逻辑是比较(A,B)…从A开始做DFS,并检查是否可以达到目标。例如:使用DFS比较(A,C)A->B->C 现在比较(C,D)-如果无法从C的adjList中找到D,请尝试反向比较。检查D的调整列表中是否有C,如果是,则D>C,如果您无法从两端达到目标,则返回?无法找到任何关系。这种方法看起来正确吗?有没有更好的办法 编辑:我们能用弗洛伊德·沃沙尔·阿尔戈吗? 例如:创建一个额外的布尔

最近有人问我这个面试问题

假设您有一个set(ka,kb)和compare(ka,kb)接口。 例如:

这里的逻辑是比较(A,B)…从A开始做DFS,并检查是否可以达到目标。例如:使用DFS比较(A,C)A->B->C

现在比较(C,D)-如果无法从C的adjList中找到D,请尝试反向比较。检查D的调整列表中是否有C,如果是,则D>C,如果您无法从两端达到目标,则返回?无法找到任何关系。这种方法看起来正确吗?有没有更好的办法

编辑:我们能用弗洛伊德·沃沙尔·阿尔戈吗?
例如:创建一个额外的布尔矩阵并添加>,<,=?基于及物性的符号?

你是对的,给定的集合关系形成了一个图形。仔细观察,您会发现这样创建的图实际上是一个有向无环图(DAG)(正如@RalfKleberhoff在注释中指出的)。这使得检查关系(
compare
ing)更加容易。为了保持一致性,我将假设
set(A,B)=>A>B=>B是A的子对象(与生成邻接列表的方式完全相同)

一旦我们有了DAG,我们的
比较(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 '?'
比较(X,Y): 如果X是Y的后代://即,从Y开始的DFS/BFS将成功找到X 返回“” 其他: 返回“?”
解释
由于我们构建DAG的方式,对于DAG中的节点,其所有子代(子代、子代等)都小于它(

a只是表示图形的一种方法,因此将解决方案描述为一种或另一种没有任何好处。为什么拓扑排序没有帮助?它不能确定什么?图中是否允许循环?@IanMercer拓扑排序用于上述设置的输入将给出以下顺序:ABCD或ABDC,首先我们必须确定所有可能的拓扑排序序列,然后检查每个序列以确定其关系。面试问题(或任务)是什么顺便问一下?@OleksandrPshenychnyy采访问题。。我知道我建议的方法,但很想知道是否存在更有效的解决方案。回答不错,只是吹毛求疵:图不一定是树(在给定的ABCD情况下是树),它可以是任何DAG(有向无环图),例如,通过添加
set(C,D)
您仍然可以获得一致的比较结果。但是创建一个循环(例如,
set(C,a)
)是无效的,这将导致a>C和C>a的矛盾。伟大的评估,@RalfKleberhoff。我还没有考虑过要一个DAG的可能性。然而,我认为我的解决方案也应该适用于DAG。我编辑了我的答案以反映变化。
A->B
B->C,D
C->E
D->F
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 '?'