【问题标题】:Difference in iteration迭代差异
【发布时间】:2019-01-26 23:50:57
【问题描述】:

我试图从this competition 解决问题 D(阅读任务并不重要),我注意到这两个相同的代码在执行时间上略有不同:

map < string, vector <string> > G;

// Version 1
bool dfs(string s, string t) {
    if( s == t ) return true;

    for(int i = 0; i < int(G[s].size()); i++) {
        if( dfs( G[s][i], t ) ) return true;
    }
    return false;
}
// Version 2
bool dfs(string s, string t) {
    if( s == t ) return true;

    for(auto r: G[s]) {
        if( dfs( r, t ) ) return true;
    }
    return false;
}

特别是版本 1 在评估中获得 TLE,而不是版本 2 通过没有任何问题。根据this question,奇怪的是版本 1 更慢,并且在我的 PC 上使用最大的测试用例进行测试我得到了相同的执行时间......你能帮我吗?

【问题讨论】:

  • 版本 1 每次迭代执行两次查找 G[s]。版本 2 总共只执行一次。

标签: c++11 dictionary vector iteration


【解决方案1】:

在版本一中,您在 for 循环中有 int(G[s].size()),它在循环的每次迭代中调用变量的 size 函数。尝试在 for 循环之前创建一个变量来评估该 size 函数一次,并将其用于循环中的比较。这将比您当前拥有的版本 1 更快。

【讨论】:

  • 谢谢!我已经尝试过您的建议并被接受,但它仍然比版本 2 慢 0.2 秒左右
  • 是的,第 2 版迭代数组而不是对其进行索引,据我回忆,在某些情况下它会稍微快一些。但至少你知道版本 1 失败的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 2014-09-06
  • 2011-04-29
  • 2013-04-09
  • 2016-01-11
相关资源
最近更新 更多