请帮我优化代码以解决codechef问题!

时间:2011-02-11 15:49:29

标签: java optimization

我正在question解决这个codechef!这是一个简单的问题,但我的solution超时了!看来效率不够高!请帮我优化一下。

以下是代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());
        for (int i = 0; i < t; i++) {
            System.out.println((int) (Math.pow(2, (int) ((Math.log(Integer.parseInt(br.readLine()))) / (Math.log(2))))));
        }
    }
} 

问候

shahensha

3 个答案:

答案 0 :(得分:3)

  1. 您可以将log(2)缓存在变量中,而不是在每个周期计算它
  2. 由于您使用的是整数,因此您可以使用Math.log(请参阅docs)计算log2,而不是使用Integer.numberOfLeadingZeros,因为ceil(log2(x)) = 32 - numberOfLeadingZeros(x - 1)
  3. numberOfLeadingZeros应该非常快,因为the source code显示它只是执行一些位操作来执行其工作。

答案 1 :(得分:1)

这是否能找到下一个2的较低功率?除了调用任何日志函数(例如各种位技巧)之外,还有 way 更快的方法。通常在2的补码表示中,正x的2的下一个较低幂与x相同,只有x的最高位设置,而所有其他位为零。 / p>

编辑:既然你已经确认你正在寻找下一个更低的2的功率,那么这是规范的(无分支)位黑客攻击:

/** The largest power of 2 <= x.
    Only valid for positive numbers. */
static int nextLowerPowerOf2(int x) {
    x >>>= 1;
    x |= x >> 1;
    x |= x >> 2;
    x |= x >> 4;
    x |= x >> 8;
    x |= x >> 16;
    x++;
    return x;
}

答案 2 :(得分:0)

这是一场比赛,你会寻求帮助?如果解决方案不是来自你,你怎么能为你感到骄傲?

无论如何,这里有一些提示:

  1. 使用预先计算的值优化循环:Math.log(2)总是给出相同的答案!
  2. 在循环中使用StringBuffer并在循环后只打印一次(以验证它是否可以提高性能)
  3. Math.Pow(2,INT),尝试使用Bitshift而不是Pow:)
  4. [编辑]我之前关于Math.Pow的解决方案是错误的,谢谢Andrea