当任何两个元素之间的比较可能不明确时对列表进行排序?

时间:2015-04-22 01:09:09

标签: algorithm sorting comparison ambiguity

我正在尝试优化等距渲染器的排序。证明棘手的是比较者可以返回" A> B"," A< B"或者" A和B之间的关系是模棱两可的。"所有标准排序算法都希望您可以比较任何两个对象的值,但我不能在这里做。是否有针对这种情况的已知算法?

例如,可能存在A和C之间的关系不明确的情况,但我们知道A> B和B> C.最终名单应为A,B,C。

另请注意,可能有多种解决方案。如果A> B,但C对A和B都不明确,那么答案可能是C,A,B或A,B,C。

编辑:我确实说它是用于在等距渲染器中进行排序,但有几个人要求提供更多信息,所以这里有。我有一个等距游戏,我试图对物体进行排序。每个物体在世界上都有一个矩形的,轴对齐的足迹,这意味着它们从相机的角度看起来像一种钻石形状。对象的高度是未知的,因此假定另一个对象前面的对象能够遮挡后面的那个对象,因此必须在后面的那个之后绘制(在列表中稍后排序)。 / p>

我也没有考虑到一个重要的考虑因素,即少量物体(化身)四处移动。

编辑#2:我终于有足够的代表发布图片了! A和B ......好吧,它们并不严格含糊不清,因为在每种情况下它们彼此之间都有一定的关系。但是,通过查看A和B本身的变量,无法知道这种关系。只有当我们看到C时,我们才能知道它们的顺序。

我绝对认为地形排序是要走的路,所以我考虑回答的问题,但我很乐意澄清后人的问题。

enter image description here

2 个答案:

答案 0 :(得分:3)

您可能希望查看部分订单的排序。

https://math.stackexchange.com/questions/55891/algorithm-to-sort-based-on-a-partial-order链接到关于此主题的正确论文(特别是拓扑排序)。

编辑:

给定节点的定义:

您需要确保对象永远不会导致相互遮挡。看看下面的网格,相机位于左下角。

______
____X_
_YYYX_
_YXXX_
_Y____

如您所见,Y的部分被X隐藏,X的部分被Y隐藏。任何绘制顺序都会导致奇怪的渲染。这可以通过多种方式解决,最简单的方法是仅允许凸出的无孔形状作为可渲染基元。任何凹陷都需要分解成块。

如果您这样做,则可以将部分订单转换为总订单。这是一个例子:

def compare(a,b):
    if a.max_x < b.min_x:
        return -1
    elif a.max_y < b.min_y:
        return -1
    elif b.max_x < a.min_x:
        return 1
    elif b.max_y < a.min_y:
        return 1
    else:
        # The bounding boxes intersect
        # If the objects are both rectangular,
        # this should be impossible
        # If you allow non-rectangular convex shapes,
        # like circles, you may need to do something fancier here.
        raise NotImplementedException("I only handle non-intersecting bounding boxes")

并使用任何旧的排序算法为您提供绘图顺序。

答案 1 :(得分:0)

您应该首先构建一个有向图,使用该图可以通过DFS从每个节点找到关系。

一旦你有了关系,一些对可能仍然是模棱两可的。在这种情况下,寻找部分排序。