我们有一个来自字母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个迹象。
答案 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]。
Newman,A。:最大非循环子图问题和3度图。 在:第四届会议录 国际研讨会 近似算法 组合优化问题, 约。 LNCS(2001)147-158
- 醇>
偶数,G.,NAOR,J.,希伯,B.,苏丹,M:Approximatingminimumfeedbacksets 有向图中的多重切割。在: 第四届国际会议论文集 关于整数规划的讨论 和组合优化。 LNCS (1995)14-28