c++提升速度

首先,当你写了一份程序,可时间却慢如蜗牛,接下来这几个方法,让你速度直接起飞。

1.算法优化(适合新手,老手跳转到下一章2.)

一个程序的核心就是算法,当时间过长,需考虑换算法。

我举个例子:

题目 给出n个数和一个数k,问是否有一种方法,使这些数中其中两个数的和是k。

首先我们不难想打一个普通做法,直接暴力枚举,时间复杂度O(n*n)。

#include <bits/stdc++.h>
using namespace std;
int n,k,a[10],flag;
signed main(){
    cin>>n>>k;
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            if(a[i]+a[j]==k)flag=1;
    if(flag)cout<<"YES";
    else cout<<"NO";
	return 0;
}

对于n较大,无法解决。此时,由a[i]+a[j]=k转化成a[i]-k=a[j]。对于每个值,都求出相应与其和为k的另一个值。再用二分或set查询另一个值是否存在,时间复杂度O(nlogn)。当然,尺取法可以将时间复杂度继续降到O(n)。这就是所谓的“更换算法”,也是一种时间复杂度的优化。

2.代码优化

当你不知算法如何优化,可以去学学代码优化。

以下是几种代码优化方法:

(1).数组可以转化成vector, vector的时间比同等大小的数组时间上快了很多倍。当你定义一个命名为a,长度为100的数组。可以转换成如下形式。

int a[100];

转换成

vector<int> a(100);

同等效果。

(2).运算优化

位运算在时间上比一般的+-*/要快上许多倍。所以在需要以下技巧,当然还有很多,因为我能力有限,先介绍这些。

以下是两数交换代码(位运算版):

void swap(int &a,int &b){
    a^=b;
    b^=a;
    a^=b;
}

另外a*=2和a <<= 1有同等效果,但后者快上许多倍。同样a/=2与 a >>= 1也有同等效果,后者更快 

以上是代码如何优化。 

3.输入输出优化

如果你用的是cin和cout的输出。你可以在主函数开头加一句话:

ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);

效率甚至比scanf和printf还快。

如果这还不满足你的胃口。为你放上快读代码。原理是利用get/put char的极快速度,把一个整型变量转换成一堆字符进行输入,用getchar/putchar进行输入输出。

奉上代码:

int read(int &a){
    int x=0, w=1;
    char ch=0;
    while (ch<'0'||ch>'9') {
        if(ch=='-')w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=x*10+(ch-'0');
		ch=getchar();
    }
    a=x*w;
}
void write(int x) {
    static int sta[35];
    int top=0;
    do{
        sta[top++]=x%10,x/=10;
    }while(x);
    while(top)putchar(sta[--top]+48);
}

输入一个变量时,read(变量的名字)。输出一个变量时,write(变量的名字)。

以上就是博客的主要内用,感谢观看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值