找到优先级函数/字母顺序的极值

时间:2011-02-10 16:19:18

标签: algorithm math

我们有一个来自字母a1,a2,...aN的元素数组E。假设|N| >> |E|

对于字母表中的每个符号,我们定义一个唯一的整数优先级= V(sym)。为简单起见,我们定义V{i} := V(symbol(ai))

如何找到优先级函数V:

Count(i)->MAX | V{i} < V{i+1}

换句话说,我需要找到满足条件i的位置数V{i}<V{i+1}最大的字母表的优先级/排列。

编辑-1:请仔细阅读。我给了一个数组ai,任务是生成一个函数V。关于使用优先级函数对输入数组进行排序是

编辑-2:示例

E = {a,b,c}; A = 'abcab$';(此处为$ =人工终止符号,V {$} = +无穷大)

最优先级函数之一是:V{a}=1,V{b}=2,V{c}=3,它在数组元素之间给出了以下符号:a<b<c>a<b<$,导致4'&lt;'共有5个迹象。

2 个答案:

答案 0 :(得分:3)

如果元素没有优先级,那么这将是微不足道的。只按优先顺序排序。但是你可以有相同的优先级。

我首先按优先级排序字母表。然后我将提取最长的上升子序列。这是你答案的开始。从剩下的内容中提取最长的上升子序列。将其附加到您的答案中。重复提取过程,直到提取完整个字母。

我相信这会给出最佳结果,但我没有试图证明这一点。如果它不是最佳选择,它仍然会很好。

既然我认为我理解了这个问题,我可以告诉你,没有好的算法可以解决它。

为了看到这一点,让我们首先构造一个有向图,其顶点是你的元素,其边指示一个元素紧接另一个元素的次数。您可以通过删除足够的边来获得有向非循环图来创建优先级函数,使用边创建部分有序的集,然后添加顺序关系,直到您有完整的线性顺序,从中您可以轻松获得优先级函数。一旦你弄清楚要掉落的边缘,所有这一切都很简单。相反,给定有向图和最终优先级函数,很容易弄清楚你必须决定放弃哪一组边。

因此,你的问题完全等同于找出你需要从 a 中删除那个有向图以获得指向非循环图的 a 的最小边集。然而正如http://en.wikipedia.org/wiki/Feedback_arc_set所说,这是一个已知的NP难题,称为最小反馈弧集。 开始更新因此,您可以提出的图表不太可能。 结束更新

如果你需要在实践中解决它,我建议采用某种贪心算法。它并不总是正确的,但通常会在合理的时间内给出一些合理的结果。

更新: Moron是正确的,我没有证明NP难。然而,有很好的启发式理由认为问题实际上是NP难的。请参阅评论以获取更多信息。

答案 1 :(得分:3)

最小反馈弧集在有向图上有一个微不足道的减少,其弧可以排列成欧拉路径。我引自http://www14.informatik.tu-muenchen.de/personen/jacob/Publications/JMMN07.pdf

  

据我们所知,   最小反馈的复杂性状态   在这些图中设置的弧是开放的。   然而,通过纽曼的引理,陈,   和Lovász[1,定理4],a   [这个问题]的多项式算法   会导致16/9的近似值   一般最小值的算法   反馈弧设定问题,改进   在目前最知名的O(log n   log log n)算法[2]。

     
      
  1. Newman,A。:最大非循环子图问题和3度图。   在:第四届会议录   国际研讨会   近似算法   组合优化问题,   约。 LNCS(2001)147-158

  2.   
  3. 偶数,G.,NAOR,J.,希伯,B.,苏丹,M:Approximatingminimumfeedbacksets   有向图中的多重切割。在:   第四届国际会议论文集   关于整数规划的讨论   和组合优化。 LNCS   (1995)14-28

  4.