cppjieba icon indicating copy to clipboard operation
cppjieba copied to clipboard

cppjieba动态规划部分代码有bug

Open rookie-J opened this issue 4 years ago • 2 comments

参考python版本计算动态规划的逻辑,将CalcDP函数的计算顺序改为从后往前就可以了。 可直接替换代码如下:

void CalcDP(vector<Dag>& dags) const { size_t dagSize = dags.size(); size_t nextPos; const DictUnit* p; double val;

  for(size_t i = 0; i < dagSize; i++){
      dags[dagSize - i - 1].pInfo = NULL;
      dags[dagSize - i - 1].weight = MIN_DOUBLE;
      assert(!dags[dagSize - i - 1].nexts.empty());
      for(LocalVector<pair<size_t, const DictUnit*> >::const_iterator it = dags[dagSize - i - 1].nexts.begin();
          it != dags[dagSize - i - 1].nexts.end(); it++) {
          nextPos = it->first;
          p = it->second;
          val = 0.0;
          if(nextPos + 1 < dags.size()) {
              val += dags[nextPos + 1].weight;
          }

          if(p) {
              val += p->weight;
          } else {
              val += dictTrie_->GetMinWeight();
          }
          if(val > dags[dagSize - i - 1].weight) {
              dags[dagSize - i - 1].pInfo = p;
              dags[dagSize - i - 1].weight = val;
          }
      }
  }

}

rookie-J avatar Jul 09 '21 07:07 rookie-J

解决的bug,能举例几个吗

moyu505 avatar Aug 03 '21 08:08 moyu505

作者本来用的就是从后往前遍历的逻辑(rbegin/rend) 见代码: https://github.com/yanyiwu/cppjieba/blob/master/include/cppjieba/MPSegment.hpp#L85

dawnranger avatar Oct 09 '22 08:10 dawnranger