加速C++中的算法
Speeding up algorithm in C++
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重新编写的代码。最初的任务是计算需要更改多少数字才能"平衡"输入,假设某个级别以上的每个级别的重量是较低的两倍
例如[1,2]需要1个变化(1->2或2->1)才能在两侧相等,[8,[4,2]]需要1个改变(2->4)才能使"较低级别"变为8,因此在较高级别上具有相等的权重。对于那些感兴趣的人,可以在这里找到问题:
问题链接
对于那些想知道的人来说,这是一份关于算法的学校作业,但我并没有寻求帮助,因为我已经用Java完成了它。问题是,当涉及到C++时,我的算法似乎很糟糕。
在Java中,我得到的时间大约是0.6秒,而在C++中,"相同"的代码给出的时间超过了2秒(超过了时间限制)。
有人想告诉我为什么会这样吗?我的印象是,当涉及到这些类型的问题时,C++应该比Java更快。
一个可能的原因是复制。
每当您在C++中按值传递某个内容时,就会创建一个副本。对于像double
、int
或指针这样的东西,这不是问题。
但是对于像std::string
这样的对象来说,复制可能是昂贵的。由于您不修改data
,因此通过常量引用传递它是有意义的:
int read(const string &data, int depth, int pos, vector<long>& wantedList)
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 读取最后一行代码算法 - c++ 时出现问题
- 括号更改 O(n) 算法
- std::unordered_map 搜索算法是如何实现的?
- 如何实现高效的算法来计算大型数据集的多个不同值?
- 如何在 Mac 上使用 c++17 并行标准库算法?