【问题标题】:Is there a black box method to detect if a sorting algorithm is stable?是否有黑盒方法来检测排序算法是否稳定?
【发布时间】:2013-05-04 15:22:57
【问题描述】:

在 JavaScript(在其他地方有些适用)中,您不知道您的代码在哪个目标实现上运行,有没有办法检测底层排序算法(Array.sort)是否稳定,知道只是它遵循the specification

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

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

(通常,我使用this strategy 使我的排序稳定;它对性能的影响很小但有时很明显)

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

【问题讨论】:

  • 你只能以概率的方式做出这样的决定:例如,我可以定义一个排序算法S,它接受输入I。通常,S 将实际排序工作分配给一些稳定的排序算法 T但是I 等于某个特殊值 I' 时,它使用非稳定排序 U .你永远无法证明S 是不稳定的,除非你运气好并且碰巧通过I' 作为输入。更现实地说,也许S 使用稳定排序,除非I 很长。同样,如果您在适当长的输入上进行测试,您只会观察到不稳定的排序。
  • 如果规范说它不稳定,这并不意味着当你对数组进行排序时你可以期望项目交换顺序,而是你不能依赖它;没有任何承诺。 (当前)实现恰好是稳定的并不意味着它将永远稳定,或者对于 chrome 运行的所有平台。
  • 我同意@MarZab 的观点,即这是一个停止问题。如果您将其标记为[computer-science] 和/或[computer-science-theory],您可能会看到更多关注。

标签: javascript sorting computer-science computability


【解决方案1】:

运行一个小型内部测试,检查?您可以使用 Wikipedia 中的“按等级,然后按花色的扑克牌”示例来检查稳定性。

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

我不知道你需要多少张卡来检查稳定性——可能是 5 张左右?

【讨论】:

    【解决方案2】:

    数学上是正确的,是吗?这将要求算法中的每条路径都被证明是稳定的——以及它们的每一种组合。对于任何可能的数据。

    确实存在这样的算法 - 但它们很可能是为了满足该要求而设计的。所以如果是,它可能会说它在某个地方。

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

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

    【讨论】:

    • 不确定是否有必要调用停止问题,但应该清楚的是,超指数搜索对于覆盖给定输入大小的所有可能性是必要的
    【解决方案3】:

    除非您可以测试与该标准相关的所有可能输入,否则不能使用黑盒测试来确定程序是否满足任何标准。黑盒子可以简单地拥有一个将输入映射到输出的查找表(请参阅Pentium FDIV bug 了解真实世界的查找表错误),因此您无法确定您的测试是否排除了其他一些输入触发违规的可能性。

    【讨论】:

      【解决方案4】:

      为什么要冒险?对于大多数合理的数据集,合并排序的 javascript 实现应该足够快。挑选一对并对其进行基准测试并使用最好的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-21
        • 2020-01-26
        • 2010-09-13
        • 2012-05-16
        • 2016-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多