在JavaScript(有些适用于其他地方),你不知道你的代码运行的目标实现是什么,有没有一种方法可以检测底层排序算法(Array.sort
)是否稳定,只知道它遵循the specification?
我可以在webkit (1) (2)中找到2个测试,但这些测试有多可靠? (可以使用PCP完成此检查吗?)我正在寻找一种在数学上合理的解决方案。
这是一个棘手的问题,因为更高级的排序算法可以根据源数组的长度(如Timsort)更改子算法。我一直很困惑,因为我所运行的每一项测试都显示Google Chrome的稳定性,但我见过的所有文档都说它不稳定(the source会告诉你原因)。
(通常情况下,我使用this strategy来使我的排序稳定;它有一个很小但有时会显着的性能影响)
各种实现中的排序源代码:答案 0 :(得分:5)
除非您可以测试与该标准相关的所有可能输入,否则黑盒测试不能用于确定程序是否满足任何标准。黑盒子可以自由地只有一个查找表,将输入映射到输出(请参阅Pentium FDIV bug查看真实的查找表错误),这样您就不能确定您的测试是否排除了其他输入触发违规的可能性
答案 1 :(得分:1)
数学上的声音,是吗?这将要求算法中的每个路径都被证明是稳定的 - 以及它们的每个组合。对于任何可能的数据。
确实存在这样的算法 - 但它们最有可能符合这一要求。所以如果是的话,它可能会说它在某个地方。
至于证明这类事情的测试,这可能与停止问题类似。
答案 2 :(得分:1)
为何冒风险?对于大多数合理的数据集,合并排序的javascript实现应该足够快。拿起一对夫妇并对他们进行基准测试并使用最好的一个。
答案 3 :(得分:0)
运行一个小的内部测试,检查?你可以使用维基百科的“排名,然后通过套装”的例子来检查稳定性。
请参阅:https://en.wikipedia.org/wiki/Sorting_algorithm#Stability
我不知道你需要多少张卡来检查稳定性 - 大约5个左右?