vp_t suggest(PhraseMap &pm, RMQ &st, std::string prefix, uint_t n = 16) { pvpi_t phrases = pm.query(prefix); // cerr<<"Got "<<phrases.second - phrases.first<<" candidate phrases from PhraseMap"<<endl; uint_t first = phrases.first - pm.repr.begin(); uint_t last = phrases.second - pm.repr.begin(); if (first == last) { return vp_t(); } vp_t ret; --last; pqpr_t heap; pui_t best = st.query_max(first, last); heap.push(PhraseRange(first, last, best.first, best.second)); while (ret.size() < n && !heap.empty()) { PhraseRange pr = heap.top(); heap.pop(); // cerr<<"Top phrase is at index: "<<pr.index<<endl; // cerr<<"And is: "<<pm.repr[pr.index].first<<endl; ret.push_back(pm.repr[pr.index]); uint_t lower = pr.first; uint_t upper = pr.index - 1; // Prevent underflow if (pr.index - 1 < pr.index && lower <= upper) { // cerr<<"[1] adding to heap: "<<lower<<", "<<upper<<", "<<best.first<<", "<<best.second<<endl; best = st.query_max(lower, upper); heap.push(PhraseRange(lower, upper, best.first, best.second)); } lower = pr.index + 1; upper = pr.last; // Prevent overflow if (pr.index + 1 > pr.index && lower <= upper) { // cerr<<"[2] adding to heap: "<<lower<<", "<<upper<<", "<<best.first<<", "<<best.second<<endl; best = st.query_max(lower, upper); heap.push(PhraseRange(lower, upper, best.first, best.second)); } } return ret; }
vp_t naive_suggest(PhraseMap& pm, RMQ& st, std::string prefix, uint_t n = 16) { pvpi_t phrases = pm.query(prefix); std::vector<uint_t> indexes; vp_t ret; while (phrases.first != phrases.second) { indexes.push_back(phrases.first - pm.repr.begin()); ++phrases.first; } while (ret.size() < n && !indexes.empty()) { uint_t mi = 0; for (size_t i = 1; i < indexes.size(); ++i) { if (pm.repr[indexes[i]].weight > pm.repr[indexes[mi]].weight) { mi = i; } } ret.push_back(pm.repr[indexes[mi]]); indexes.erase(indexes.begin() + mi); } return ret; }