运行时间比较 - 类似的代码运行速度慢 4 倍
Comparison of running times - similar code runs 4 times slower
我正在解决回文分区问题,该问题需要返回给定字符串(http://oj.leetcode.com/problems/palindrome-partitioning/)的所有回文分区。我找到了这个问题的两个解决方案。我很难理解为什么这两种方法的运行时间存在巨大差异:
(假设bool isPal()
是一个给定的函数,它告诉给定的字符串是否在O(长度)时间内是回文)
第一个解决方案:(使用回溯):
void find(string s, int start, vector<string> &r, vector<vector<string> > &res){
if (start >= s.size()){
res.push_back(r);
}else{
for (int i=start;i<s.size();i++){
if (isPal(s.substr(start, i-start+1))){
r.push_back(s.substr(start,i-start+1));
find(s,i+1,r,res);
r.pop_back();
}
}
}
}
vector<vector<string>> partition(string s) {
vector<vector<string> > res;
vector<string> r;
find(s,0,r,res);
return res;
}
第二个解决方案:
vector<vector<string> > partition(string s) {
vector<vector<string> > answer;
if(s.size() == 0)
return answer;
// if s is Palindrome, push to answer
if(isPal(s))
answer.push_back(vector<string>(1,s));
if(s.size() == 1)
return answer;
for(int i=1; i<s.size(); ++i) {
string s1 = s.substr(0, i);
string s2 = s.substr(i, s.size()-i);
if(isPal(s1)) {
// get sub_answers of partition(s[i:])
vector<vector<string> > sub_answer = partition(s2);
// add s1 to the begin of sub_answers
for(int j=0; j<sub_answer.size(); ++j) {
sub_answer[j].insert(sub_answer[j].begin(), s1);
answer.push_back(sub_answer[j]);
}
}
}
return answer;
}
尽管两种解决方案具有相同的基本思想,但第一个解决方案的运行时间为 108 毫秒,而第二个解决方案需要 472 毫秒的时间。这是因为理论上效率低下(也许第二个解决方案多次解决单个问题)还是因为实施效率低下(一些C++概念)?请指出第二个解决方案效率低下的原因。
注意:两种解决方案都是正确的,并给出相同的结果。
我假设两个实现返回相同的结果?除此之外,还有几行值得评论:
sub_answer[j].insert(sub_answer[j].begin(), s1);
这迫使sub_answer[j]
的所有内容向后移动,以便为s1
留出空间。最好在添加其余部分之前将s1
添加到载体中。
answer.push_back(sub_answer[j]);
现在再次复制sub_answer[j]
。由于您不再需要sub_answer[j]
,因此您可以使用std::move
来交换所有权而不是复制:
answer.push_back(std::move(sub_answer[j]));
相关文章:
- Windows 7 应用程序在未聚焦时运行速度较慢
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- C++openssl SHA256运行速度比JDK SHA256实现慢
- 有人可以解释为什么使用 OpenMP 部分的运行速度比单个线程慢吗?
- 为什么这个简单的 C++ SIMD 基准测试在使用 SIMD 指令时运行速度较慢?
- 为什么C 运行速度比Python慢
- cl 生成的可执行文件在第一次运行时运行速度非常慢
- C++线程化的应用程序比非线程化的运行速度慢
- 几乎相同的代码运行速度要慢得多
- 对于非常接近零的值,双重计算运行速度要慢得多
- 相同的功能?使用 GMP(C++) 时运行速度慢约 10 倍
- 竞争性编程:解决方案运行速度太慢
- Windows 服务生成的进程的运行速度比 GUI 生成的进程慢 3 到 4 倍
- 运行时间比较 - 类似的代码运行速度慢 4 倍
- 在c++中重写这个python函数似乎会使其运行速度慢很多.这合理吗
- 在数组中查找最大元素OpenMP和PPL版本的运行速度比串行代码慢得多
- OpenMP并行代码运行速度较慢
- 基本的openmp程序运行速度较慢
- OpenGL可编程管道运行速度较慢
- 使用g++ 5.3.1编译的程序比使用g++ 4.8.4(相同的命令)编译的程序运行速度慢3倍