最小交换以创建1和0的交替二进制字符串

时间:2017-08-19 21:45:41

标签: binary swap

给定一个二进制字符串,即它只包含0和1(零的数量等于1的数量)我们需要通过交换某些位使这个字符串成为一系列备用字符,我们的目标是尽量减少交换次数。

例如,对于字符串“00011011”,最小交换次数为2,其中一种方法是:

1)交换位:0001 10 11 --->> 0001的 01 11

2)交换位(在第一次交换之后):0 0 0101 1 1 --->> 0 1 0101 0 1

请注意,如果给出字符串“00101011”,我们可以将其转换为以0开头的备用字符串(需要3次交换),也可以转换为以1开头的备用字符串(需要一次交换 - 第一次和最后一次交换)位) 因此,在这种情况下,最小值是一次交换。

最终目标是返回给定1和0字符串的最小交换次数。 解决问题的最有效方法是什么?

1 个答案:

答案 0 :(得分:0)

琐碎的事情是微不足道的。

  1. xor您的序列010101010…。注意:如果序列已经"正确",您将获得全部 - 0比特流(如果您不关心是否从头开始,也可以使用01)。 XOR在现代CPU上非常有效。我可以做512 bits at a time on my Xeon,我认为需要2个周期。
  2. 计算那些(#ones)。在现代x87和许多其他ISA上,POPCNT指令使其非常高效。在我的CPU上一次吞吐一个64位。
  3. 必要的交换是#ones / 2(显而易见),或#zeros / 2,以较少者为准。
  4. 注意:Code published on this site is CC-by-SA。这意味着,当您在软件,家庭作业,考试或作业中使用此答案时,法律要求您说明此答案的网址和用户名。