【问题标题】:How to find a better algorithm taking less Execution Time?如何找到一个执行时间更少的更好的算法?
【发布时间】:2021-12-25 10:26:27
【问题描述】:
#include <iostream>
using namespace std;
     
int main() {
    int n;
    cin>>n;
    int *arr=new int [n];
    for(int k=0;n>k;k++)
    {
        cin>>*(arr+k);
    }
    long long sum1=0,sum2=0,sum3=0;
    for(int k=0;n>k;k++)
    {
        sum1=sum1+*(arr+k);
        if(*(arr+k)%2==0)
        sum2++;
        else 
        sum3++;
    }
    cout<<sum1<<" ";
    cout<<sum3<<" ";
    cout<<sum2;
     
    return 0;
}

给你一个 N 个整数的序列,你的任务是分别打印它们的总和、奇数个数和偶数个数。

输入
输入的第一行包含一个整数 N (1≤N≤10⁵)。

输入的第二行包含 N 个由单个空格分隔的整数 (1≤Ai≤10⁵)。

输出
分别打印它们的总和、奇数个数和偶数个数,用空格隔开。

示例
输入
5
1 2 3 4 5

输出
15 3 2

这段代码有更好的算法吗?我需要它来减少执行时间。
我在哪里可以找到任何代码的更好算法?

【问题讨论】:

  • 这段代码中不需要任何中间数组。对读取的每个数字保持运行记录,并为刚刚读取的值的奇数/偶数状态分别增加一对运行计数器。简而言之,第二个循环中的所有内容都可以在第一个循环中完成,并且可以完全丢弃数组本身。
  • golden_hacker,循环中不需要 3 个总和。在循环中增加 2 个和并计算循环后的第三个。
  • 当 arr[k] 可读性更强时,为什么还要使用 *(arr+k)?
  • “n>k”同样奇怪。
  • 你对性能有什么实际问题吗?

标签: c++ algorithm memory time


【解决方案1】:

实际上,C++ 默认将cin/cout 与 C 的 I/O 方式同步 - printf/scanf,这会大大降低 I/O。

切换到printf/scanf 或在main 开头添加ios::sync_with_stdio(0); 之类的内容应该会加快速度。

【讨论】:

    【解决方案2】:

    除非您需要重新使用已存储在数组中的N 整数,否则存储它们是没有意义的。您可以在输入时得到总和以及奇数/偶数的个数。

    此外,您不需要long long,因为输入永远不会变得那么大,除非您的意思是 10^5?

    此外,每当您考虑提高性能时,都应该查看big O,在本例中为O(N),其中N 是您拥有的整数数。从具有 N 输入的算法的角度来看,通常您几乎无法改进这一点。也许如果我们在谈论流,你可以做一些统计,但除此之外,这个实现就像它得到的一样好。在其他一些情况下,虽然最坏的情况无法改善,但我们可以改善平均情况,我认为这里不适用。

    然后你应该看看分析代码。这样您就可以清楚地了解瓶颈在哪里。对于您的代码,可能没有太多可以合理完成的事情。

    如果我们试图尽可能提高性能,调整编译器标志可以带来一些性能提升。你应该研究这些,但我不会优先考虑这些。

    我还会改进您命名变量的方式,但这对性能没有影响。

    【讨论】:

    • 我明白你的意思,非常感谢你的帮助@nevets1219
    • 我已经更新了一些额外的细节(大 O 和分析)。
    猜你喜欢
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2011-12-17
    相关资源
    最近更新 更多