c++处理开销
C++ Processing Hog
我对c++非常陌生(对编程并不陌生),并且一直在处理Google Code Jam问题。我用Python(我最有经验的语言)和c++按照相同的算法正确地解决了这个问题(异形语言)。根据我的经验,c++比python要快得多,原因很明显;然而,我的python版本执行速度比我的c++版本快100倍。加工是限制因素。很明显我做错了什么,只是不知道是什么。在采取更详细的措施来找到资源消耗者之前,我想我应该在这里问一下,因为这似乎是一个非常简单的解决方案,让有c++经验的人指出我代码中的资源或方法效率低下。我正在运行unix环境。
我将把我的c++代码贴在下面。如果有人认为看到我的python代码可以帮助他们回答我的问题,我也很乐意把它贴出来。#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
int main ()
{
int L, D, N;
std::cin >> L;
std::cin >> D;
std::cin >> N;
std::cin.ignore();
std::string dictionary [D];
for (int i=0; i<D; i++) {
std::getline(std::cin, dictionary[i]);
}
for (int tt=1; tt<=N; tt++) {
std::cerr << tt << std::endl;
std::string case_word;
std::getline(std::cin, case_word);
int current_letter = 0;
std::vector <int> invalid_indexes;
while (case_word.length() > 0) {
std::vector <char> required_letters;
if (case_word[0] != '(') {
required_letters.push_back(case_word[0]);
case_word.erase(case_word.begin());
}
else {
std::string::iterator closing_parenthesis = std::find(case_word.begin(), case_word.end(), ')');
std::string::iterator p = case_word.begin()+1;
while (p != closing_parenthesis) {
required_letters.push_back(*(p++));
}
case_word.erase(case_word.begin(), closing_parenthesis+1);
}
for (int dictionary_word=0; dictionary_word<D; dictionary_word++) {
if (std::find(invalid_indexes.begin(), invalid_indexes.end(), dictionary_word) != invalid_indexes.end()) {
continue;
}
if (std::find(required_letters.begin(), required_letters.end(), dictionary[dictionary_word][current_letter]) == required_letters.end()) {
invalid_indexes.push_back(dictionary_word);
}
}
current_letter++;
}
std::cout << "Case #" << tt << ": " << D - invalid_indexes.size() << std::endl;
}
return 0;
}
这是我对你的代码的理解。可能有一些花哨的DFA可以从字典中构建,以完全加快算法的速度。这只是尝试用更好的数据结构来加速你的算法。
for (int tt=1; tt<=N; tt++) {
std::cerr << tt << std::endl;
std::string case_word;
std::getline(std::cin, case_word);
int current_letter = 0;
std::string::iterator i = case_word.begin();
将代码切换到迭代case_word
,以避免从前面擦除数据的开销。
std::tr1::unordered_set<int> invalid_indexes(D);
while (i != case_word.end()) {
std::tr1::unordered_set<char> required_letters(256);
使用无序集合以获得更高效的索引查找。(tr1
命名空间是因为我编译时没有启用c++ 11)。
if (*i != '(') {
required_letters.insert(*i);
++i;
}
else {
std::string::iterator closing_parenthesis
= std::find(i, case_word.end(), ')');
std::string::iterator p = i+1;
while (p != closing_parenthesis) {
required_letters.insert(*(p++));
}
i = closing_parenthesis+1;
}
for (int dictionary_word=0; dictionary_word<D; dictionary_word++) {
int index = dictionary_word;
if (invalid_indexes.find(index) != invalid_indexes.end()) {
continue;
}
char letter = dictionary[index][current_letter];
if (required_letters.find(letter) == required_letters.end()) {
invalid_indexes.insert(dictionary_word);
}
注意使用unordered_set
所得到的简化(和更快)的搜索。
}
current_letter++;
}
std::cout << "Case #" << tt
<< ": " << D - invalid_indexes.size()
<< std::endl;
}
相关文章:
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 实现无开销push_back的最佳方法是什么
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 以多态的方式处理非多态对象,不会产生性能开销
- c++处理开销