如何证明“安排给定数字形成最大数字”算法的正确性?

时间:2017-01-23 05:38:20

标签: algorithm sorting

Arrange given numbers to form the biggest number给出算法。 它使用以下文本来证明算法的正确性:

  

那我们该如何去做呢?这个想法是使用任何基于比较的排序算法。在使用的排序算法中,不是使用默认比较,而是编写比较函数myCompare()并使用它来对数字进行排序。给定两个数字X和Y,myCompare()应该如何决定首先放入哪个数字 - 我们比较两个数字XY(Y末尾附加的Y)和YX(Y末尾附加的X)。如果XY较大,则X应该在输出Y之前,否则Y应该在之前。例如,让X和Y为542和60.为了比较X和Y,我们比较54260和60542.由于60542大于54260,我们将Y放在首位。

考虑三个数字:XYZ。使用X -> Y表示X应该出现在Y之前。基于比较的算法可以使用以下两个比较来将XYZ分类为XYZXY >= YX => X -> YYZ >= ZY => Y -> Z。但是这两个比较不一定确保XYZ是最大的数字。换句话说,X应该在YY之前出现Z之前的事实并不一定能确保XYZ形成最大数字。以YZX为例。为了证明XYZ >= YZX,我们需要证明X(YZ) >= (YZ)XX作为一个整体之前应该YZ得到一个更大的数字。

任何人都可以提供算法正确性的正式证明吗?

1 个答案:

答案 0 :(得分:1)

首先我们将证明如果X"<" Y和Y"<" Z然后X"<" Z.假设它们分别有p,q和r数字,前两个关系减少到

  • X * 10 ^ q +Y≥Y* 10 ^ p +X⇒X*(10 ^ q - 1)≥Y*(10 ^ p - 1)
  • Y * 10 ^ r +Z≥Z* 10 ^ q +Y⇒Y*(10 ^ r - 1)≥Z*(10 ^ q - 1)

我们要证明

  • X * 10 ^ r +Z≥Z* 10 ^ p + X相当于X *(10 ^ r - 1)≥Z*(10 ^ p - 1)

但这可以通过将前两个不等式相乘并取消常用术语来证明。

现在我们已经证明关系是可传递的(因此可以用来定义排序顺序),很容易证明它可以解决问题。

假设给出的数字是A,B,C ......这样A"<" B"<" C"<" d ...。我们将证明A必须在最终数字中排在第一位。如果没有,我们有一个字符串,如(某些前缀)XA(某些后缀)作为最终数字。很容易,(某些前缀)AX(某些后缀)是一个更大的数字,因为A"<"由于传递性,X为所有X.继续以这种方式向左气泡直到它成为第一个元素。

现在我们已经修复了第一个元素,同样的参数可以应用于B等等,以表明最佳解决方案是ABCD ......