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

标签 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} , 是最大值。

Edit-1:请仔细阅读。我得到了一个数组 ai任务是产生一个函数 V .它不是关于使用优先级函数对输入数组进行排序。

Edit-2:例子

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

最佳优先级函数之一是:V{a}=1,V{b}=2,V{c}=3 ,它为我们提供了数组元素之间的以下符号:a<b<c>a<b<$ ,导致总共 5 个符号中有 4 个“<”符号。

最佳答案

如果元素不能绑定(bind)优先级,这将是微不足道的。只需按优先级排序。但你们可以有同等的优先权。

我会先按优先级对字母表进行排序。然后我会提取最长的上升子序列。那是你的答案的开始。从剩下的部分中提取最长的上升序列。将其附加到您的答案中。重复提取过程,直到提取出整个字母表。

我相信这会给出最佳结果,但我还没有尝试证明这一点。如果它不是完美的最优,它仍然会很好。

现在我想我理解了这个问题,我可以告诉你,没有好的算法可以解决它。

要了解这一点,让我们首先构造一个有向图,其顶点是您的元素,其边表示一个元素紧接在另一个元素之前的次数。您可以通过删除足够多的边以获得有向无环图来创建优先级函数,使用边创建部分有序集,然后添加顺序关系直到您拥有完整的线性顺序,您可以从中轻松获得优先级函数。一旦您确定了要丢弃的边,所有这些都非常简单。相反,鉴于该有向图和您的最终优先级函数,很容易找出您必须决定删除哪一组边。

因此,您的问题完全等同于找出您需要从a有向图中删除以获得a有向无环图的最小边集。然而作为http://en.wikipedia.org/wiki/Feedback_arc_set说,这是一个已知的 NP 难题,称为最小反馈弧集。 开始更新 因此,对于您可以想出的图形,不太可能有好的算法。 结束更新

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

更新:白痴是对的,我没有证明 NP-hard。然而,有充分的启发式理由相信该问题实际上是 NP-hard 问题。查看评论了解更多信息。

关于algorithm - 找到优先级函数/字母顺序的极值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4959719/

相关文章:

python - 使用数字加密文本

c - 来自矩阵分解的不可预测的浮点错误

matlab - 如何旋转 3D 平面?

function - 为什么没有类似于atan2()的asin2()和acos2()函数?

Java - 检查 4 个点(形成一个矩形) "collides"是否与另外 4 个点

algorithm - 是否存在广度优先搜索不会终止的情况?

c - 单链表中的快速排序

algorithm - 如何在图或人工神经网络中引导信息流?

java - 如何使用/修改 Knuth-Morris-Pratt 算法将任何给定字符串转换为回文

java - 不同圆上两点之间的最大和最小距离是多少?