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放在首位。
考虑三个数字:X
,Y
和Z
。使用X -> Y
表示X
应该出现在Y
之前。基于比较的算法可以使用以下两个比较来将X
,Y
和Z
分类为XYZ
:XY >= YX
=> X -> Y
和YZ >= ZY
=> Y -> Z
。但是这两个比较不一定确保XYZ
是最大的数字。换句话说,X
应该在Y
和Y
之前出现Z
之前的事实并不一定能确保XYZ
形成最大数字。以YZX
为例。为了证明XYZ >= YZX
,我们需要证明X(YZ) >= (YZ)X
在X
作为一个整体之前应该YZ
得到一个更大的数字。
任何人都可以提供算法正确性的正式证明吗?
答案 0 :(得分:1)
首先我们将证明如果X"<" Y和Y"<" Z然后X"<" Z.假设它们分别有p,q和r数字,前两个关系减少到
我们要证明
但这可以通过将前两个不等式相乘并取消常用术语来证明。
现在我们已经证明关系是可传递的(因此可以用来定义排序顺序),很容易证明它可以解决问题。
假设给出的数字是A,B,C ......这样A"<" B"<" C"<" d ...。我们将证明A必须在最终数字中排在第一位。如果没有,我们有一个字符串,如(某些前缀)XA(某些后缀)作为最终数字。很容易,(某些前缀)AX(某些后缀)是一个更大的数字,因为A"<"由于传递性,X为所有X.继续以这种方式向左气泡直到它成为第一个元素。
现在我们已经修复了第一个元素,同样的参数可以应用于B等等,以表明最佳解决方案是ABCD ......