【问题标题】:Make maximum 1's by flipping k bits at a time通过一次翻转 k 位来获得最大 1
【发布时间】:2019-06-13 11:04:29
【问题描述】:

给定一个 n 位向量和一个整数 k,1

  • 准确选择k位(不一定是连续的)并翻转它们的状态(0到1、1到0);

经过分析,我得出结论,如果n > k,我们也可以同时翻转任意两位。例如对于 n = 5,k = 4。我们可以做这样的事情来只翻转最后两位。

  • xxxx_
  • xxx_x

'x'表示我们在那个位置翻转位。

但我不知道在那之后如何进行,我无法进行更多观察。那么,正确的方法是什么?你可以假设一个 n^2 算法是可行的。

【问题讨论】:

  • 如果 n-k 很小,那么简单的 O(n^k) 方法可能足够快,
  • @MrSmith42 遗憾的是,不能保证 n - k 足够小。尽管如此,你能分享幼稚的解决方案吗?我无法想象任何蛮力。
  • This question 应该会给你一个好的开始。

标签: algorithm mathematical-optimization bit bitstring


【解决方案1】:

翻转零直到零的数量低于k。设 m 为零的个数。

翻转 k - m/2 个 1 和 m/2 个 0(整数除法)。现在你有 m + (k-m/2) - m/2 = m + k - m/2 - m/2 ~ k 个零。 (整数除法的近似 b/c)。

最后,翻转所有的零和尽可能多的零,以获得总共 k 次翻转。根据 m 的奇偶性,这将是全 1 或关闭。

【讨论】:

    【解决方案2】:

    戴夫的方法似乎是正确的。我将在此处发布问题后分享我的想法。

    让零的数量为z,现在说服自己,如果k < n,我们可以通过使用问题中提到的k-bit操作的组合来翻转任意两位(一对)。这里有一个参数可以帮助您满足这一事实,选择您想要翻转的对以外的任何k - 1 位;然后从一对中选择一个位以及我们刚刚选择的k - 1,应用该操作;然后从该对中选择另一个位以及我们之前选择的相同k - 1 位,再次应用该操作。如果k < nn 至少为k + 1,我们保证能找到这些k - 1 辅助位。

    那么自然会出现两种情况:

    • k == n :显然我们只能全部翻转或不翻转。所以答案是max(n - z, z)
    • k < n :在这种情况下,我们可以翻转任何 k 位,或者我们可以翻转任意 2 位(使用上面的参数)。现在,如果z < k,我们只能使用2位翻转,如果z是奇数,我们还剩下一位为0,答案是n - 1;如果z 是偶数,我们将它们全部翻转为1,所以答案是n。现在当z >= k 时,我们可以同时使用k 位翻转和2 位翻转,声称如果z 是奇数而k 是偶数,我们就剩下一个0(答案是n - 1)否则我们总是可以将所有的 0 变为 1(答案是 n)。

    最后一个说法的解释:如果我们可以同时使用 k 位翻转和 2 位翻转,而 z 恰好是奇数,我们尝试使用一个 k 位翻转来改变剩余 0 的奇偶校验(z - k 的奇偶校验)。我们只能在 k 为奇数的情况下这样做,否则我们不能这样做,并且对奇数个零使用 2 位运算将使我们得到一个零。所以,简而言之,如果 k 与奇数 z 是偶数,我们将得到一个 0,否则我们得到全 1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 2018-11-16
      • 1970-01-01
      • 2021-10-03
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多