在Ruby中xor 2整数的最快方法是什么?

时间:2016-10-13 14:51:33

标签: ruby algorithm performance xor

给定n个元素的数组a,我应该将a[i]替换为a[i] XOR a[i+1],将a[n-1]的值替换为a[n-1] XOR a[0] m次。 m的值可以达到10 ^ 18。什么是最快最好的方法?

n, m = gets.chomp.split(" ").map &:to_i
arr = gets.chomp.split(" ")
m -= 1
m.times do
  brr = arr.dup
  i = 0.to_i
  for i in 0..n-2
    brr[i] = (arr[i].to_i ^ arr[i+1].to_i)
  end
  brr[n-1] = (arr[n-1].to_i ^ arr[0].to_i)
  arr = brr.dup
  p arr
  puts ""
end

除了^运算符之外,还有更快的方法来计算XOR值吗?

1 个答案:

答案 0 :(得分:2)

不再考虑特定数字,并考虑^的基本数学规则:

  1. x ^ x = 0。
  2. x ^ 0 = x。
  3. ^是关联的和可交换的,例如:

    (x 1 ^ x 2 )^(x 3 ^ x 2 )= x 1 ^(x 2 ^ x 2 )^ x 3 = x 1 ^ 0 ^ x 3 = x 1 ^ x 3

  4. 根据x i 而不是实际的特定数字写出一个小数组(n = 3或4),并通过算法的几(m)次迭代应用这些规则。您将看到m> 1的重复模式出现。 Ñ

    附录

    一旦你看到这个模式,Ruby的Array#rotate可能会让你非常方便(并提供一个非常快速的解决方案)。