【问题标题】:Maximum Value of XOR in a range?范围内异或的最大值?
【发布时间】:2015-06-15 00:31:11
【问题描述】:

给定一个大小为 NxN 的矩阵。行和列的编号从 0 到 N-1。第 i 行的第 j 列包含 i xor j。换句话说, 矩阵[i][j] = i ^ j 哪里 0 ? i,j

虽然我的方法是

(l..r).each do |i|
    (i..r).each do |j|
      if (i ^ j > max)
        max = i ^ j
      end
    end
  end

我看到了这段代码,根据每个人的说法,它不是二次的,而是在线性时间内找到的。

public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        long N;
        long max    = 1L;
        long count  = 1L;
        long bitN   ;
        StringBuilder sb  = new StringBuilder(4*T);


            line = br.readLine();
            N = Long.parseLong(line);
            {

                bitN    = 1L << getBits(N-1);
                max     = (bitN - 1);
                count   = (bitN == N) ? bitN :(N -(bitN>>1))<<1 ;

                sb.append(max);
                sb.append(" ");
                sb.append(count);
                sb.append("\n");
            }

        System.out.println(sb.toString());
    }

    private static int getBits(long x){
        int count = 0;
        while(x > 0){
            x = x>>1;
            count++;
        }
        return count;
    }
} 

我无法理解的是这实际上是怎么回事

bitN    = 1L << getBits(N-1);
max     = (bitN - 1);
count   = (bitN == N) ? bitN :(N -(bitN>>1))<<1 ;

能够得到想要的结果。如果你们中的任何人都可以简单地给我这个算法的基本知识,以便我能理解这个

【问题讨论】:

    标签: java algorithm xor


    【解决方案1】:

    制作Nmaxcount 的表格:

    N   max   count   how
    1     0       1   0^0
    2     1       2   0^1, 1^0
    3     3       2   1^2, 2^1
    4     3       4   1^2, 2^1, 0^3, 3^0
    5     7       2   3^4, 4^3
    6     7       4   3^4, 4^3, 2^5, 5^2
    7     7       6   3^4, 4^3, 2^5, 5^2, 1^6, 6^1
    8     7       8   3^4, 4^3, 2^5, 5^2, 1^6, 6^1, 0^7, 7^0
    9    15       2   7^8, 8^7
    .
    .
    

    模式是,在N 超过 2 的幂之后,max 上升,count 回到 2。这是因为位模式如下所示:

    3 = 0b011
    4 = 0b100
    .
    .
    7 = 0b0111
    8 = 0b1000
    

    bitN 是在0..N-1 中无处设置的最低位(所以bitN = 8N = 8bitN = 16N = 9)。最大异或将bitN以下的所有位都置位,根据小学减法借位的逻辑,即bitN - 1。每次N 增加 1 时,计数就会增加 2,除非 bitN 也增加,当计数重置为 2 时。三元运算符在计算count 的目的是特例N = 1;当N 是 2 的更大幂时,也会采用左分支,但另一个也可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 2022-01-04
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多