【问题标题】:arrange numbers to form largest number - proof of algorithm排列数字以形成最大数 - 算法证明
【发布时间】:2016-01-05 18:11:29
【问题描述】:

有众所周知的algorithmic problem,给定数字数组,例如[1, 20, 3, 14] 以这样一种方式排列数字,使它们尽可能形成最大的数字,在这种情况下为 320141

在 SO 和其他网站上有很多解决方案,使用以下算法:

String[] strs = new String[nums.length];
for(int i=0; i<nums.length; i++){
    strs[i] = String.valueOf(nums[i]);
}

Arrays.sort(strs, new Comparator<String>(){
    public int compare(String s1, String s2){
        String leftRight = s1+s2;
        String rightLeft = s2+s1;
        return -leftRight.compareTo(rightLeft);

    }
});

StringBuilder sb = new StringBuilder();
for(String s: strs){
    sb.append(s);
}

return sb.toString();

它确实有效,但我找不到该算法的正式证明。 quora 有一个答案,但我不会称之为正式证明。

谁能给我一个证明草图或参考一些书或文章?如何从最初的问题中得到这个解决方案?

PS 我试图解决最初的问题,但我的解决方案是错误的,我无法正确解决,现在我无法完全理解解决方案。

【问题讨论】:

  • quora 上的答案对我来说似乎很正式,尽管实际上只是一个草图。你还想要什么?
  • cobarzan 我尝试遵循 quora proof 但无法获得一些步骤,也许我需要更正式的或小步骤的东西。

标签: algorithm proof


【解决方案1】:

关于符号:我将使用管道来分隔数字,所以它是 更容易在 同时:3|20|14|1

让我们暂时假设这个关系——我们称之为R&lt;= 运算符表示——由比较定义 函数是一个总订单。由表达式决定

-(a+b).compareTo(b+a)

直观地说,如果我们有两个数字 ab 并且 b|a 是 大于 a|bb 应该获得比 a 更高的排名,即它应该 在解决方案中出现在 a 的左侧。如果 a|b 大于 b|a,则相反 圆形的。如果 a|b = b|a,则顺序无关紧要。

需要注意的重要一点是,这种关系不仅影响两个 数字 ab 被单独考虑,但也告诉我们一些事情 关于两个数字嵌入的结果数字:

如果 a,那么 x|a|b|y x|b|a|y

其中 xy 是数字 任意长度。换句话说:如果我们有一个数字序列 我们用 a 交换两个相邻的数字 ab,结果 之后数字将大于或等于。

示例:3|14|20|1 因为 14

我们现在可以假设解决方案不是唯一的 我们的关系 R 暗示了一个矛盾:让我们假设 解决方案是一些不符合R的特定序列。因为 R 是 总顺序,我们可以通过交换重新排列数字以匹配 R 相邻元素,直到顺序符合R。这种重新排序可以 与冒泡排序相比。但是,在每个交换操作中 引导我们到新订单,结果数量增加!这是 显然是矛盾的,所以原来的顺序不能是 解决方案。

剩下要显示的是 R 是一个全序,即它是 传递的、反对称的和完全的。既然你要了一张草图 证明,我将省略这部分。最重要的部分是证明 传递性,即那个

a 和 b 暗示 a 。

【讨论】:

  • 谢谢,简单易懂的证明,我就是想要这样的东西!
【解决方案2】:

这是算法的草图。对于您给定的列表:

[1, 20, 3, 14]

想一想如何找到最大的级联数。

对于最重要的数字,选择具有最大初始数字的数字。 (在示例中,选择 3,然后选择 20。因此答案以 320 开头。)

其余数字 1 和 14 以相同的初始数字(即 1)开头。下一步该选哪个?这就是算法的核心compare 函数发挥作用的地方。它将构建数字并比较哪个数字更大,即 114 与 141。return 语句上的负号将确保较大的数字先出现。所以答案是 320141。

(该算法实际上并不比较初始数字,而是将字符串从词汇上最大到最小排序。)

【讨论】:

  • rajah9 我要求提供算法的证明,而不是解释它是如何工作的
  • 抱歉,我在回复您的“无法完全理解解决方案”。
猜你喜欢
  • 2017-06-07
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多