【问题标题】:Sort Algorithm for a set of elements knowing pair order知道对顺序的一组元素的排序算法
【发布时间】:2014-02-01 21:49:04
【问题描述】:

这是一个我正在寻找算法解决方案的问题。假设我们有一组 n 个元素,A1, A2, ..., An 我们有一组规则,如 A1 > A2、A1

提前致谢。

【问题讨论】:

  • @Arash 你能详细说明我正在寻找标准解决方案的意思吗
  • @user2864740:不是真的。典型的排序算法只有在 (x, y) 的每一对元素与 x != y 的情况下才有效,x < yx > y 是已知的。
  • @user2864740 抱歉,但这并不意味着。我们没有针对每个可能的比较的规则,我们有针对可能比较的子集的规则,这些规则足以获得总订单。
  • @girishlalwani2010 我所说的标准解决方案是指一种分类方法,比如我们说“A* 算法”、“快速排序”或“DLX”。

标签: algorithm set


【解决方案1】:

仅当您有total ordering 时,基于比较的排序算法才有效,也就是说,如果对于每一对x, yx != y,我们知道是x < y 还是y < x。您拥有的是一组元素上的 partial ordering,而您正在寻找的是根据该部分顺序的元素的 toplogical ordering

要找到它,请将您的输入解释为带有边 (a, b) 的图形,其中 a < b 是输入对。然后在该图上执行DFS

dfs(x):
  if x is visited: return
  for every rule x < y or y > x:
    dfs(y)
  add x to front of output

output = []
for every element x:
  dfs(x)

运行时是O(n + m),其中n 是元素(节点)的数量,m 是规则(边)的数量。

【讨论】:

  • 谢谢。我会在阅读其他建议时考虑它。到目前为止,这似乎是唯一的答案!
  • @Arash:是的,建议的基于比较的排序无法解决这个问题。
  • @Arash:即使没有循环,您也可以使用 DFS 获取深度优先森林。它的特性是对于每个节点x,图中从该节点可到达的所有节点都在x 的子树中。对于 BFS 森林,情况并非如此。假设你有A &lt; B, A &lt; D, B &lt; D, B &lt; C。一个有效的 BFS 树是A -&gt; B, A -&gt; D, B -&gt; C。您丢失了信息B &lt; D,因此该树不足以提取有效的拓扑顺序。
  • 非常感谢您的解决方案以及此评论。
【解决方案2】:

没问题,任你选!

任何比较排序都可以;只需将您的规则放入单个函数中的大 if/else 语句中,比较排序将非常乐意按照您的喜好对它们进行排序。

【讨论】:

  • 我认为这不是真的。假设我们有n 输入元素和规则1 &lt; 2, 2 &lt; 3, ..., n - 1 &lt; n。最终顺序完全确定,但基于比较的排序将围绕n * log n 进行比较,但我们最多只知道其中n 的结果。我们如何回答其他比较?
猜你喜欢
  • 1970-01-01
  • 2019-09-01
  • 2017-03-22
  • 2011-05-24
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多