算法证明 - 从n位数字删除k个数字后构建最小数字

时间:2015-04-10 15:01:48

标签: algorithm proof

  

问题:给定一个n位数字,应该从中删除哪个k(k

解决方案:删除大于或等于其右邻居的第一个数字(从左到右)或最后一个数字,如果我们找不到这样的数字。重复此过程k次。 (请参阅codecareer以供参考。还有其他解决方案,例如geeksforgeeksstackoverflow,但我认为此处描述的解决方案更直观,所以我更喜欢这个。)

现在的问题是,如何证明上述解决方案是正确的,即如何在每一步删除一个数字后使最小数字最小,从而保证最终数字最小。

3 个答案:

答案 0 :(得分:0)

假设k = 1

允许m = Σi=0,...,n aibin+1数字anan-1...a1a0与基数b,即0 ≤ ai < b ∀ 0 ≤ i ≤ n(例如b = 10)。

证明

∃ j > 0 aj > aj-1 jaj最大  这意味着aj是连续数字的(不必严格地)增加序列的最后一位数。  然后,数字m'现已从数字中移除,结果数字m-m'的值为

m' = Σi=0,...,j-1 aibi   +   Σi=j+1,...,n aibi-1

这种减少的目的是最大化差异j。所以我们来看看:

m - m' = Σi=0,...,n aibi - (Σi=0,...,j-1 aibi   +   Σi=j+1,...,n aibi-1)
       = ajbj + Σi=j+1,...,n (aibi - aibi-1)
       = anbn + Σi=j,...,n-1 (ai - ai+1)bi

可以更好地选择an...aj以获得更大的差异吗?

  • 由于ai-ai+1 ≥ 0是一个不断增加的子序列,j' > j成立。因此,选择j而不是i,您会得到更多的零,其中您现在有一个正数,即差异不会更大,但如果存在ai+1 < ai j则会更低}(严格更小)。
  • aj-1-aj < 0应该是最大的,即∄ j > 0。我们知道
    bj-1 > Σi=0,...,j-2(b-1)bi = bi-1-1
    这意味着,如果我们选择`j&#39; &LT; j&#39;,我们得到差异的负面补充,所以它也不会变大。

如果aj > aj-1 j = 0 k = 1上述证据适用于{{1}}。

剩下要做什么了?

这只是您的算法适用于{{1}}的证明。

可以将上述证明扩展到(不必严格地)增加数字的多个子序列。由于您需要的索引数量,它具有完全相同的证据但可读性更低。

也许你也可以使用归纳,因为数字之间没有相互作用(阻塞下一个选择或其他东西)。

答案 1 :(得分:0)

这是一个简单的参数,您的算法适用于任何k。假设第m个位置中的数字小于或等于它的右(第m + 1)个数字邻居,并删除第m个数字但不删除第(m + 1)个数字。然后你可以删除第(m + 1)个数字而不是第m个数字,你会得到一个小于或等于原始答案的答案。

答案 2 :(得分:0)

通知:此证明用于删除k位数字后建立最大值,但思路相似

  

密钥引理:最大(m + 1)位数字包含最大m位   所有m的数字= 0,1,...,n-1

证明:

  • 贪婪解决方案,从某个数字中删除one位数字以获得最大值 结果:只需删除the first digit which next digit is greater than itthe last digit if digits are in non-ascending order。这很容易证明。

我们用矛盾来证明引理。

  1. 假设当m = k时,引理第一次被打破,所以S(k) ⊄ S(k + 1)。请注意,S(k) ⊂ S(n)作为初始编号包含所有次优值,因此必须存在一个xS(k) ⊂ S(x)S(k) ⊄ S(x - 1)
  2. k + 2 <= x <= n
  3. 我们使用上面的贪婪解决方案从S(x)中仅删除一位数字S[X][y]以获得S(x-1),因此S[X][y] ∈ S(x)S[X][y] ∉ S(x - 1)以及{{1} }必须包含它。 S(k)
  

根据我们的贪婪解决方案,从开始到S [X] [y]的所有数字均为   以非升序排列。

  1. 如果We now use contradiction to prove that S(k) does not need to contain this digit .,那么S[X][y] is at the tail --->矛盾!
  2. 否则,我们首先知道S(k) can be the first k digits of S(x)中的所有数字。如果存在S[X][1, 2,..., y] are in S[k] S(k)S[X][z] is not in,那么我们可以将, 1 <= z <= y - 1S(k)范围内的S[X][z + 1, y]的数字进行移位以得到更大或相等的数字S(k)。因此,至少有left one unit2after S[X][y]的{​​{1}}。然后,我们可以跟随not in S(k)到S [X] [y],但是我们x >= k + 2使用prefix of S(k),我们使用notS[X][y] ------->矛盾!

因此,我们证明了引理。如果我们有S[X][y + 1],并且知道As S[X][y + 1] > S[X][y], we can build a greater S(k),则S(m + 1)必须是S(m + 1) contains S(m)中的S(m)