排列数字以形成最大数量 - 算法证明

时间:2016-01-05 18:11:29

标签: algorithm proof

众所周知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我试图解决原始问题,但我的解决方案是错误的,我无法做到正确,现在我无法完全理解解决方案。

2 个答案:

答案 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