用C ++加速算法

时间:2016-05-13 17:46:39

标签: c++ algorithm optimization

TL; DR:我的代码是"快速"在Java中,但在C ++中却很慢。为什么呢?

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>


using namespace std;

int read(string data, int depth, int pos, vector<long>& wantedList) {
    // 91 = [
    if (data.at(pos) == 91) {
        pos++;
        // Get first part
        pos = read(data, depth + 1, pos, wantedList);
        // Get second part
        pos = read(data, depth + 1, pos, wantedList);
    } else {
        // Get the weight
        long weight = 0;
        while (data.length() > pos && isdigit(data.at(pos))) {
            weight = 10 * weight + data.at(pos++) - 48;
        }
        weight *= 2 << depth;
        wantedList.push_back(weight);
    }
    return ++pos;
}


int doStuff(string data) {
    typedef map<long, int> Map;
    vector<long> wantedList;
    Map map;
    read(data, 0, 0, wantedList);
    for (long i : wantedList) {
        if (map.find(i) != map.end()) {
            map[i] = map[i] + 1;
        } else {
            map[i] = 1;
        }
    }

    vector<int> list;
    for (Map::iterator it = map.begin(); it != map.end(); ++it) {
        list.push_back(it->second);
    }
    sort(list.begin(), list.begin() + list.size());
    cout << wantedList.size() - list.back() << "\n";
    return 0;

}

int main() {
    string data;
    int i;
    cin >> i;
    for (int j = 0; j < i ; ++j) {
        cin >> data;
        doStuff(data);
    }
    return 0;
}

我刚刚尝试了我的第一个C ++项目,它是用Java重写的代码。 最初的任务是计算需要更改的数量,以便平衡&#34;输入,假设每个级别高于某个重量的两倍

例如[1,2]需要1次改变(1-> 2或2-> 1以便在两侧相等而且[8,[4,2]]需要1次改变(2) - &gt; 4)为了使&#34;较低等级&#34;变为8,因此在较高等级上具有相同的权重。这里的问题可以在那里找到感兴趣的人:

Problem link

对于那些想知道的人来说,这是关于算法的学校作业,但我并没有寻求帮助,因为我已经用Java完成了它。问题是我的算法在C ++方面似乎很糟糕。

在Java中,我的时间大约为0.6秒,而在C ++中,&#34;相同的&#34;代码给出> 2秒(超出时间限制)。

任何人都想给我一个指针,说明为什么会这样?我认为,当涉及到这些类型的问题时,C ++应该比Java更快。

1 个答案:

答案 0 :(得分:5)

可能的原因之一是复制。

每当您在C ++中按值传递某些内容时,都会创建一个副本。对于doubleint或指针等广告,这不是问题。

但对于像std::string这样的对象,复制可能会很昂贵。既然你没有修改data,那么通过const引用传递它是有意义的:

int read(const string &data, int depth, int pos, vector<long>& wantedList)