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

时间:2013-05-10 01:33:24

标签: javascript sorting computer-science computability

在JavaScript(有些适用于其他地方),你不知道你的代码运行的目标实现是什么,有没有一种方法可以检测底层排序算法(Array.sort)是否稳定,只知道它遵循the specification

我可以在webkit (1) (2)中找到2个测试,但这些测试有多可靠? (可以使用PCP完成此检查吗?)我正在寻找一种在数学上合理的解决方案。

这是一个棘手的问题,因为更高级的排序算法可以根据源数组的长度(如Timsort)更改子算法。我一直很困惑,因为我所运行的每一项测试都显示Google Chrome的稳定性,但我见过的所有文档都说它不稳定(the source会告诉你原因)。

(通常情况下,我使用this strategy来使我的排序稳定;它有一个很小但有时会显着的性能影响)

各种实现中的排序源代码:

4 个答案:

答案 0 :(得分:5)

除非您可以测试与该标准相关的所有可能输入,否则黑盒测试不能用于确定程序是否满足任何标准。黑盒子可以自由地只有一个查找表,将输入映射到输出(请参阅Pentium FDIV bug查看真实的查找表错误),这样您就不能确定您的测试是否排除了其他输入触发违规的可能性

答案 1 :(得分:1)

数学上的声音,是吗?这将要求算法中的每个路径都被证明是稳定的 - 以及它们的每个组合。对于任何可能的数据。

确实存在这样的算法 - 但它们最有可能符合这一要求。所以如果是的话,它可能会说它在某个地方。

至于证明这类事情的测试,这可能与停止问题类似。

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

答案 2 :(得分:1)

为何冒风险?对于大多数合理的数据集,合并排序的javascript实现应该足够快。拿起一对夫妇并对他们进行基准测试并使用最好的一个。

答案 3 :(得分:0)

运行一个小的内部测试,检查?你可以使用维基百科的“排名,然后通过套装”的例子来检查稳定性。

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

我不知道你需要多少张卡来检查稳定性 - 大约5个左右?