java - 如何减少这个程序的执行时间

标签 java performance algorithm loops

<分区>

int n, k;
int count = 0, diff;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input;
input = br.readLine().split(" ");
n = Integer.parseInt(input[0]);
int[] a = new int[n];
k = Integer.parseInt(input[1]);
input = br.readLine().split(" ");
for (int i = 0; i < n; i++) {
  a[i] = Integer.parseInt(input[i]);
     for (int j = 0; j < i; j++) {
        diff = a[j] - a[i];
        if (diff == k || -diff == k) {
           count++;
        }
     }
}
System.out.print(count);

这是一个示例程序,我在其中打印特定的差异计数,其中 n 范围 <=100000 现在的问题是减少这个程序的执行。我怎样才能更好地减少运行时间。

提前感谢您的建议

最佳答案

从文件中读取数字并将它们放入 Map 中(数字作为键,它们的频率作为值)。迭代它们一次,并为每个数字检查 map 是否包含添加了 k 的那个数字。如果是这样,请增加您的计数器。如果您使用 HashMap,那么它是 O(n),而不是您的算法的 O(n^2)

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int k = Integer.parseInt(br.readLine().split(" ")[1]);
Map<Integer, Integer> readNumbers = new HashMap<Integer, Integer>();

for (String aNumber : br.readLine().split(" ")) {
    Integer num = Integer.parseInt(aNumber);
    Integer freq = readNumbers.get(num);
    readNumbers.put(num, freq == null ? 1 : freq + 1);
}

int count = 0;
for (Integer aNumber : readNumbers.keySet()) {
    int freq = readNumbers.get(aNumber);
    if (k == 0) {
        count += freq * (freq - 1) / 2;
    } else if (readNumbers.containsKey(aNumber + k)) {
        count += freq * readNumbers.get(aNumber + k);
    }
}
System.out.print(count);

EDIT 修复了重复项和 k = 0

关于java - 如何减少这个程序的执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8443935/

相关文章:

java - 在调用调用代理以聚合来自多个端点的数据的方法时,我可以使用什么模式来部分成功?

java - 如何使用 Eclipse 来显示 Main?

java - Spring 启动 hibernate 配置

python - 任何人都知道 Python 中的一个伟大的稀疏一维数组库?

algorithm - 射线-胶囊相交

java - 如何从 shell 脚本调用 Java 程序,而不让 shell 脚本等待程序完成执行?

java - AnyLogic:提高网络模型的计算性能

java - java集合中元素比较的性能

java - 是否有一种算法可以删除某些与另一个相同的元素?

algorithm - mergesort 是 O(n) 的归纳证明有什么问题?