Javascript 是否有黑盒方法来检测排序算法是否稳定?
在JavaScript(有些地方适用)中,如果您不知道代码在哪个目标实现上运行,是否有一种方法可以检测底层排序算法(数组.sort的Javascript 是否有黑盒方法来检测排序算法是否稳定?,javascript,sorting,computer-science,computability,Javascript,Sorting,Computer Science,Computability,在JavaScript(有些地方适用)中,如果您不知道代码在哪个目标实现上运行,是否有一种方法可以检测底层排序算法(数组.sort的Array.sort)是否稳定,只知道它是否稳定 我可以在webkit中找到两个测试,但这些测试的可靠性如何?(这个检查可以用a来完成吗?)我正在寻找一个数学上合理的解决方案 这是一个棘手的问题,因为更高级的排序算法可以根据源数组的长度(如Timsort)更改子算法。我一直很困惑,因为我运行的每个测试都显示Google Chrome是稳定的,但我看到的所有文档都说它
Array.sort
)是否稳定,只知道它是否稳定
我可以在webkit中找到两个测试,但这些测试的可靠性如何?(这个检查可以用a来完成吗?)我正在寻找一个数学上合理的解决方案
这是一个棘手的问题,因为更高级的排序算法可以根据源数组的长度(如Timsort)更改子算法。我一直很困惑,因为我运行的每个测试都显示Google Chrome是稳定的,但我看到的所有文档都说它不稳定(会告诉你原因)
(通常,我会使排序保持稳定;它对性能的影响很小,但有时会明显)
用于在各种实现中进行排序的源代码:
- 运行一个小的内部测试,以检查?你可以使用维基百科中的“按等级,然后按套装”的例子来检查稳定性
见:
我不知道你需要多少张卡来检查稳定性——大概5张左右?从数学上讲,是吗?这需要证明算法中的每一条路径都是稳定的——以及它们的每一个组合。任何可能的数据 确实存在这样的算法——但它们很可能就是为了满足这一要求而设计的。所以如果是,它可能会说它在某个地方 至于证明类似情况的测试,这可能属于类似的问题,即停止问题
黑盒测试不能用于确定程序是否满足任何标准,除非您可以测试与该标准相关的所有可能输入。一个黑匣子可以简单地拥有一个将输入映射到输出的查找表(请参阅了解真实世界的查找表错误),因此您无法确定您的测试是否排除了某些其他输入触发冲突的可能性。为什么要冒险?对于最合理的数据集,合并排序的javascript实现应该足够快。挑选一对并对其进行基准测试,然后使用最好的一个。您只能根据概率进行这样的确定:例如,我可以定义一个排序算法
S
,它接受输入I
。通常,S
将实际的排序工作分配给某个稳定的排序算法mT
,但当I
等于某个特殊值I'
时,它会使用非稳定排序U
。除非你运气好并且碰巧通过了I'
作为输入,否则你永远不会证明S
是不稳定的。更现实地说,S
可能使用稳定排序,除非I
非常长。同样,如果对适当长的输入进行测试,则只会观察到不稳定的排序。如果规范说它不稳定,这并不意味着在对数组进行排序时可以期望项目交换顺序,而是不能依赖它;没有承诺。(当前)的实现碰巧是稳定的,这并不意味着它将永远是稳定的,也不意味着chrome运行的所有平台都是稳定的。我同意@MarZab的观点,这是一个停滞不前的问题。如果您将其标记为[计算机科学]
和/或[计算机科学理论]
,您可能会看到更多的关注。不确定是否需要调用停止问题,但应该清楚的是,超指数搜索对于覆盖给定输入大小的所有可能性是必要的