有没有一种黑盒方法来检测排序算法是否稳定?

17
在JavaScript中(某些情况下也适用于其他语言),如果您不知道代码运行的目标实现,是否有一种方法可以检测底层排序算法(Array.sort的算法)是否稳定,仅知道它遵循规范
我在webkit中找到了2个测试(1) (2),但这些测试有多可靠?(这个检查是否可以使用PCP完成?)我正在寻找一个数学上正确的解决方案。
这是一个棘手的问题,因为更先进的排序算法可以根据源数组的长度(例如Timsort)改变子算法。我一直感到困惑,因为我运行的每个测试都显示Google Chrome的排序是稳定的,但我看到的所有文档都说它是不稳定的(the source会告诉你原因)。
(通常,我使用this strategy来使我的排序稳定;它对性能有一点影响,但有时可能会很明显)
在各种实现中进行排序的源代码:

你只能通过概率来做出这样的判断:例如,我可以定义一个输入为I的排序算法S。通常情况下,S将实际的排序工作分配给某个稳定的排序算法T,但是当I等于某个特殊值I'时,它会使用一个不稳定的排序算法U。除非你碰巧将I'作为输入传递进去,否则你永远无法证明S是不稳定的。更现实的情况是,也许S只有在I非常长的情况下才使用不稳定的排序算法。同样地,只有在测试足够长的输入时,你才能观察到不稳定的排序。 - apsillers
2
如果规范说明它不稳定,并不意味着你可以期望在对数组进行排序时这些项会交换顺序,而是表示你不能依赖它;没有承诺。当前实现恰好是稳定的,并不意味着它将永远如此,或者对Chrome运行的所有平台都是如此。 - frozenkoi
我同意@MarZab的看法,这是一个停机问题。如果你打上[计算机科学]和/或[计算机科学理论]的标签,你可能会得到更多关注。 - apsillers
4个回答

5

除非您可以测试与标准相关的所有可能输入,否则黑盒测试无法确定程序是否满足任何标准.黑盒式测试只能查看输入和输出之间的映射关系(请参见Pentium FDIV bug以获取真实的查找表错误),因此您无法确保测试排除了其他输入触发违规的可能性。


1
数学上讲得通吗?这需要证明算法中的每条路径都是稳定的,以及它们的每种组合。适用于任何可能的数据。
当然,像那样的算法是存在的 - 但它们很可能是为了满足这个要求而制作的。所以如果是这样的话,它很可能在某个地方说过。
至于用于证明这样的测试,这可能涉及到类似于停机问题的问题。

http://en.wikipedia.org/wiki/Halting_problem


不确定是否需要调用停机问题,但应清楚超指数搜索是必要的,以覆盖给定输入大小的所有可能性。 - Steven Lu

1

为什么要冒风险呢?对于大多数合理的数据集,使用JavaScript实现归并排序应该足够快。选择几个进行基准测试并使用最佳的一个。


0

运行一个小的内部测试,以检查稳定性?您可以使用维基百科上“按等级、然后按花色排序”的纸牌示例来检查。

请参见:https://en.wikipedia.org/wiki/Sorting_algorithm#Stability

我不知道需要检查多少张卡片的稳定性——也许是5张左右?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接