【问题标题】:Java want to improve a code snipJava 想改进一个代码片段
【发布时间】:2014-09-22 23:27:09
【问题描述】:

我希望改进这段代码:

for (int i = 0; i < a.length(); i++) {
    for (int j = 0; j < b.length(); j++) {
        if (arrayA[i] == arrayB[j]) {
            arrayA[i] = ' ';
            arrayB[j] = ' ';
        }
    }
}

昂贵的操作是

arrayA[i] = ' ';
arrayB[j] = ' ';

如果我注释掉代码从 180 毫秒到 12 毫秒...

需要类似的东西,以便我可以计算空数组。

【问题讨论】:

  • 如果你注释掉这两行,编译器可能会注意到你的循环没有做任何事情并且正在完全优化它们。我怀疑时间结果是否反映了这两条线路的成本。 arrayAarrayB 最初包含什么?
  • 注释掉一行,它的表现如何?这将允许您从理论上确定仅一组操作的成本。两个集合操作将是差乘以 2。
  • @Compass - 除非注释掉一行会影响 if 语句正文的输入频率。
  • @TedHopp 啊,你把我带到了那里。虽然在我的脑海中运行它,但它似乎并没有这样做。在找到 A[i] 之前它似乎是单遍的,然后就不需要再找到了。
  • 这段代码的目的是什么?你用它得到正确的结果吗?

标签: java arrays string performance char


【解决方案1】:

只要满足if 条件,您就可以通过打破内部循环来改进这一点。您还可以在外循环内使用临时变量来提高性能,以避免在内循环内不断对arrayA 进行下标:

for (int i = 0; i < a.length(); i++) {
    char ch = arrayA[i];
    for (int j = 0; j < b.length(); j++) {
        if (ch == arrayB[j]) {
            ch = ' ' = arrayB[j] = ' ';
            break;
        }
    }
    arrayA[i] = ch;
}

可以安全地跳出内循环的原因是,一旦将ch(或原始代码中的arrayA[i])设置为' ',然后在内循环的后续传递中,@987654327 @test 只有当arrayB[j] 已经是' ' 时才会成功,因此分配将保持值不变(并且只是消耗cpu 周期)。

【讨论】:

  • 您是否仍然获得与以前相同的输出,或者您只是更改了相同元素的第一次出现然后跳出内部循环。
  • @Juniar - IF 原始 arrayB 值不包含任何 ' ' 字符,那么这将获得相同的输出。 (至少我是这么认为的——这还没有经过测试。)如果他们这样做了,那么需要删除 break; 语句以获得相同的输出。即使没有break;,在外循环中使用局部变量仍然可以加快一些速度。
  • @Juniar - 进一步思考,一旦if 测试成功,就应该总是跳出内部循环。我在编辑我的答案时解释了原因。
  • 假设我们有一个这样的字符数组;数组A ={'A', 'K', 'N', 'Y'};与 arrayB ={'A', 'J', 'S', 'A', 'P', 'A', 'N', 'N', 'A'};那么您将获得不同的输出,您只能更改第一次出现的字符“A”。
  • @Juniar - 在 OP 的原始代码中,一旦 arrayA[i] == arrayB[j]arrayA[i] 将设置为 ' ',因此它不会匹配 arrayB 的任何其他元素(除非他们也是' ')。
猜你喜欢
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多