众所周知algorithmic problem,给出了一系列数字,例如$ which python2
/usr/bin/python2
$ which python2.7
/usr/bin/python2.7
$ which python3
/usr/bin/python3
$ which python3.4
/usr/bin/python3.4
以这样的方式排列数字,以便形成最大数量,在这种情况下为[1, 20, 3, 14]
。
SO和其他网站上有很多解决方案,使用以下算法:
320141
它确实有效,但我找不到这种算法的正式证明。 quora有一个答案,但我不会称之为正式证据。
有没有人可以给我一份证明草图或参考一些书或文章?如何从原始问题中获得此解决方案?
PS我试图解决原始问题,但我的解决方案是错误的,我无法做到正确,现在我无法完全理解解决方案。
答案 0 :(得分:2)
这是算法的草图。对于您的列表:
[1, 20, 3, 14]
考虑如何找到最大的连接数。
对于最重要的数字,选择具有最大初始数字的数字。 (在示例中,选择3然后选择20.因此答案从320开始。)
其余数字1和14以相同的初始数字(即1)开头。接下来选哪个?这就是算法的核心,即compare
函数。它将构建数字并比较哪个数字在词法上更大,即114与141. return
语句中的负号将确保更大的数字首先出现。所以答案是320141.
(算法实际上并没有比较初始数字,而是将字符串从词法大小排序到最小。)
答案 1 :(得分:2)
关于符号:我将使用管道来分隔数字,以便它们如此 更容易看到数字序列和结果数 同一时间:3 | 20 | 14 | 1
让我们暂时假设关系 - 让我们称之为 R
由<=
运算符表示 - 由比较定义
功能是一个总订单。它由表达式
-(a+b).compareTo(b+a)
直观地说,如果我们有两个数字 a 和 b 和 b | a 是 大于 a | b , b 应该获得比 a 更高的等级,即它应该 在解决方案中出现 a 。如果 a | b 大于 b | a ,那么它是另一种方式 回合。如果 a | b = b | a ,订单无关紧要。
需要注意的一点是,这种关系不仅会影响两个人 数字 a 和 b 被孤立地考虑,但也告诉我们一些事情 关于这两个数字嵌入的结果数字:
如果 a&lt; = b ,那么 x | a | b | y &lt; = x | b | a | y 强>
x 且 y 为数字 任意长度。换句话说:如果我们有一系列数字 然后我们用 a&lt; = b 交换两个相邻的数字 a 和 b ,结果 之后数字会大于或等于。
示例: 3 | 14 | 20 | 1&lt; = 3 | 20 | 14 | 1 因为 14 <= 20
我们现在可以假设解决方案不是那个解决方案 我们的关系 R 暗示了一个矛盾:让我们假设 解决方案是一些不符合 R 的特定序列。由于 R 是一个 总订单,我们可以通过交换重新排列数字以匹配 R 相邻元素,直到顺序符合 R 。这种重新排序可以 与气泡排序相比。但是,在每次交换操作中 引导我们进入新订单,结果数量增加!这是 显然是一个矛盾,所以原来的秩序不可能了 溶液
剩下要显示的是 R 是一个总订单,即它是 传递性,反对称性和总体性。因为你要求草图 证明,我将省略这一部分。必不可少的部分是证明 传递性,即
a&lt; = b 和 b&lt; = c 暗示 a&lt; = c 。