Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在任何两个元素之间的比较可能不明确时对列表进行排序?_Algorithm_Sorting_Comparison_Ambiguity - Fatal编程技术网

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

Algorithm 在任何两个元素之间的比较可能不明确时对列表进行排序?,algorithm,sorting,comparison,ambiguity,Algorithm,Sorting,Comparison,Ambiguity,我正在尝试为等轴测渲染器优化排序。需要证明的是,比较器可以返回“A>B”、“AB和B>C。最后的列表应该是a、B、C 还要注意,可能有多种解决方案。如果A>B,但C对A和B都不明确,那么答案可能是C、A、B或A、B、C 编辑:我确实说过这是为了在等轴测渲染器中进行排序,但有几个人要求提供更多信息,所以这里就开始了。我有一个等距游戏,我正在尝试排序的对象。每个对象在世界上都有一个矩形的、轴对齐的足迹,这意味着从相机的角度来看,它们看起来像一种钻石形状。对象的高度未知,因此假定另一个对象前面的对象能

我正在尝试为等轴测渲染器优化排序。需要证明的是,比较器可以返回“A>B”、“A 例如,可能存在a和C之间的关系不明确的情况,但我们知道a>B和B>C。最后的列表应该是a、B、C

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

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

我还遗漏了一个重要的考虑因素,那就是少量的对象(化身)会四处移动

编辑#2:我终于有足够的代表发布图片了!A和B……嗯,它们并不是严格意义上的模棱两可,因为在每种情况下,它们彼此之间都有明确的关系。然而,通过观察A和B本身的变量,无法了解这种关系。只有当我们也看C时,我们才能知道它们的顺序

我肯定地认为地形排序是一种方式,所以我正在考虑回答的问题,但我很高兴为子孙后代澄清这个问题


您可能需要查看部分订单的排序

链接到有关此主题的正确论文(特别是拓扑排序)

编辑:

根据节点的定义:

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

______
____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")
def比较(a,b):
如果a.max\u x

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

您应该首先构建一个有向图,使用该图,您将能够通过从每个节点进行排序来找到关系


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

它链接到一篇维基百科文章,该文章(我认为)假设您已经建立了所有可能的无歧义比较的DAG,这可能是相当昂贵的每个渲染帧。在不知道排序的内容的情况下,我无法评论其效率或不足。嗯,听起来不错。这个问题听起来和我想问的一模一样,让我怀疑他是否也在做同样的事情。我认为构建初始DAG将非常耗时(n^2?),但谢天谢地,每帧最多只有一个或两个对象在移动,因此希望DAG更改可以在线性时间内完成。@PatrickCyr我编辑了这个问题,因为我相信您可以定义总顺序,这将使你的渲染过程更快。谢谢你提供的额外信息,克里斯托夫!我们围绕所有对象都是轴对齐的矩形且永远不能重叠的规则构建了这个引擎,因此谢天谢地,我们将永远不会出现像您绘图时那样的情况。正如Eric回答的(并已删除)那样,您不能只使用标准排序,而假设“不明确”等于或不交换吗?如果您使用的排序可能会对每个元素与所有其他元素进行多次比较,例如冒泡排序,那么排序肯定会自行解决;但即使你不这样做,例如Eric建议的快速排序,你仍然应该得到适合多种解决方案之一的结果。你可以先做一个普通的冒泡排序。但是,如果两个元素之间的关系不明确,就不要交换它们。接下来,您将浏览已排序的列表,每当您发现一个元素与其相邻元素的关系不明确时,您将检查该元素是否比列表中的任何其他元素都小或大。是否可以添加有关正在比较的对象的更多信息?它们是什么?歧义是如何产生的?。。。如果您添加更多有关被比较对象的性质的信息,那么聪明的用户可能会看到元素之间的非平凡关系。我画了一张漂亮的照片,却发现我没有代表来张贴照片我认为我们现在正在做一些类似于泡沫排序的想法,这是有问题的。大多数对象之间的关系是不明确的,因此我们花了大量时间比较对象与所有其他对象。我倾向于拓扑排序,因为虽然它有昂贵的设置,但每帧排序是