我正在做一些补偿。数学工作,我正在尝试使用复杂的数学排序谓词对序列进行排序,该序列并不总是在序列中的两个元素之间定义。我正在尝试更多地了解排序算法,这些算法可以优雅地处理无法进行的元素比较,因为到目前为止我只管理了一个非常基本的方法。
我很抱歉,如果这个问题是一些经典问题,我花了一些时间来定义它,算法设计不是我的强项。
假设我有一个序列A = {a, b, c, d, e}
。我们将f(x,y)
定义为二元函数,如果0
则返回x < y
,1
y <= x
,通过应用一些复杂的排序标准。
在正常情况下,这将为我们提供足够的细节来排序A
。 然而,f
也可以返回-1
,如果排序标准没有为该特定输入对定义良好。一对输入的未定义是可交换的,即。 f(q,r)
当且仅当f(r,q)
未定义时才是未定义的。
我希望尝试使用明确定义的排序标准对序列A
进行排序。
例如让我们假设
f(a,d) = f(d,a)
未定义。 f
的所有其他输入对定义良好。 然后,尽管不知道a
和d
之间的不等式关系,我们仍然可以根据明确定义的排序标准对A
进行排序,只要 a
和d
在生成的“已排序”序列中彼此不相邻。
例如,假设我们首先确定A - {d}
的相对排序为{c, a, b, e}
,因为所有这些f
对都是明确定义的。这可以调用任何排序算法。
然后我们可以调用f(d,c)
和
d < c
我们完成了 - 排序的序列确实是{d, c, a, b, e}
。f(a, d)
。这是未定义的,因此我们无法从这个角度建立d
的位置。 f(d, e)
,并从元素向右移动。
x
d > x
,我们就完成了。 f(a, d)
,我们已经确定我们无法根据我们定义的明确排序标准对序列进行排序。 这些排序算法是否有分类,处理未定义的比较对?
更好虽然没有预期,是否有一种众所周知的“高效”方法?我已经定义了我自己极其简陋的蛮力算法来解决这个问题,但我确信它并不理想。
它有效地抛出了遇到时无法比较的所有序列元素,并在剩余的子序列(如果有任何元素仍然存在)之前对其进行排序,然后再详尽地尝试将所有与所有其他元素不可比较的序列元素放入已排序的子序列中。
只需要对这个主题进行进一步研究的路径就会很棒 - 我缺乏算法经验,因此很难找到我应该在哪些方面寻找关于这些问题的更多背景知识。
答案 0 :(得分:6)
这非常接近topological sorting,您的二元关系是边缘。特别是,这只是extending a partial order into a total order。如果你考虑使用toposort的所有对(即O(V + E)),你会有最坏情况的O(n ^ 2)算法(实际上是O(n + p),其中n是元素的数量,p是数量可比对)。